Пытаюсь написать драйвер для собственного аудио-адаптера, на котором установлен кодек 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-файлов изрыл вдоль и поперек.
На их основе написал свой, который, на мой взгляд, должен быть достаточен для запуска — ан нет. Гугол молчит по теме, что не удивительно.
Не знаю даже в какую сторону начать копать. В общем, нужна помощь.
Спасибо за отклик!
Сам виноват, не полностью раскрыл вопрос. Я пытаюсь написать 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бита...
Куда купать и что делать не понятно абсолютно, я уже тонну доков перерыл — тишина.
Напишите нативный ASIO драйвер для этого кодека. Этож каков шухер то будет — какой то там кодек вдруг имеет свой ASIO
А остальным и 24 бита/сэмпл хватит
Как много веселых ребят, и все делают велосипед...
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, 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 бита...помощи не дождешься от них (крик души).
В общем, всё грустно, но если кому будут интересны подробности — спрашивайте, постараюсь ответить.