как написать драйвер звуковой карты?

Тема в разделе "WASM.NT.KERNEL", создана пользователем booratino, 24 сен 2007.

  1. booratino

    booratino New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    11
    Всем привет.

    Загорелась берёста сделать драйвер для любимой звуковой карты Roland SCP55 (CardBus) для w2k/xp. Японцы сами делать не хотят, описания карты и исходников дров для win95 не дают.

    что у меня есть:

    - язык С почти не понимаю
    - описания карты и алгоритмов ее работы нет
    - есть VxD драйвер для Win95, дизассемблировал.. ... ничего не понял.
    - нашел DDK_XP и Driver Studio. Сгенерил рыбу, поправил INF. Оборудование определяется, драйвер ставится, ресурсы драйверу выделяются, конфликтов нет.

    теперь самое интересное: в рыбе надо заполнить пустые места, относящиеся к работе устройства. вот, например, процедура init из драйвера под BSD, написанного господином NONAKA Kimihiro (nonaka@netbsd.org), который на письма не отвечает:

    Код (Text):
    1. STATIC void rscp_init(struct rscp_softc *rsc)
    2. {
    3.     bus_space_tag_t iot = rsc->sc_pcioh.iot;
    4.     bus_space_handle_t ioh = rsc->sc_pcioh.ioh;
    5.  
    6.     /* Select mode2 */
    7.     rscp_wait_busy(iot, ioh);
    8.     rscp_write_reg(iot, ioh, SP_MISC_INFO, 0x80 | MODE2);
    9.  
    10.     /* Set GS volume */
    11.     rscp_wait_busy(iot, ioh);
    12.     rscp_write_reg(iot, ioh, SP_LEFT_AUX1_CONTROL, GAIN_12);
    13.     rscp_write_reg(iot, ioh, SP_RIGHT_AUX1_CONTROL, GAIN_12);
    14.     rscp_write_reg(iot, ioh, CS_LEFT_LINE_CONTROL, GAIN_12);
    15.     rscp_write_reg(iot, ioh, CS_RIGHT_LINE_CONTROL, GAIN_12);
    16. }
    17.  
    18. где
    19.  
    20. STATIC void rscp_write_reg(bus_space_tag_t iot, bus_space_handle_t ioh, bus_size_t idx, u_int8_t regv)
    21. {
    22.     bus_space_write_1(iot, ioh, RSCP_AD1848_IADDR, idx);
    23.     bus_space_write_1(iot, ioh, RSCP_AD1848_IDATA, regv);
    24. }
    25.  
    26. ...
    27.  
    28. #define RSCP_MPU_DATA       0
    29. #define RSCP_MPU_COMMAND    1
    30. #define RSCP_MPU_STATUS     1
    31. #define RSCP_AD1848_STATUS  6
    32. #define RSCP_AD1848_PIO     7
    33. #define RSCP_AD1848_IADDR   8
    34. #define RSCP_AD1848_IDATA   9
    35. #define RSCP_NREGS      12
    36.  
    37.  
    38. #define GAIN_12         0x08
    39.  
    40. /* AD1848 Sound Port reg defines */
    41. #define SP_LEFT_AUX1_CONTROL    2
    42. #define SP_RIGHT_AUX1_CONTROL   3
    43.  
    44. struct rscp_softc {
    45.     struct device sc_dev;           /* generic device glue */
    46.     struct pcmcia_function *sc_pf;      /* our PCMCIA function */
    47.     void *sc_ih;                /* interrupt handle */
    48.     struct pcmcia_io_handle sc_pcioh;   /* PCMCIA i/o space info */
    49.     int sc_io_window;           /* our i/o window */
    50.     struct device *sc_mpu;
    51.     void (*sc_mpu_activate)(struct rscp_softc *, int);
    52.     struct device *sc_pcm;
    53.     void (*sc_pcm_activate)(struct rscp_softc *, int);
    54.     u_int8_t sc_regs[RSCP_NREGS];
    55.     u_int8_t sc_irr;
    56. #define     RSCP_ICR    0x0a    /* interrupt line control */
    57. #define     ICR_MPU     0x01    /* mpu intr enable */
    58. #define     ICR_PCM     0x04    /* pcm intr enable */
    59.     int sc_flags;
    60. #define     RSCP_MPU_ENABLED    (1 << 0)
    61. #define     RSCP_PCM_ENABLED    (1 << 1)
    62. };
    т.е. как я понимаю... в БСД общение с картой идет не через порты, а через шину PCMCIA? это можно предположить, разглядывая вызовы bus_space_write_1.... и почему адрес такой странный... RSCP_AD1848_IADDR = 8? не мало? может где-то база какая-то есть? а в w2k как я должен карту инициализировать? допустим мне система выделила порты 330-33B. может к 330 надо прибавить 8 (RSCP_AD1848_IADDR) и получить номер порта, через который я выбираю внутренние регистры, типа SP_LEFT_AUX1_CONTROL и, соответственно, в 330 + 9 кладу их значения? и вообще, как pnp менеджер узнал, какие ресурсы нужны моей карте? неужели шина сама с картой договорилась? и что они всё время упоминают какого-то AD1848? это там чип такой? а почему в диспетчере устройств запись о карте появилась, а в control panel/звуки и аудио устройсва/ayдио/воспр.звука нельзя выбрать эту карту по умолчанию? может в реестр надо вносить что-то со словами wave, midi и mixer? а как программы будут к этой карте обращаться? что-то мне подсказывает, что они сами не будут рассчитывать дискретизацию и слать побайтно в порты, а кинут мне буфер, а я должен буду сам всё рассчитывать? а как они мне этот буфер кинут? через сообщения IRP_MJ_READ/WRITE? и где обо всём этом можно членораздельно почитать?

    спасибо.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    туго будет.

    Почитать надо сначала про VxD (т.к. тебе надо его дизасмить полюбому), про драйвера под NT, про работу с устройствами.
     
  3. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.551
    Адрес:
    Russia
    booratino
    Исследовать драйвер под Линукс и скачать книгу Walter Oney . По программированию WDM драйверов.
     
  4. booratino

    booratino New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    11
    да, это всё понятно... книги уже неделю читаю... представление о wdm драйвере поимел..

    но появился ряд вопросов. .. . а спросить не у кого...

    вот например никак не могу понять, что надо в driver.inf написать, чтобы зарегистрировать устройство как waveform output device... чтобы его можно было найти через waveOutGetDevCaps.... если это вообще делается через .inf файл.
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.551
    Адрес:
    Russia
    booratino
    По идее через инф и делается глянь сорцы. Видел в WDK сэмпл на AC97 (WinDDK\6000\src\audio\ac97\driver\) там пример инф файла, может подойдет.
     
  6. booratino

    booratino New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    11
    с него я и начал... три дня назад. :) если еще б объяснялось что там понатыкано... :dntknw:(


    вот например, зачем они еще и этих инсталят к каждой карте?

    Include=ks.inf, wdmaudio.inf
    Needs=KS.Registration, WDMAUDIO.Registration

    и вообще, мне кажется, что не в этом файле регистрятся для waveOutGetDevCaps, а, может быть, при получении IRP_MN_START_DEVICE надо что-нибудь вызвать?
     
  7. booratino

    booratino New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    11
    да, похоже так оно и есть. в inf файле только создаются ключи в реестре, а при старте драйвер их читает и вызывает кучу InstallSubdevice.

    DriverStudio, конечно, сделала хорошую, рабочую "рыбу", но мне видать придётся делать из ac97 драйвера. :dntknw:
     
  8. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    booratino, а вообще чем сильна данная карта Roland SCP55 (CardBus)?

    Если midi, то! прежде чем заморачиваться с дровиной (особенно WDM), лучше сперва отьюзать из обычного приложения (а не из ядреного уровня!), открыв в него доступ к портам через giveio, например. Подобным макаром получалось проигрывать PSG файлы (типа adlib), юзая OPL FM синтез, консольной Win32 прогой на тоже хорошей AWE64. :)
     
  9. booratino

    booratino New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    11
    bugaga, это единственная pcmcia карта с полноценным синтезатором. была б альтернатива - давно б купил другую. а приличного софтверного синтезатора я не слышал :dntknw:

    не уверен, что секвенсер типа Encore станет работать с картой через порты.

    я ее аккуратненько вскрыл... там стоит обычный церроз cs4231a-kq. даташит на него есть. ковыряюсь... но это, если разберусь, будет только D2A playback. как быть с wavetable - хз. говорят, что она должна работать как mpu-401.

    кстати про церроз.. в даташите про него говорится, что ему надо всего 4 порта. а мне в ресурсах выдают 12 + 1. ?? зачем так много? вот например 330-33B и отдельностоящий 201. кто из них к чему относится? есть подозрение, что для cs4231 используются 338-33B. а остальные? и как в звуке используется irq? мне б книжку умную.. .. .
     
  10. bugaga

    bugaga New Member

    Публикаций:
    0
    Регистрация:
    1 июл 2007
    Сообщения:
    361
    booratino"цитрус cs4231a-kq" говоришь? Да уж... Помниться этот АЦП/ЦАП стоял еще на ISA картах образца эдак 1992г. Относиться он как раз к WaveIn/WaveOUT,и в более позних картах, подобную ф-кцию выполняет AC97 чип, совмещая такжеф-кцию микшера.
    Лучше забить на WaveOUT/Wavein, ибо на начальном этапе лучше не парить себе моск, с этими irq/dma, и что это такое на WDM уровне ядра...
    Если mpu-401, то это намного упрощает тему, ибо там один-пара портов (irq в нем используеться для примема с миди-клавы и на его обработку, тож забить). Лучше в винде9х, на которой ПАШУТ драйвера, попробывать засылать в этот порт random-ные значения, и проверить оно ли это.. Вобщем вынюхать эти порты, представляя четкое положение вещей...
    хм.. помню прикалывался, использовал фейк-драйвер Sonic-midi-Router и прогу Cakewalk.. Он засылал в него миди команды (note-on/off и т.п), а консольная прога получала их после чего пересылала в подготовленом виде, напрямую в порты OPL синтеза. Так что, можно обойтись и без WDM...
     
  11. booratino

    booratino New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    11
    апупея продолжается....

    слегка разобрался с сорцами ac97 из WinDDK\6000\src\audio\ac97

    появился миксер под мою карту.

    там есть такая структура

    Код (Text):
    1. typedef struct
    2. {
    3.     struct      // For nodes.
    4.     {
    5.         BOOL    bNodeConfig;
    6.     } Nodes[NODEC_TOP_ELEMENT];
    7.  
    8.     struct      // For pins.
    9.     {
    10.         BOOL    bPinConfig;
    11.         PWCHAR  sRegistryName;
    12.     } Pins[PINC_TOP_ELEMENT];
    13.  
    14. } tHardwareConfig;
    15.  
    16. где
    17.  
    18. enum TopoPinConfig
    19. {
    20.     PINC_PCBEEP_PRESENT = 0,
    21.     PINC_PHONE_PRESENT,
    22.     PINC_MIC2_PRESENT,
    23.     PINC_VIDEO_PRESENT,
    24.     PINC_AUX_PRESENT,
    25.     PINC_HPOUT_PRESENT,
    26.     PINC_MONOOUT_PRESENT,
    27.     PINC_MICIN_PRESENT,
    28.     PINC_MIC_PRESENT,
    29.     PINC_LINEIN_PRESENT,
    30.     PINC_CD_PRESENT,
    31.     PINC_SURROUND_PRESENT,
    32.     PINC_CENTER_LFE_PRESENT,
    33.     PINC_TOP_ELEMENT            // number of PINC's
    34. };
    35.  
    36. enum TopoNodeConfig
    37. {
    38.     NODEC_3D_PRESENT = 0,
    39.     NODEC_TONE_PRESENT,
    40.     NODEC_LOUDNESS_PRESENT,
    41.     NODEC_SIMUL_STEREO_PRESENT,
    42.     NODEC_6BIT_MASTER_VOLUME,
    43.     NODEC_6BIT_HPOUT_VOLUME,
    44.     NODEC_6BIT_MONOOUT_VOLUME,
    45.     NODEC_6BIT_SURROUND_VOLUME,
    46.     NODEC_6BIT_CENTER_LFE_VOLUME,
    47.     NODEC_3D_CENTER_ADJUSTABLE,
    48.     NODEC_3D_DEPTH_ADJUSTABLE,
    49.     NODEC_PCM_VARIABLERATE_SUPPORTED,
    50.     NODEC_PCM_VSR_INDEPENDENT_RATES,
    51.     NODEC_PCM_DOUBLERATE_SUPPORTED,
    52.     NODEC_MIC_VARIABLERATE_SUPPORTED,
    53.     NODEC_CENTER_DAC_PRESENT,
    54.     NODEC_SURROUND_DAC_PRESENT,
    55.     NODEC_LFE_DAC_PRESENT,
    56.     NODEC_TOP_ELEMENT           // number of NODES's
    57. };
    если в процедуре probeHWconfig (common.cpp) в неё сделать SetPinConfig (PINC_AUX_PRESENT,TRUE); , то в миксере появится регулятор громкости для AUX.

    НО!! даже если всю таблицу поставить в FALSE, в миксере будут 4 регулятора: Volume Control (master), wave, SW Synth и CD Player.

    и если я двигаю регуляторы wave, sw synth и cd, то вызывается процедура PropertyHandler_OnOff (prophnd.cpp) с NodeDef == NODE_MASTEROUT_MUTE... как если я нажму mute на master volume... т.е. как я понимаю.. . что-то тут не так.

    а как мне вообще выкинуть регулятор громкости CD?

    и объясните мне тупому человеческим языком, что такое topology, pin и node?
     
  12. Petr33

    Petr33 New Member

    Публикаций:
    0
    Регистрация:
    4 ноя 2007
    Сообщения:
    1
    У меня такая же карта, и то же стремление найти драйвера для XP.
    Спасибо, что занялись этим. Но я вообще не умею программировать.
    Если можно, прислать мне на e-mail: piotr1@narod.ru
    драйвера вместе с теми, вами созданными.
    Всего наилучшего!
    С уважением, Пётр
     
  13. booratino

    booratino New Member

    Публикаций:
    0
    Регистрация:
    11 май 2007
    Сообщения:
    11
    я бросил эту затею. сделать дуалбут w98/xp намного проще. если найдешь описание принципов построения драйверов звуковых карт.. .. присылай, могу доделать. я так и не понял кто создает миксер и как ему сказать что мне надо.