2014-12-02 194 views
1

我试图通过USB从我的嵌入式Linux设备发送/接收音频到/从Windows主机。通过USB发送和接收音频的Linux设备驱动程序

据我所知,有2种协议通过USB发送音频 - USB音频类1和2(UAC1 & UAC2)。我发现他们在这里解释:http://www.thewelltemperedcomputer.com/HW/USB_Audio.htm

我目前在Linux中使用现有的UAC1设备驱动程序来从主机PC获取音频。这个对我有用。我正在尝试将设备驱动程序更改为也能够将音频发送到主机PC。

我看到有一个UAC2驱动程序(在最新的Linux内核中)同时发送和接收来自主机的音频。但是我想要一个UAC1驱动程序来实现这一点,这样我就不必在Windows主机上安装任何额外的驱动程序(特别是我必须购买的驱动程序:http://www.thesycon.de/eng/usb_audiodriver.shtml)。我修改了linux/drivers/usb/gadget/f_audio.c中的linux设备驱动程序(我使用的是旧版本的内核)。我已将USB头描述符更改为包含用于向主机发送音频的额外端点。

struct usb_endpoint_descriptor hs_epout_desc = { 
    .bLength = USB_DT_ENDPOINT_SIZE, 
    .bDescriptorType = USB_DT_ENDPOINT, 

    .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, 
    .wMaxPacketSize = __constant_cpu_to_le16(OUT_EP_MAX_PACKET_SIZE), 
    .bInterval = 4, 
}; 

IN端点被定义为:

static struct usb_descriptor_header *hs_audio_desc[] = { 
    (struct usb_descriptor_header *)&std_ac_if_desc, 

    (struct usb_descriptor_header *)&ac_hdr_desc, 
    (struct usb_descriptor_header *)&usb_it_desc, 
    (struct usb_descriptor_header *)&usb_ot_desc, 

    (struct usb_descriptor_header *)&std_as_out_if0_desc, 
    (struct usb_descriptor_header *)&std_as_out_if1_desc, 

    (struct usb_descriptor_header *)&as_out_hdr_desc, 
    (struct usb_descriptor_header *)&as_out_fmt1_desc, 
    (struct usb_descriptor_header *)&hs_epout_desc, 
    (struct usb_descriptor_header *)&as_iso_out_desc, 

    (struct usb_descriptor_header *)&std_as_in_if0_desc, 
    (struct usb_descriptor_header *)&std_as_in_if1_desc, 

    (struct usb_descriptor_header *)&as_in_hdr_desc, 
    (struct usb_descriptor_header *)&as_in_fmt1_desc, 
    (struct usb_descriptor_header *)&hs_epin_desc, 
    (struct usb_descriptor_header *)&as_iso_in_desc, 
    NULL, 
}; 

作为OUT端点被定义

struct usb_endpoint_descriptor hs_epin_desc = { 
    .bLength = USB_DT_ENDPOINT_SIZE, 
    .bDescriptorType = USB_DT_ENDPOINT, 
    .bEndpointAddress = USB_DIR_IN, 
    .bmAttributes = USB_ENDPOINT_XFER_ISOC | USB_ENDPOINT_SYNC_ASYNC, 
    .wMaxPacketSize = __constant_cpu_to_le16(OUT_EP_MAX_PACKET_SIZE), 
    .bInterval = 4, 
}; 

在epautoconf.c中,bEndpointAddress端点字段通常与或运算端点号码。我看到我的情况,这是发生。 我的OUT端点的'bEndpointAddress'字段是0x01,而当我在epautoconf.c中打印它时,我的IN端点是0x81。 但我无法在主机端看到它。在我的Windows PC上,我使用USB View工具查看描述符,并看到值为0x00和0x80。

什么可能会改变bEndpointAdress的值?

这些都是使用USB查看工具的USB描述我看到在Windows:

Device Descriptor: 
bcdUSB:    0x0200 
bDeviceClass:   0x00 
bDeviceSubClass:  0x00 
bDeviceProtocol:  0x00 
bMaxPacketSize0:  0x40 (64) 
idVendor:   0x1D6B 
idProduct:   0x0101 
bcdDevice:   0x0316 
iManufacturer:  0x01 
0x0409: "Linux 3.2.0 with musb-hdrc" 
iProduct:    0x02 
0x0409: "Linux USB Audio Gadget" 
iSerialNumber:  0x00 
bNumConfigurations: 0x01 

ConnectionStatus: DeviceConnected 
Current Config Value: 0x01 
Device Bus Speed:  High 
Device Address:  0x13 
Open Pipes:    0 

Configuration Descriptor: 
wTotalLength:  0x0095 
bNumInterfaces:  0x03 
bConfigurationValue: 0x01 
iConfiguration:  0x00 
bmAttributes:   0xC0 (Bus Powered Self Powered) 
MaxPower:    0x01 (2 Ma) 

Interface Descriptor: 
bInterfaceNumber:  0x00 
bAlternateSetting: 0x00 
bNumEndpoints:  0x00 
bInterfaceClass:  0x01 (Audio) 
bInterfaceSubClass: 0x01 (Audio Control) 
bInterfaceProtocol: 0x00 
iInterface:   0x04 
0x0409: "Topology Control" 

Audio Control Interface Header Descriptor: 
bLength:    0x0A 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x01 
bcdADC:    0x0100 
wTotalLength:  0x001F 
bInCollection:  0x02 
baInterfaceNr[1]:  0x01 
baInterfaceNr[2]:  0x02 

Audio Control Input Terminal Descriptor: 
bLength:    0x0C 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x02 
bTerminalID:   0x02 
wTerminalType:  0x0201 (Microphone) 
bAssocTerminal:  0x00 
bNrChannels:   0x02 
wChannelConfig:  0x0003 
iChannelNames:  0x00 
iTerminal:   0x07 

Audio Control Output Terminal Descriptor: 
bLength:    0x09 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x03 
bTerminalID:   0x01 
wTerminalType:  0x0301 (Speaker) 
bAssocTerminal:  0x00 
bSoruceID:   0x00 
iTerminal:   0x09 

Interface Descriptor: 
bInterfaceNumber:  0x01 
bAlternateSetting: 0x00 
bNumEndpoints:  0x00 
bInterfaceClass:  0x01 (Audio) 
bInterfaceSubClass: 0x02 (Audio Streaming) 
bInterfaceProtocol: 0x00 
iInterface:   0x0B 
0x0409: "Playback Inactive" 

Interface Descriptor: 
bInterfaceNumber:  0x01 
bAlternateSetting: 0x01 
bNumEndpoints:  0x01 
bInterfaceClass:  0x01 (Audio) 
bInterfaceSubClass: 0x02 (Audio Streaming) 
bInterfaceProtocol: 0x00 
iInterface:   0x0C 
0x0409: "Playback Active" 

Audio Streaming Class Specific Interface Descriptor: 
bLength:    0x07 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x01 
bTerminalLink:  0x01 
bDelay:    0x01 
wFormatTag:   0x0001 (PCM) 

Audio Streaming Format Type Descriptor: 
bLength:    0x0B 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x02 
bFormatType:   0x01 
bNrChannels:   0x00 
bSubframeSize:  0x02 
bBitResolution:  0x10 
bSamFreqType:   0x01 
tSamFreq[1]:  0x00BB80 (48000 Hz) 

Endpoint Descriptor: 
bEndpointAddress:  0x00 OUT 
Transfer Type: Isochronous 
wMaxPacketSize:  0x00C8 (200) 
bInterval:   0x04 

Audio Streaming Class Specific Audio Data Endpoint Descriptor: 
bLength:    0x07 
bDescriptorType:  0x25 
bDescriptorSubtype: 0x01 
bmAttributes:   0x00 
bLockDelayUnits:  0x00 
wLockDelay:   0x0000 

Interface Descriptor: 
bInterfaceNumber:  0x02 
bAlternateSetting: 0x00 
bNumEndpoints:  0x00 
bInterfaceClass:  0x01 (Audio) 
bInterfaceSubClass: 0x02 (Audio Streaming) 
bInterfaceProtocol: 0x00 
iInterface:   0x0D 
0x0409: "Capture Inactive" 

Interface Descriptor: 
bInterfaceNumber:  0x02 
bAlternateSetting: 0x01 
bNumEndpoints:  0x01 
bInterfaceClass:  0x01 (Audio) 
bInterfaceSubClass: 0x02 (Audio Streaming) 
bInterfaceProtocol: 0x00 
iInterface:   0x0E 
0x0409: "Capture Active" 

Audio Streaming Class Specific Interface Descriptor: 
bLength:    0x07 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x01 
bTerminalLink:  0x02 
bDelay:    0x01 
wFormatTag:   0x0001 (PCM) 

Audio Streaming Format Type Descriptor: 
bLength:    0x0B 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x02 
bFormatType:   0x01 
bNrChannels:   0x00 
bSubframeSize:  0x02 
bBitResolution:  0x10 
bSamFreqType:   0x01 
tSamFreq[1]:  0x00BB80 (48000 Hz) 

Endpoint Descriptor: 
bEndpointAddress:  0x80 IN 
Transfer Type: Isochronous 
wMaxPacketSize:  0x00C8 (200) 
bInterval:   0x04 

Audio Streaming Class Specific Audio Data Endpoint Descriptor: 
bLength:    0x07 
bDescriptorType:  0x25 
bDescriptorSubtype: 0x01 
bmAttributes:   0x00 
bLockDelayUnits:  0x00 
wLockDelay:   0x0000 

为什么不能在Windows安装UAC1驱动程序?

+0

您是否尝试过使用'的#pragma包(1)'周围的结构的声明? – 2014-12-03 01:03:33

+0

谢谢彼得。但是bLength和bInterval等其他元素与定义的值相同。只有bEndpointAddress被更改。 – linux22 2014-12-03 15:37:20

+0

我刚刚尝试使用#pragma pack(1)。不幸的是,这没有什么区别。 – linux22 2014-12-03 16:18:58

回答

1

对于我的第一个问题,我从linux-usb邮件列表中得到了答案。事实证明'epautoconf.c'不会改变'bEndpointAdress'。所以我改变了'bEndpointAdress'定义中的值,现在它正确传达给主机。

Windows中正确安装驱动程序UAC1当我使用这个配置:

ConnectionStatus: DeviceConnected 
Current Config Value: 0x01 
Device Bus Speed:  High 
Device Address:  0x11 
Open Pipes:    0 

Configuration Descriptor: 
wTotalLength:  0x00E7 
bNumInterfaces:  0x03 
bConfigurationValue: 0x01 
iConfiguration:  0x00 
bmAttributes:   0xC0 (Bus Powered Self Powered) 
MaxPower:    0x01 (2 Ma) 

Interface Descriptor: 
bInterfaceNumber:  0x00 
bAlternateSetting: 0x00 
bNumEndpoints:  0x00 
bInterfaceClass:  0x01 (Audio) 
bInterfaceSubClass: 0x01 (Audio Control) 
bInterfaceProtocol: 0x00 
iInterface:   0x00 

Audio Control Interface Header Descriptor: 
bLength:    0x0A 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x01 
bcdADC:    0x0100 
wTotalLength:  0x0065 
bInCollection:  0x02 
baInterfaceNr[1]:  0x01 
baInterfaceNr[2]:  0x02 

Audio Control Input Terminal Descriptor: 
bLength:    0x0C 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x02 
bTerminalID:   0x01 
wTerminalType:  0x0201 (Microphone) 
bAssocTerminal:  0x00 
bNrChannels:   0x02 
wChannelConfig:  0x0003 
iChannelNames:  0x00 
iTerminal:   0x00 

Audio Control Feature Unit Descriptor: 
bLength:    0x0A 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x06 
bUnitID:    0x02 
bSourceID:   0x01 
bControlSize:   0x01 
bmaControls[0]: 
03 
bmaControls[1]: 
00 
bmaControls[2]: 
00 
iFeature:    0x00 

Audio Control Input Terminal Descriptor: 
bLength:    0x0C 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x02 
bTerminalID:   0x03 
wTerminalType:  0x0402 (Headset) 
bAssocTerminal:  0x09 
bNrChannels:   0x02 
wChannelConfig:  0x0003 
iChannelNames:  0x00 
iTerminal:   0x00 

Audio Control Feature Unit Descriptor: 
bLength:    0x0A 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x06 
bUnitID:    0x04 
bSourceID:   0x03 
bControlSize:   0x01 
bmaControls[0]: 
03 
bmaControls[1]: 
00 
bmaControls[2]: 
00 
iFeature:    0x00 

Audio Control Selector Unit Descriptor: 
bLength:    0x06 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x05 
bUnitID:    0x05 
bNrInPins:   0x01 
baSourceID[1]:  0x04 
iSelector:   0x09 

Audio Control Output Terminal Descriptor: 
bLength:    0x09 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x03 
bTerminalID:   0x06 
wTerminalType:  0x0101 (USB streaming) 
bAssocTerminal:  0x00 
bSoruceID:   0x05 
iTerminal:   0x00 

Audio Control Input Terminal Descriptor: 
bLength:    0x0C 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x02 
bTerminalID:   0x07 
wTerminalType:  0x0101 (USB streaming) 
bAssocTerminal:  0x00 
bNrChannels:   0x02 
wChannelConfig:  0x0003 
iChannelNames:  0x00 
iTerminal:   0x00 

Audio Control Feature Unit Descriptor: 
bLength:    0x0A 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x06 
bUnitID:    0x08 
bSourceID:   0x0A 
bControlSize:   0x01 
bmaControls[0]: 
01 
bmaControls[1]: 
02 
bmaControls[2]: 
02 
iFeature:    0x00 

Audio Control Output Terminal Descriptor: 
bLength:    0x09 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x03 
bTerminalID:   0x09 
wTerminalType:  0x0402 (Headset) 
bAssocTerminal:  0x03 
bSoruceID:   0x08 
iTerminal:   0x00 

Audio Control Mixer Unit Descriptor: 
bLength:    0x0D 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x04 
bUnitID:    0x0A 
bNrInPins:   0x02 
baSourceID[1]:  0x07 
baSourceID[2]:  0x02 
bNrChannels:   0x02 
wChannelConfig:  0x0003 
iChannelNames:  0x00 
bmControls: 
00 
iMixer:    0x00 

Interface Descriptor: 
bInterfaceNumber:  0x01 
bAlternateSetting: 0x00 
bNumEndpoints:  0x00 
bInterfaceClass:  0x01 (Audio) 
bInterfaceSubClass: 0x02 (Audio Streaming) 
bInterfaceProtocol: 0x00 
iInterface:   0x00 

Interface Descriptor: 
bInterfaceNumber:  0x01 
bAlternateSetting: 0x01 
bNumEndpoints:  0x01 
bInterfaceClass:  0x01 (Audio) 
bInterfaceSubClass: 0x02 (Audio Streaming) 
bInterfaceProtocol: 0x00 
iInterface:   0x00 

Audio Streaming Class Specific Interface Descriptor: 
bLength:    0x07 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x01 
bTerminalLink:  0x06 
bDelay:    0x01 
wFormatTag:   0x0001 (PCM) 

Audio Streaming Format Type Descriptor: 
bLength:    0x0B 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x02 
bFormatType:   0x01 
bNrChannels:   0x02 
bSubframeSize:  0x02 
bBitResolution:  0x10 
bSamFreqType:   0x01 
tSamFreq[1]:  0x00BB80 (48000 Hz) 

Endpoint Descriptor: 
bEndpointAddress:  0x01 OUT 
Transfer Type: Isochronous 
wMaxPacketSize:  0x00C8 (200) 
bInterval:   0x04 

Audio Streaming Class Specific Audio Data Endpoint Descriptor: 
bLength:    0x07 
bDescriptorType:  0x25 
bDescriptorSubtype: 0x01 
bmAttributes:   0x01 
bLockDelayUnits:  0x00 
wLockDelay:   0x0000 

Interface Descriptor: 
bInterfaceNumber:  0x02 
bAlternateSetting: 0x00 
bNumEndpoints:  0x00 
bInterfaceClass:  0x01 (Audio) 
bInterfaceSubClass: 0x02 (Audio Streaming) 
bInterfaceProtocol: 0x00 
iInterface:   0x00 

Interface Descriptor: 
bInterfaceNumber:  0x02 
bAlternateSetting: 0x01 
bNumEndpoints:  0x01 
bInterfaceClass:  0x01 (Audio) 
bInterfaceSubClass: 0x02 (Audio Streaming) 
bInterfaceProtocol: 0x00 
iInterface:   0x00 

Audio Streaming Class Specific Interface Descriptor: 
bLength:    0x07 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x01 
bTerminalLink:  0x07 
bDelay:    0x01 
wFormatTag:   0x0001 (PCM) 

Audio Streaming Format Type Descriptor: 
bLength:    0x0B 
bDescriptorType:  0x24 
bDescriptorSubtype: 0x02 
bFormatType:   0x01 
bNrChannels:   0x02 
bSubframeSize:  0x02 
bBitResolution:  0x10 
bSamFreqType:   0x01 
tSamFreq[1]:  0x00BB80 (48000 Hz) 

Endpoint Descriptor: 
bEndpointAddress:  0x81 IN 
Transfer Type: Isochronous 
wMaxPacketSize:  0x00C8 (200) 
bInterval:   0x04 

Audio Streaming Class Specific Audio Data Endpoint Descriptor: 
bLength:    0x07 
bDescriptorType:  0x25 
bDescriptorSubtype: 0x01 
bmAttributes:   0x01 
bLockDelayUnits:  0x01 
wLockDelay:   0x0004