首页 文章

Linux设备驱动程序通过USB发送和接收音频

提问于
浏览
2

我正在尝试通过USB从我的嵌入式Linux设备向/从Windows主机发送/接收音频 .

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

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

我看到's a UAC2 driver (in the latest Linux kernel) that both sends and receives audio from the host. But I'喜欢有一个UAC1驱动程序,这样我就不必在Windows主机上安装任何额外的驱动程序(尤其是我必须购买的驱动程序:http://www.thesycon.de/eng/usb_audiodriver.shtml) .

我在linux / drivers / usb / gadget / f_audio.c修改了linux设备驱动程序(我使用的是较旧的内核) . 我已经更改了USB标头描述符,以包含用于向主机发送音频的额外 endpoints .

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 endpoints 定义为:

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 endpoints 定义为:

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字段通常与 endpoints 号进行“或”运算 . 在我看来,我发现这种情况正在发生 . 当我在epautoconf.c中打印时,我的OUT endpoints 的'bEndpointAddress'字段是0x01,而我的IN endpoints 是0x81 . 但是我无法在主机端看到它 . 在我的Windows PC上,我使用USB View工具查看描述符,我看到值为0x00和0x80 .

什么可能改变了bEndpointAdress的 Value ?

这些是我在Windows中使用USB View工具看到的USB描述符:

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驱动程序?

1 回答

  • 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
    

相关问题