Включение аудиовхода USB Audio Class 2.0

Я пытался настроить поток аудиовхода USB на моем устройстве микроконтроллера. Я знаю, что каждый аудиопоток USB имеет две альтернативные настройки; Альтернативная настройка 0 - это когда поток недоступен; Альтернативная настройка 1 - это когда есть доступный поток.

Я уже настроил USB Audio Output, поэтому я знаю, что дескрипторы потоков работают нормально. Очевидно, что микроконтроллер вызывает прерывание USB, чтобы активировать выход, когда хост сообщает, когда идет звук (микроконтроллер включает альтернативную настройку 1...). Тем не менее, теперь я запутался, как включить сторону входа USB Audio. Я запутался, потому что, очевидно, хост не сообщает микроконтроллеру, что ввод поступает... скорее, устройство сообщает хосту, через что он передает данные.

Если бы кто-нибудь мог дать мне представление о том, как правильно включить поток ввода, это было бы замечательно. Мне интересно, стоит ли мне просто активировать конечную точку и просто отправлять данные таким образом? Я могу дать больше кода, если нужно, но я думаю, что это скорее тип мышления / алгоритмический подход вопроса.

Вот мой дескриптор альтернативных настроек потока:

.iface_alt0.bLength                  = sizeof(usb_iface_desc_t)
.iface_alt0.bDescriptorType          = USB_DT_INTERFACE
.iface_alt0.bInterfaceNumber         = UDI_AUDIO_IFACE_DATA_IN_NUMBER
.iface_alt0.bAlternateSetting        = 0
.iface_alt0.bNumEndpoints            = 0
.iface_alt0.bInterfaceClass          = AUDIO_IFACE_CLASS
.iface_alt0.bInterfaceSubClass       = AUDIO_IFACE_SUBCLASS_STREAMING
.iface_alt0.bInterfaceProtocol       = AUDIO_IFACE_IP_VERSION_02_00
.iface_alt0.iInterface               = 0
.iface_alt1.bLength                  = sizeof(usb_iface_desc_t)
.iface_alt1.bDescriptorType          = USB_DT_INTERFACE
.iface_alt1.bInterfaceNumber         = UDI_AUDIO_IFACE_DATA_IN_NUMBER
.iface_alt1.bAlternateSetting        = 1
.iface_alt1.bNumEndpoints            = UDI_AUDIO_IN_NB_ENDPOINTS
.iface_alt1.bInterfaceClass          = AUDIO_IFACE_CLASS
.iface_alt1.bInterfaceSubClass       = AUDIO_IFACE_SUBCLASS_STREAMING
.iface_alt1.bInterfaceProtocol       = AUDIO_IFACE_IP_VERSION_02_00
.iface_alt1.iInterface               = 0

Спасибо!

РЕДАКТИРОВАТЬ - Просто прочитайте этот источник:

"Когда эта конфигурация включена, используются первые два дескриптора интерфейса с bAlternativeSettings, равным нулю. Однако во время работы хост может отправлять запрос SetInterface, направленный на запрос Интерфейса один, с альтернативной настройкой одного для включения другого дескриптора интерфейса". - USB в двух словах

Пересмотренный вопрос: Как отправить запрос SetInterface, чтобы устройство USB могло принимать входной поток?

новое обновление - есть ли способ, которым я могу установить альтернативную настройку активным через дескрипторы? Я читал об дескрипторе потока -> "Поле bmControls содержит набор пар битов, указывающих, какие элементы управления присутствуют и каковы их возможности". "D1..0 Активное управление альтернативными настройками", "D3..2 Действительное управление альтернативными настройками".

решено вроде -
Похоже, мне просто нужно было открыть аудио приложение на моем хост-устройстве, чтобы включить альтернативную настройку... Я не знал, что это так.

1 ответ

Решение

int libusb_set_interface_alt_setting (libusb_device_handle * dev, int interface_number, int alternate_setting)

http://libusb.org/static/api-1.0/group__dev.html

в общем случае поля в дескрипторе подобны указателям на ячейки памяти. если сопоставление является ошибочным, устройство не будет работать. поскольку хост имеет определенное сопоставление в своем драйвере, устройство должно подчиняться этому сопоставлению.

в http://www.usb.org/developers/docs/devclass_docs/audio10.pdf на стр. 117 говорится, что имеется стандартный дескриптор AudioControl верхнего уровня и низкоуровневые дескрипторы управления звуком класса.

Помимо дескриптора AudioStreaming, вы должны также правильно установить другие дескрипторы. В примере в http://www.usb.org/developers/docs/devclass_docs/audio10.pdf стр. 126 необходимо установить дескриптор стандартного интерфейса потоковой передачи аудио, дескриптор потоковой передачи звука для конкретного класса, дескриптор формата I типа, дескриптор стандартной конечной точки Специфичный для класса дескриптор конечной точки изохронных аудиоданных

я не знаю, какой класс реализует ваше устройство, возможно, вам следует установить все эти дескрипторы, тогда оно, возможно, сработает. Я не могу найти поле bmControl в дескрипторе AudioStreaming.

Обычно альтернативные настройки используются для переключения между конечными точками или интерфейсами AudioStreaming, см. Дескриптор интерфейса для конкретного класса на стр. 117.

в http://www.usb.org/developers/docs/devclass_docs/audio10.pdf со страницы 58-64 все соответствующие дескрипторы потоковой передачи аудио

в аудио драйвере linux USB есть поле bmControl:

/* 22  * bmControl field decoders
 23  *
 24  * From the USB Audio spec v2.0:
 25  *
 26  *   bmaControls() is a (ch+1)-element array of 4-byte bitmaps,
 27  *   each containing a set of bit pairs. **If a Control is present,
 28  *   it must be Host readable.** If a certain Control is not
 29  *   present then the bit pair must be set to 0b00.
 30  *   If a Control is present but read-only, the bit pair must be
 31  *   set to 0b01. If a Control is also Host programmable, the bit
 32  *   pair must be set to 0b11. The value 0b10 is not allowed.
 33  *
 34  */

http://lxr.free-electrons.com/source/include/linux/usb/audio-v2.h

( http://www.usb.org/developers/docs/devclass_docs/audio10.pdf на стр. 36)

Другие вопросы по тегам