Всем привет. Загорелась берёста сделать драйвер для любимой звуковой карты Roland SCP55 (CardBus) для w2k/xp. Японцы сами делать не хотят, описания карты и исходников дров для win95 не дают. что у меня есть: - язык С почти не понимаю - описания карты и алгоритмов ее работы нет - есть VxD драйвер для Win95, дизассемблировал.. ... ничего не понял. - нашел DDK_XP и Driver Studio. Сгенерил рыбу, поправил INF. Оборудование определяется, драйвер ставится, ресурсы драйверу выделяются, конфликтов нет. теперь самое интересное: в рыбе надо заполнить пустые места, относящиеся к работе устройства. вот, например, процедура init из драйвера под BSD, написанного господином NONAKA Kimihiro (nonaka@netbsd.org), который на письма не отвечает: Код (Text): STATIC void rscp_init(struct rscp_softc *rsc) { bus_space_tag_t iot = rsc->sc_pcioh.iot; bus_space_handle_t ioh = rsc->sc_pcioh.ioh; /* Select mode2 */ rscp_wait_busy(iot, ioh); rscp_write_reg(iot, ioh, SP_MISC_INFO, 0x80 | MODE2); /* Set GS volume */ rscp_wait_busy(iot, ioh); rscp_write_reg(iot, ioh, SP_LEFT_AUX1_CONTROL, GAIN_12); rscp_write_reg(iot, ioh, SP_RIGHT_AUX1_CONTROL, GAIN_12); rscp_write_reg(iot, ioh, CS_LEFT_LINE_CONTROL, GAIN_12); rscp_write_reg(iot, ioh, CS_RIGHT_LINE_CONTROL, GAIN_12); } где STATIC void rscp_write_reg(bus_space_tag_t iot, bus_space_handle_t ioh, bus_size_t idx, u_int8_t regv) { bus_space_write_1(iot, ioh, RSCP_AD1848_IADDR, idx); bus_space_write_1(iot, ioh, RSCP_AD1848_IDATA, regv); } ... #define RSCP_MPU_DATA 0 #define RSCP_MPU_COMMAND 1 #define RSCP_MPU_STATUS 1 #define RSCP_AD1848_STATUS 6 #define RSCP_AD1848_PIO 7 #define RSCP_AD1848_IADDR 8 #define RSCP_AD1848_IDATA 9 #define RSCP_NREGS 12 #define GAIN_12 0x08 /* AD1848 Sound Port reg defines */ #define SP_LEFT_AUX1_CONTROL 2 #define SP_RIGHT_AUX1_CONTROL 3 struct rscp_softc { struct device sc_dev; /* generic device glue */ struct pcmcia_function *sc_pf; /* our PCMCIA function */ void *sc_ih; /* interrupt handle */ struct pcmcia_io_handle sc_pcioh; /* PCMCIA i/o space info */ int sc_io_window; /* our i/o window */ struct device *sc_mpu; void (*sc_mpu_activate)(struct rscp_softc *, int); struct device *sc_pcm; void (*sc_pcm_activate)(struct rscp_softc *, int); u_int8_t sc_regs[RSCP_NREGS]; u_int8_t sc_irr; #define RSCP_ICR 0x0a /* interrupt line control */ #define ICR_MPU 0x01 /* mpu intr enable */ #define ICR_PCM 0x04 /* pcm intr enable */ int sc_flags; #define RSCP_MPU_ENABLED (1 << 0) #define RSCP_PCM_ENABLED (1 << 1) }; т.е. как я понимаю... в БСД общение с картой идет не через порты, а через шину 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? и где обо всём этом можно членораздельно почитать? спасибо.
туго будет. Почитать надо сначала про VxD (т.к. тебе надо его дизасмить полюбому), про драйвера под NT, про работу с устройствами.
booratino Исследовать драйвер под Линукс и скачать книгу Walter Oney . По программированию WDM драйверов.
да, это всё понятно... книги уже неделю читаю... представление о wdm драйвере поимел.. но появился ряд вопросов. .. . а спросить не у кого... вот например никак не могу понять, что надо в driver.inf написать, чтобы зарегистрировать устройство как waveform output device... чтобы его можно было найти через waveOutGetDevCaps.... если это вообще делается через .inf файл.
booratino По идее через инф и делается глянь сорцы. Видел в WDK сэмпл на AC97 (WinDDK\6000\src\audio\ac97\driver\) там пример инф файла, может подойдет.
с него я и начал... три дня назад. если еще б объяснялось что там понатыкано... ( вот например, зачем они еще и этих инсталят к каждой карте? Include=ks.inf, wdmaudio.inf Needs=KS.Registration, WDMAUDIO.Registration и вообще, мне кажется, что не в этом файле регистрятся для waveOutGetDevCaps, а, может быть, при получении IRP_MN_START_DEVICE надо что-нибудь вызвать?
да, похоже так оно и есть. в inf файле только создаются ключи в реестре, а при старте драйвер их читает и вызывает кучу InstallSubdevice. DriverStudio, конечно, сделала хорошую, рабочую "рыбу", но мне видать придётся делать из ac97 драйвера.
booratino, а вообще чем сильна данная карта Roland SCP55 (CardBus)? Если midi, то! прежде чем заморачиваться с дровиной (особенно WDM), лучше сперва отьюзать из обычного приложения (а не из ядреного уровня!), открыв в него доступ к портам через giveio, например. Подобным макаром получалось проигрывать PSG файлы (типа adlib), юзая OPL FM синтез, консольной Win32 прогой на тоже хорошей AWE64.
bugaga, это единственная pcmcia карта с полноценным синтезатором. была б альтернатива - давно б купил другую. а приличного софтверного синтезатора я не слышал не уверен, что секвенсер типа Encore станет работать с картой через порты. я ее аккуратненько вскрыл... там стоит обычный церроз cs4231a-kq. даташит на него есть. ковыряюсь... но это, если разберусь, будет только D2A playback. как быть с wavetable - хз. говорят, что она должна работать как mpu-401. кстати про церроз.. в даташите про него говорится, что ему надо всего 4 порта. а мне в ресурсах выдают 12 + 1. ?? зачем так много? вот например 330-33B и отдельностоящий 201. кто из них к чему относится? есть подозрение, что для cs4231 используются 338-33B. а остальные? и как в звуке используется irq? мне б книжку умную.. .. .
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...
апупея продолжается.... слегка разобрался с сорцами ac97 из WinDDK\6000\src\audio\ac97 появился миксер под мою карту. там есть такая структура Код (Text): typedef struct { struct // For nodes. { BOOL bNodeConfig; } Nodes[NODEC_TOP_ELEMENT]; struct // For pins. { BOOL bPinConfig; PWCHAR sRegistryName; } Pins[PINC_TOP_ELEMENT]; } tHardwareConfig; где enum TopoPinConfig { PINC_PCBEEP_PRESENT = 0, PINC_PHONE_PRESENT, PINC_MIC2_PRESENT, PINC_VIDEO_PRESENT, PINC_AUX_PRESENT, PINC_HPOUT_PRESENT, PINC_MONOOUT_PRESENT, PINC_MICIN_PRESENT, PINC_MIC_PRESENT, PINC_LINEIN_PRESENT, PINC_CD_PRESENT, PINC_SURROUND_PRESENT, PINC_CENTER_LFE_PRESENT, PINC_TOP_ELEMENT // number of PINC's }; enum TopoNodeConfig { NODEC_3D_PRESENT = 0, NODEC_TONE_PRESENT, NODEC_LOUDNESS_PRESENT, NODEC_SIMUL_STEREO_PRESENT, NODEC_6BIT_MASTER_VOLUME, NODEC_6BIT_HPOUT_VOLUME, NODEC_6BIT_MONOOUT_VOLUME, NODEC_6BIT_SURROUND_VOLUME, NODEC_6BIT_CENTER_LFE_VOLUME, NODEC_3D_CENTER_ADJUSTABLE, NODEC_3D_DEPTH_ADJUSTABLE, NODEC_PCM_VARIABLERATE_SUPPORTED, NODEC_PCM_VSR_INDEPENDENT_RATES, NODEC_PCM_DOUBLERATE_SUPPORTED, NODEC_MIC_VARIABLERATE_SUPPORTED, NODEC_CENTER_DAC_PRESENT, NODEC_SURROUND_DAC_PRESENT, NODEC_LFE_DAC_PRESENT, NODEC_TOP_ELEMENT // number of NODES's }; если в процедуре 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?
У меня такая же карта, и то же стремление найти драйвера для XP. Спасибо, что занялись этим. Но я вообще не умею программировать. Если можно, прислать мне на e-mail: piotr1@narod.ru драйвера вместе с теми, вами созданными. Всего наилучшего! С уважением, Пётр
я бросил эту затею. сделать дуалбут w98/xp намного проще. если найдешь описание принципов построения драйверов звуковых карт.. .. присылай, могу доделать. я так и не понял кто создает миксер и как ему сказать что мне надо.