Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB Audio
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
amw
Добрый день всем.
Не уверен, что правильно выбрал ветку, но вопрос больше по особенностям ОС чем по USB как таковому.

Устройство собственное, на LPC2378, по спецификации USB Audio Device Class 1.0.
Имеется 2 интерфейса (дескрипторы), первый 2 DAC - SPEAKER, второй 4 ADC - MICROPHONE.
В Linux устройство работает безукоризненно. Разработка и тестироваеие велось в Linux. Но нужно чтоб работало и в Windows.

В Windows XP и Vista при втыкании устройство распознается как USB Audio, проводится интсалляция, но после этого в менеджере устройств появляется желтый восклицательный знак, и система сообщает, что при запуске возникли проблемы.

В свойствах имеется следующее описание:
Код
Запуск этого устройства невозможен. (Код 10)
Нажмите кнопку "Диагностика", чтобы запустить мастер диагностики для данного устройства.

Все файлы драйверов и dll, перечисленные в свойствах устройства есть в наличии на своих местах.

Что это такое и счем его едят? Чего не хватает Виндовсу? Никаких своих драйверов нет и не должно быть по ТЗ. Да и Windows даже не пытается спрашивать о драйверах (что соответствует ожиданиям и ТЗ).

setupapi.log:
Код
[SetupAPI Log]
Версия ОС = 5.1.2600 Service Pack 1
Платформа = 2 (NT)
Пакет обновления = 1.0
Комплект = 0x0100
Тип продукта = 1
Архитектура = x86
[2008/04/01 10:05:44 792.3 Driver Install]
#-019 Поиск идентификаторов аппаратуры: usb\vid_1234&pid_8765&rev_0016&mi_00,usb\vid_1234&pid_8765&mi_00
#-018 Поиск совместимых идентификаторов: usb\class_01&subclass_01&prot_00,usb\class_01&subclass_01,usb\class_01
#-198 Обработана командная строка: C:\WINDOWS\system32\services.exe
#I022 Найдено "USB\CLASS_01" в C:\WINDOWS\inf\wdma_usb.inf; Устройство: "Аудио устройства USB"; Драйвер: "Аудио устройства USB"; Поставщик: "Microsoft"; Изготовитель: "(Универсальное аудио устройство USB)"; Секция: "USBAudio"
#I023 Действительная секция установки: [USBAudio.NT]. Ранг: 0x00002002. Дата драйвера: 07/01/2001.
#-166 Функция установки устройства: DIF_SELECTBESTCOMPATDRV.
#I063 Установка выбранного драйвера из секции [USBAudio] в "c:\windows\inf\wdma_usb.inf".
#I320 GUID класса устройства остается равным {4D36E96C-E325-11CE-BFC1-08002BE10318}.
#I060 Установка выбранного драйвера.
#I058 Выбран наиболее совместимый драйвер.
#-166 Функция установки устройства: DIF_INSTALLDEVICEFILES.
#I124 Выполняется только копирующая установка "USB\VID_1234&PID_8765&MI_00\6&2F59F92F&1&0000".
#-166 Функция установки устройства: DIF_REGISTER_COINSTALLERS.
#I056 Совместные установщики зарегистрированы.
#-166 Функция установки устройства: DIF_INSTALLINTERFACES.
#-011 Установка секции [USBAudio.NT.Interfaces] из "c:\windows\inf\wdma_usb.inf".
#I054 Интерфейсы установлены.
#-166 Функция установки устройства: DIF_INSTALLDEVICE.
#I123 Выполняется полная установка "USB\VID_1234&PID_8765&MI_00\6&2F59F92F&1&0000".
#I163 Устройство не запущено: обнаружена проблема: 0x0a: CM_PROB_FAILED_START.
#I121 Установка устройства "USB\VID_1234&PID_8765&MI_00\6&2F59F92F&1&0000" успешно завершена.

Вот это откуда и как побороть?
Код
#I163 Устройство не запущено: обнаружена проблема: 0x0a: CM_PROB_FAILED_START.


Дескрипторы, на всякий случай.
khach
Найдите в сети микрософтовскую UVCView.x86.exe (это usbview специально заточенный под мультимедиа девайсы) и посмотрите его отчет по дескриптору. Он об ошибках дескриптора и неподдерживаемых микрософтом режимах сообщит.
amw
Цитата(khach @ Apr 1 2008, 12:18) *
Найдите в сети микрософтовскую UVCView.x86.exe (это usbview специально заточенный под мультимедиа девайсы) и посмотрите его отчет по дескриптору. Он об ошибках дескриптора и неподдерживаемых микрософтом режимах сообщит.

Попробовал. Полный вывод прилагается.
В самом начале:
Код
          ---===>Device Information<===---
English product name: "DSP"

ConnectionStatus:                  
Current Config Value:              0x01  -> Device Bus Speed: Full
Device Address:                    0x01
Open Pipes:                           0
*!*ERROR:  No open pipes!

А как это понимать? Как расшифровать?

И на каждый дескриптор интерфейса:
Код
          ===>Interface Descriptor<===
bLength:                           0x09
bDescriptorType:                   0x04
bInterfaceNumber:                  0x01
bAlternateSetting:                 0x01
bNumEndpoints:                     0x01
bInterfaceClass:                   0x01  -> Audio Interface Class
bInterfaceSubClass:                0x02  -> Audio Streaming Interface SubClass
bInterfaceProtocol:                0x00
CAUTION:  This may be an invalid bInterfaceProtocol
iInterface:                        0x04

Но по спецификации должен быть bInterfaceProtocol равен нулю. Или я что-то пропустил?
amw
Нашел ссылку на HotFix.
http://support.microsoft.com/kb/933262
Прислали smile.gif. Инсталировал его.
Не помогло.
Никаких сдвигов.

Принимаются любые идеи smile.gif.
vshemm
Судя по ошибке, виндовый драйвер не может стартовать. Вот что по этому поводу пишет мсдн:
This error code is set when one of the drivers in the device's driver stack fails IRP_MN_START_DEVICE. If there are many drivers in the stack, it can be difficult to determine the one that failed.

Vid и Pid у девайса прописаны?

Вообще, метод "тыка" тут может не помочь, нужно брать драйвер из ддк (который с исходниками) и на нем отлаживаться. До тех пор, пока стандартный драйвер не заработает smile.gif
amw
Цитата(vshemm @ Apr 2 2008, 09:38) *
Судя по ошибке, виндовый драйвер не может стартовать. Вот что по этому поводу пишет мсдн:
This error code is set when one of the drivers in the device's driver stack fails IRP_MN_START_DEVICE. If there are many drivers in the stack, it can be difficult to determine the one that failed.

Знать бы причину, почему он не может стартовать. Есть ли способ заставить драйвер выдавать отладочную информацию? Где смотреть? Или все только через дебагер? Как вообще в Windows получить хоть какую-то информацию о происходящем?
Цитата
Vid и Pid у девайса прописаны?

Да VID и PID. Прописаны.
Цитата
Вообще, метод "тыка" тут может не помочь, нужно брать драйвер из ддк (который с исходниками) и на нем отлаживаться. До тех пор, пока стандартный драйвер не заработает smile.gif

А зачем тогда вообще стандартный драйвер?
Писать драйвер под Windows не представляется возможным.
khach
Код
CAUTION:  This may be an invalid bInterfaceProtocol

не обращайте внимания- у меня на рабочем устройстве тоже ругается

Цитата(amw @ Apr 2 2008, 10:04) *
А зачем тогда вообще стандартный драйвер?

Возьмите SDKшный драйвер- у него вывод дебуг инфы незаглушен. используйте утилитку типа debugview и посмотрите что драйвер пишет. Также рекомендую временно урезать дескриптор и позапускать девайс по частям- отдельно ввод, отдельно вывод.

Ну или запустите все под софтайсом и посмотрите почему он слетает. Также можно взять какой-либо USB снифер и посмотреть процесс инициализации по пакетам- иногда бывают очень глупые ошибки, которые линух проглатывает, а винда вылетает.
amw
Цитата(khach @ Apr 2 2008, 12:08) *
Код
CAUTION:  This may be an invalid bInterfaceProtocol

не обращайте внимания- у меня на рабочем устройстве тоже ругается
Возьмите SDKшный драйвер- у него вывод дебуг инфы незаглушен. используйте утилитку типа debugview и посмотрите что драйвер пишет. Также рекомендую временно урезать дескриптор и позапускать девайс по частям- отдельно ввод, отдельно вывод.

Ну или запустите все под софтайсом и посмотрите почему он слетает. Также можно взять какой-либо USB снифер и посмотреть процесс инициализации по пакетам- иногда бывают очень глупые ошибки, которые линух проглатывает, а винда вылетает.

Спасибо, буду пробовать.

И вопрос.

Есть пример дескриптора карточки ABIT.
Код
Audio Control Interface Header Descriptor:
bLength:            0x0A
bDescriptorType:    0x24
bDescriptorSubtype:    0x01
bcdADC:            0x0100
wTotalLength:        0x004C
bInCollection:        0x02
baInterfaceNr[1]:    0x01
baInterfaceNr[2]:    0x02

И мой:
Код
bLength:            0x0B
bDescriptorType:    0x24
bDescriptorSubtype:    0x01
bcdADC:            0x0100
wTotalLength:        0x009D
bInCollection:        0x03
baInterfaceNr[1]:    0x00
baInterfaceNr[2]:    0x01
baInterfaceNr[3]:    0x02

В спецификации указано:
Цитата
The bInCollection field indicates how many AudioStreaming and MIDIStreaming interfaces there are in the Audio Interface Collection to which this AudioControl interface belongs.

То есть на два STREAMING интерфейса (один DAC, второй ADC) правильно должно быть:
Код
bInCollection:        0x02
baInterfaceNr[1]:    0x01
baInterfaceNr[2]:    0x02

А у меня при таком дескрипторе устройство вообще не отпределяется.
В Linux ругается, что количество дескрипторов (bInCollection) меньше чем фактически их имееется в Configuration Descriptor.
Кроме того, в примере (в спецификации), указано как у меня.
Чего я не учел?
amw
Странно. Проблему решил. Еще не тестил, но Device Manager больше не кричит об ошибке.
Нашел презентацию Microsoft. (Прилагаю. PDF это уже я выводил).
1. Изменил в Device Descriptor версию USB - стало 1.0.
2. По презентации убрал нулевые значения bRefresh и bDelay. Поставил цифры от фонаря (мне не критично).
После этого заработало. Перестал ругаться Linux на несоответствие количества дескрипторов.
Дескриптор прилагаю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.