Драйвер HD Audio
От: zand  
Дата: 31.10.13 06:58
Оценка:
Здравствуйте, уважаемые!

Пытаюсь написать драйвер для собственного аудио-адаптера, на котором установлен кодек HDAudio.
В общих чертах, нужен простой WaveRT драйвер с одним лишь wave out интерфейсом, но...

Процесс остановился в самом начале. Создал примитивный WDM "драйвер", где всего лишь три функции.

#pragma code_seg("PAGE")
NTSTATUS StartDevice(
    IN  PDEVICE_OBJECT  DeviceObject,   // Device object.
    IN  PIRP            Irp,            // IO request packet.
    IN  PRESOURCELIST   ResourceList    // List of hardware resources.
)
{
    PAGED_CODE ();

    ASSERT (DeviceObject);
    ASSERT (Irp);
    ASSERT (ResourceList);

    NTSTATUS ntStatus = STATUS_SUCCESS;
    DOUT (DBG_PRINT, ("[StartDevice] Resources count: %d"
        , ResourceList->NumberOfEntries()));

    return ntStatus;
}

#pragma warning(disable:28152)
#pragma code_seg("PAGE")
NTSTATUS AddDevice(IN PDRIVER_OBJECT   DriverObject, IN PDEVICE_OBJECT   PhysicalDeviceObject)
{
    PAGED_CODE ();
    DOUT (DBG_PRINT, ("[AddDevice]"));
    // Tell portcls (the class driver) to add the device.
    return PcAddAdapterDevice (DriverObject,
                               PhysicalDeviceObject,
                               (PCPFNSTARTDEVICE)StartDevice,
                               MAX_MINIPORTS,
                               0);
}

#pragma code_seg("INIT")
extern "C" DRIVER_INITIALIZE DriverEntry;
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPathName)
{
    PAGED_CODE ();
    DOUT (DBG_PRINT, ("[DriverEntry]"));

    // Tell the class driver to initialize the driver.
    NTSTATUS RetValue = PcInitializeAdapterDriver (DriverObject,
                                          RegistryPathName,
                                          (PDRIVER_ADD_DEVICE)AddDevice);
    return RetValue;
}


Набросал к нему простенький INF-файл, в котором в качестве железяки указал аудио-устройство из VirtualBox.
Ну и попытался запустить. Запускается и появляется в списке устройств, однако, ResourceList->NumberOfEntries() == 0!
Вот, собственно, и всё! Дальнейшая разработка невозможна, т.к. без ресурсов я не могу получить доступ к регистрам шины и кодека.

Люди добрые, помогите кто сталкивался?! Почему такое может быть? Примеры рабочих (реальных) INF-файлов изрыл вдоль и поперек.
На их основе написал свой, который, на мой взгляд, должен быть достаточен для запуска — ан нет. Гугол молчит по теме, что не удивительно.
Не знаю даже в какую сторону начать копать. В общем, нужна помощь.

Спасибо!
Re: Драйвер HD Audio
От: zand  
Дата: 31.10.13 07:02
Оценка:
Пардон, забыл INF-файл

[Version]
Signature="$WINDOWS NT$"
Class=MEDIA
ClassGUID={4d36e96c-e325-11ce-bfc1-08002be10318}
Provider=%ProviderName%
DriverVer=02/22/2007,6.00.6000.1
CatalogFile=TestDriver.cat

[DestinationDirs]
DefaultDestDir = 12


[SourceDisksNames]
1 = %DiskName%,,,""

[SourceDisksFiles]
TestDriver.sys = 1
TestDriver.inf = 1
TestDriver.pdb = 1

[Manufacturer]
%ManufacturerName%=KBT,NTAMD64

[KBT.NTAMD64]
%KBT.DeviceDesc% = KBTDriver, HDAUDIO\FUNC_01&VEN_8384&DEV_7680&SUBSYS_83847680&REV_1034

[KBTDriver.NTAMD64]
Include=ks.inf,wdmaudio.inf
Needs=KS.Registration,WDMAUDIO.Registration
CopyFiles = KBTDriver.CopyList
AddReg    = KBTCommon.AddReg, KBTDriver.AddReg

[KBTDriver.CopyList]
TestDriver.sys
TestDriver.inf
TestDriver.pdb

[KBTDriver.AddReg]
HKR,,Driver,,TestDriver.sys

[KBTCommon.AddReg]
HKR,Drivers,SubClasses,,"wave"
HKR,,SetupPreferredAudioDevices,3,01,00,00,00
HKR,Drivers\wave\wdmaud.drv,Driver,,wdmaud.drv

HKR,Drivers\wave\wdmaud.drv,Description,,%KBTDeviceDescription%

; Registry key to enable waveRT by default
HKR,GlobalSettings,EnableWaveRT,1,01,00,00,00
HKR,PowerSettings,ConservationIdleTime,1,1e,00,00,0     ; 10 seconds for idle power management when on battery
HKR,PowerSettings,PerformanceIdleTime,1,00,00,00,00     ; Not doing idle power management when on AC power
HKR,PowerSettings,IdlePowerState,1,03,00,00,00          ; go to D3 for idle power management

;[KBTDriver.ntamd64.Services]
;AddService=KBTDriverAddService, 0x00000002, KBTDriver_Service_Install

;[KBTDriver_Service_Install]
;DisplayName   = %KBTFunctionDriverForHdAudio.SvcDesc%
;ServiceType   = 1
;StartType     = 3
;ErrorControl  = 1
;ServiceBinary = %12%\TestDriver.sys


[KBTDriver.ntamd64.Interfaces];
; Primary line out interfaces.
;
AddInterface=%KSCATEGORY_AUDIO%,%KSNAME_eLineOutWave%, KBTDriver.PrimaryLineOutWave
AddInterface=%KSCATEGORY_RENDER%,%KSNAME_eLineOutWave%, KBTDriver.PrimaryLineOutWave
AddInterface=%KSCATEGORY_REALTIME%,%KSNAME_eLineOutWave%, KBTDriver.PrimaryLineOutWave
AddInterface=%KSCATEGORY_AUDIO%,%KSNAME_eLineOutTopo%, KBTDriver.PrimaryLineOutTopo
AddInterface=%KSCATEGORY_TOPOLOGY%,%KSNAME_eLineOutTopo%, KBTDriver.PrimaryLineOutTopo

;
; Primary line out Model and AddRegs.
;
[KBTDriver.PrimaryLineOutWave]
AddReg = KBTDriver.PrimaryLineOutWave.AddReg

[KBTDriver.PrimaryLineOutWave.AddReg]
HKR,,FriendlyName,,%PrimarySpeakerWaveDeviceName%
HKR,,CLSID,,%Proxy.CLSID%

[KBTDriver.PrimaryLineOutTopo]
AddReg = KBTDriver.PrimaryLineOutTopo.AddReg

[KBTDriver.PrimaryLineOutTopo.AddReg]
HKR,,FriendlyName,,%PrimarySpeakerTopoDeviceName%
HKR,,CLSID,,%Proxy.CLSID%

;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
;
;
[Strings]

ClassName=""
DiskName="TestDriver Source Disk"

;
; KSCategory Guids
; 
KSCATEGORY_AUDIO = "{6994AD04-93EF-11D0-A3CC-00A0C9223196}"    ; non-localizable
KSCATEGORY_RENDER = "{65E8773E-8F56-11D0-A3B9-00A0C9223196}"   ; non-localizable
KSCATEGORY_CAPTURE = "{65E8773D-8F56-11D0-A3B9-00A0C9223196}"  ; non-localizable
KSCATEGORY_TOPOLOGY = "{DDA54A40-1E4C-11D1-A050-405705C10000}" ; non-localizable
KSCATEGORY_REALTIME = "{EB115FFC-10C8-4964-831D-6DCB02E6F23F}" ; non-localizable
Proxy.CLSID = "{17CCA71B-ECD7-11D0-B908-00A0C9223196}"         ; non-localizable

; These are the strings passed to PcRegisterSubdevice for wave ports
KSNAME_eLineOutWave = "KBTLineOutWave"   ; non-localizable
KSNAME_eLineOutTopo = "KBTLineOutTopo"   ; non-localizable
Re: Драйвер HD Audio
От: tchunya  
Дата: 01.11.13 12:25
Оценка:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff547012(v=vs.85).aspx
Re[2]: Драйвер HD Audio
От: zand  
Дата: 01.11.13 13:26
Оценка:
Здравствуйте, tchunya, Вы писали:

T>http://msdn.microsoft.com/en-us/library/windows/hardware/ff547012(v=vs.85).aspx


Спасибо за отклик!
Сам виноват, не полностью раскрыл вопрос. Я пытаюсь написать WaveRT драйвер на основе стандартного PortCls драйвера.
По описанию в MSDN, этот PortCls должен делать всю "грязную" работу, такую как голая обработка IRP. В своем драйвере
верхнего уровня я, по идее, вообще не имею дела с IPR. Единственная функция, вызываемая ядром — это StartDevice.
В нее PortCls передает уже готовый список ресурсов...ну, должен передавать, а не передает. Вот я и не могу понять в чем дело.
Все примеры драйверов аудио адаптеров первым делом проверяют этот список на наличие в нем элементов, но нигде не сказано, что
я сам должен как-то искусственно подталкивать систему мне эти ресурсы предоставлять. Как я понимаю, если есть железяка, вставленная в шину PCI-E,
то у нее есть и ресурсы в виде прерываний, портов и каналов DMA, которые ей система выделяет автоматически. Но их нет!!

Попробую обрисовать проблему с другой стороны. Есть новый аудио-кодек от C-Media — CMI8888.
Работает с PCI-E и имеет полную совместимость с Intel HDAudio Specification и MS UAA Specification.
В том числе имеется поддержка 32бита на семпл. Это ключевой момент. Мы запаяли железяку на основе этого кодека. Воткнули её в комп в надежде на то, что
Microsoft "Universal" HDAudio Driver ее увидит. Он увидел, ага. Только максимальный размер семпла он предоставляет 24бита. Все, приехали.

Насколько я понимаю, это часть политики этой компании — не делать ничего лишнего, вдруг людям понравится. Хотя их драйвер, по описанию, полностью соотвествует
Intel HDA Specification, а спецификация допускает 32бита/семпл.

В общем, вот такая грустная история. Единственный пока выход, на мой взгляд, это написать собственный драйвер. А он писаться не хотит.

Кстати, на основе этого кодека на данный момент есть только одна аудио-плата ASUS RoG Xonar Phoebus.
Но, как в можете догадаться, в их драйверах тоже нет поддержки 32бита...

Куда купать и что делать не понятно абсолютно, я уже тонну доков перерыл — тишина.
Re[3]: Драйвер HD Audio
От: ononim  
Дата: 02.11.13 17:11
Оценка:
Напишите нативный ASIO драйвер для этого кодека. Этож каков шухер то будет — какой то там кодек вдруг имеет свой ASIO
А остальным и 24 бита/сэмпл хватит
Как много веселых ребят, и все делают велосипед...
Re: Драйвер HD Audio
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.11.13 16:50
Оценка:
Здравствуйте, zand, Вы писали:

Z>Запускается и появляется в списке устройств, однако, ResourceList->NumberOfEntries() == 0!


Попробуйте сравнить с драйвером AC'97, который есть в примерах WDK/DDK. Собрать тот же пример, запустить его под VBox, отследить работу с ресурсами.
Re[2]: Драйвер HD Audio
От: zand  
Дата: 30.11.13 16:21
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, zand, Вы писали:


Z>>Запускается и появляется в списке устройств, однако, ResourceList->NumberOfEntries() == 0!


ЕМ>Попробуйте сравнить с драйвером AC'97, который есть в примерах WDK/DDK. Собрать тот же пример, запустить его под VBox, отследить работу с ресурсами.


Спасибо за совет. В общем-то, это и было сделано в первую голову. Проблема в том, что система (portcls драйвер) НЕ выделяет ресурсы.
Впрочем, с этой проблемой я разобрался. Если кому интересно, технология HDAudio+UAA не подразумевает ВООБЩЕ работу с ресурсами, типа прерываний и DMA, напрямую.
Микрософт предлагает высокоуровневый интерфейс HDAUDIO_BUS_INTERFACE_V2, который реализован в драйвере hdaudio.sys — это еще одна прослойка между вашим function driver и portcls driver.

Информации об этом не сыщешь днём с огнём, всё приходится выцарапывать из разных непотребных мест...миксрософт он такой микрософт.
Они, мол, написали супер-пупер универсальный драйвер (чего быть не может по определению), который держит все спецификации.
И если производитель железяки всё сделает аккуратно, то всё будет хорошо работать. А производитель, например, кладёт болт на всё, хотя и пишет в даташите, что поддержка полная.
Это, допустим например, в доску китайский C-Media с их новым супер-пупер контроллером CMI-8888, который, якобы, полностью совместим с Intel HDAudio Spec.

А реальность такова, что не менее китайский ASUS ROG Xonar Phoebus, у которого на борту тот самый 8888, по причине, скорее всего, отсутствия в природе DAC 32бита, не имеет полной поддержки спецификации.
Ну и прошивки для 8888 с поддержкой 32 бита не существует, соотв. А может дело даже не в прошивке, а в реальных возможностях 8888 — сие науке не известно. Братья-китайцы молчат как рыба об лёд.

И всем пофигу, что мы выдрали из Пхоебиуса чип, запаяли на его основе собств. адаптер, подключили к нему собственный внешний DAC 32 бита...помощи не дождешься от них (крик души).

В общем, всё грустно, но если кому будут интересны подробности — спрашивайте, постараюсь ответить.

Всем спасибо за участие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.