2017-01-12 93 views
1

我一直在嘗試在我的單片機設備上設置USB音頻輸入流。我知道每個USB音頻流有兩個備用設置;備用設置0是沒有流可用的地方;備用設置1是有可用流的時候。啓用USB音頻類2.0音頻輸入流

我已經設置了USB音頻輸出,所以我知道流描述符工作正常。很明顯,當主機告訴它音頻通過時(微控制器啓用備用設置1 ...),微控制器會調用USB中斷來激活輸出。但是,現在我很困惑如何啓用USB音頻輸入端。我很困惑,因爲顯然主機不告訴微控制器輸入正在通過...而是設備告訴主機它正在發送數據。

如果任何人都可以告訴我如何正確啓用輸入流,那將是美妙的。我想知道我是否應該努力啓用端點並以這種方式發送數據?如果需要,我可以提供更多的代碼,但我想這更多是一種思維類型/算法的問題。

這是我流的備用設置描述:

.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 

謝謝!

EDIT - 只需讀這個源:

「啓用此配置中,使用具有bAlternativeSettings等於零前兩個接口描述符然而在操作期間,主機可以發送定向到一個SetInterface請求。的接口之一,其中一個替代設置爲啓用其他接口描述符。「 - USB in a Nutshell

修訂問題:如何發送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#ga3047fea29830a56524388fd423068b53

一般在一描述符中的字段是等指針的存儲器位置。如果映射有故障的設備將不會work.as主機在它的驅動程序映射某些設備具有服從這個映射

http://www.usb.org/developers/docs/devclass_docs/audio10.pdf

117頁上說,有一個頂級標準音頻控制描述符和更低級別特定於類別的音頻控制描述符

旁邊的AudioStreaming描述符你也必須正確設置其他描述符。在126 http://www.usb.org/developers/docs/devclass_docs/audio10.pdf頁的例子必須被設置標準音頻流接口描述符類特定的音頻流描述符I型格式描述符標準端點描述符,特定類同步音頻數據端點描述符

我不知道是什麼類的設備實現,也許你應該將所有這些描述那麼它將可能工作 我不能在AudioStreaming描述找到bmControl場。

通常交替設置用於端點或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頁)

+0

嗯以及我不使用的libusb所以這並不能真正幫助......但我並遵循那裏的意見和設置界面的Alt設置,一旦USB設備連接本身。但問題似乎更像是現在發送給主機的東西......主機(如Mac)是否應該隨時接受USB音頻數據?我知道主機將不會啓用USB音頻輸出,直到主機發送設置接口請求,聲明音頻數據正在傳輸到設備 –

+0

在USB協議主機啓動任何通信。即使設備發送中斷,也必須等待主機輪詢它。所以如果有一個流然後主機請求它,所以它應該接受它。也許使用wireshark或http://unix.stackexchange.com/questions/138742/how-to-dump-usb-traffic來嗅探USB,看看會發生什麼 –

+0

嗯,這證實了我一直在過去一天的一些懷疑。有沒有辦法通過描述符設置備用設置?我正在閱讀關於流描述符的信息 - >「bmControls字段包含一組位對,表明哪些控件存在以及它們的功能是什麼。」 「D1..0有效交替設置控制」,「D3..2有效交替設置控制」。可能我只需要設置這些? –