我正在尝试为 Xubuntu 14.04 上的 USB 声卡编写一个简单的驱动程序(只是为了好玩)——例如,我希望有机会通过此设备控制笔记本电脑上的音量。
问题是 - 我没有任何输出sudo cat /dev/hidraw0
。我以这种方式测试了我的 USB 鼠标——我在点击和移动时获得了一些输出。我认为,该设备正是如此,因为它是我插入时出现在目录中并在拔出时消失的/dev/hidraw0
唯一东西。/dev/
还有这个例子http://lxr.free-electrons.com/source/samples/hidraw/hid-example.c给我看
Report Descriptor Size: 50
Report Descriptor:
5 c 9 1 a1 1 15 0 25 1 9 e9 9 ea 75 1 95 2 81 2 9 e2 9 0 81 6 9 0 95 4 81 2 26 ff 0 9 0 75 8 95 f 81 2 9 0 95 10 91 2 c0
Raw Name: C-Media Electronics Inc. USB Advanced Audio Device
Raw Phys: usb-0000:00:1a.0-1.2/input3
Raw Info:
bustype: 3 (USB)
vendor: 0x0b05
product: 0x1743
HIDIOCSFEATURE: Broken pipe
HIDIOCGFEATURE: Broken pipe
Error: 32
write: Broken pipe
read: Resource temporarily unavailable
我如何从该设备读取一些输入?怎么了?
[编辑1]
命令sudo lsusb -v -d 0b05:1743
显示
Bus 001 Device 005: ID 0b05:1743 ASUSTek Computer, Inc. Xonar U1 Audio Station
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 0 (Defined at Interface level)
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0b05 ASUSTek Computer, Inc.
idProduct 0x1743 Xonar U1 Audio Station
bcdDevice 1.00
iManufacturer 3 C-Media Electronics Inc.
iProduct 1 USB Advanced Audio Device
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 293
bNumInterfaces 4
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 100mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 1 Audio
bInterfaceSubClass 1 Control Device
bInterfaceProtocol 0
iInterface 0
AudioControl Interface Descriptor:
bLength 10
bDescriptorType 36
bDescriptorSubtype 1 (HEADER)
bcdADC 1.00
wTotalLength 128
bInCollection 2
baInterfaceNr( 0) 1
baInterfaceNr( 1) 2
AudioControl Interface Descriptor:
bLength 12
bDescriptorType 36
bDescriptorSubtype 2 (INPUT_TERMINAL)
bTerminalID 1
wTerminalType 0x0101 USB Streaming
bAssocTerminal 0
bNrChannels 2
wChannelConfig 0x0003
Left Front (L)
Right Front (R)
iChannelNames 0
iTerminal 0
AudioControl Interface Descriptor:
bLength 12
bDescriptorType 36
bDescriptorSubtype 2 (INPUT_TERMINAL)
bTerminalID 2
wTerminalType 0x0201 Microphone
bAssocTerminal 0
bNrChannels 2
wChannelConfig 0x0003
Left Front (L)
Right Front (R)
iChannelNames 0
iTerminal 0
AudioControl Interface Descriptor:
bLength 12
bDescriptorType 36
bDescriptorSubtype 2 (INPUT_TERMINAL)
bTerminalID 3
wTerminalType 0x0603 Line Connector
bAssocTerminal 0
bNrChannels 2
wChannelConfig 0x0003
Left Front (L)
Right Front (R)
iChannelNames 0
iTerminal 0
AudioControl Interface Descriptor:
bLength 12
bDescriptorType 36
bDescriptorSubtype 2 (INPUT_TERMINAL)
bTerminalID 4
wTerminalType 0x0605 SPDIF interface
bAssocTerminal 0
bNrChannels 2
wChannelConfig 0x0003
Left Front (L)
Right Front (R)
iChannelNames 0
iTerminal 0
AudioControl Interface Descriptor:
bLength 9
bDescriptorType 36
bDescriptorSubtype 3 (OUTPUT_TERMINAL)
bTerminalID 6
wTerminalType 0x0301 Speaker
bAssocTerminal 0
bSourceID 9
iTerminal 0
AudioControl Interface Descriptor:
bLength 9
bDescriptorType 36
bDescriptorSubtype 3 (OUTPUT_TERMINAL)
bTerminalID 7
wTerminalType 0x0101 USB Streaming
bAssocTerminal 0
bSourceID 8
iTerminal 0
AudioControl Interface Descriptor:
bLength 9
bDescriptorType 36
bDescriptorSubtype 5 (SELECTOR_UNIT)
bUnitID 8
bNrInPins 3
baSource( 0) 10
baSource( 1) 11
baSource( 2) 12
iSelector 0
AudioControl Interface Descriptor:
bLength 13
bDescriptorType 36
bDescriptorSubtype 6 (FEATURE_UNIT)
bUnitID 9
bSourceID 1
bControlSize 2
bmaControls( 0) 0x01
bmaControls( 0) 0x02
Mute Control
Loudness Control
bmaControls( 1) 0x02
bmaControls( 1) 0x00
Volume Control
bmaControls( 2) 0x02
bmaControls( 2) 0x00
Volume Control
iFeature 0
AudioControl Interface Descriptor:
bLength 10
bDescriptorType 36
bDescriptorSubtype 6 (FEATURE_UNIT)
bUnitID 10
bSourceID 2
bControlSize 1
bmaControls( 0) 0x01
Mute Control
bmaControls( 1) 0x02
Volume Control
bmaControls( 2) 0x02
Volume Control
iFeature 0
AudioControl Interface Descriptor:
bLength 10
bDescriptorType 36
bDescriptorSubtype 6 (FEATURE_UNIT)
bUnitID 11
bSourceID 3
bControlSize 1
bmaControls( 0) 0x01
Mute Control
bmaControls( 1) 0x02
Volume Control
bmaControls( 2) 0x02
Volume Control
iFeature 0
AudioControl Interface Descriptor:
bLength 10
bDescriptorType 36
bDescriptorSubtype 6 (FEATURE_UNIT)
bUnitID 12
bSourceID 4
bControlSize 1
bmaControls( 0) 0x01
Mute Control
bmaControls( 1) 0x00
bmaControls( 2) 0x00
iFeature 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 0
AudioStreaming Interface Descriptor:
bLength 7
bDescriptorType 36
bDescriptorSubtype 1 (AS_GENERAL)
bTerminalLink 1
bDelay 1 frames
wFormatTag 1 PCM
AudioStreaming Interface Descriptor:
bLength 20
bDescriptorType 36
bDescriptorSubtype 2 (FORMAT_TYPE)
bFormatType 1 (FORMAT_TYPE_I)
bNrChannels 2
bSubframeSize 2
bBitResolution 16
bSamFreqType 4 Discrete
tSamFreq[ 0] 8000
tSamFreq[ 1] 16000
tSamFreq[ 2] 44100
tSamFreq[ 3] 48000
Endpoint Descriptor:
bLength 9
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 9
Transfer Type Isochronous
Synch Type Adaptive
Usage Type Data
wMaxPacketSize 0x00c8 1x 200 bytes
bInterval 1
bRefresh 0
bSynchAddress 0
AudioControl Endpoint Descriptor:
bLength 7
bDescriptorType 37
bDescriptorSubtype 1 (EP_GENERAL)
bmAttributes 0x01
Sampling Frequency
bLockDelayUnits 1 Milliseconds
wLockDelay 1 Milliseconds
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 0
bNumEndpoints 0
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 0
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 2
bAlternateSetting 1
bNumEndpoints 1
bInterfaceClass 1 Audio
bInterfaceSubClass 2 Streaming
bInterfaceProtocol 0
iInterface 0
AudioStreaming Interface Descriptor:
bLength 7
bDescriptorType 36
bDescriptorSubtype 1 (AS_GENERAL)
bTerminalLink 7
bDelay 1 frames
wFormatTag 1 PCM
AudioStreaming Interface Descriptor:
bLength 20
bDescriptorType 36
bDescriptorSubtype 2 (FORMAT_TYPE)
bFormatType 1 (FORMAT_TYPE_I)
bNrChannels 2
bSubframeSize 2
bBitResolution 16
bSamFreqType 4 Discrete
tSamFreq[ 0] 8000
tSamFreq[ 1] 16000
tSamFreq[ 2] 44100
tSamFreq[ 3] 48000
Endpoint Descriptor:
bLength 9
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 5
Transfer Type Isochronous
Synch Type Asynchronous
Usage Type Data
wMaxPacketSize 0x00c8 1x 200 bytes
bInterval 1
bRefresh 0
bSynchAddress 0
AudioControl Endpoint Descriptor:
bLength 7
bDescriptorType 37
bDescriptorSubtype 1 (EP_GENERAL)
bmAttributes 0x01
Sampling Frequency
bLockDelayUnits 0 Undefined
wLockDelay 0 Undefined
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 3
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0 No Subclass
bInterfaceProtocol 0 None
iInterface 0
HID Device Descriptor:
bLength 9
bDescriptorType 33
bcdHID 1.00
bCountryCode 0 Not supported
bNumDescriptors 1
bDescriptorType 34 Report
wDescriptorLength 50
Report Descriptors:
** UNAVAILABLE **
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x87 EP 7 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0010 1x 16 bytes
bInterval 1
Device Status: 0x0000
(Bus Powered)
命令printf '01%030d' | xxd -ps -r | sudo tee /dev/hidraw0
显示错误tee: /dev/hidraw0: Broken pipe
。
[编辑2]
命令sudo evtest /dev/input/event14
对我与设备的交互没有反应
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0xb05 product 0x1743 version 0x100
Input device name: "C-Media Electronics Inc. USB Advanced Audio Device"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 113 (KEY_MUTE)
Event code 114 (KEY_VOLUMEDOWN)
Event code 115 (KEY_VOLUMEUP)
Event type 4 (EV_MSC)
Event code 4 (MSC_SCAN)
Properties:
Testing ... (interrupt to exit)
[编辑3]
这是我的sudo dumpcap -i usbmon1 -w - > usb.pcapng
结果:
http://www.wikiupload.com/Q3QZA5LCTAUS5P2
答案1
您不会“看到”任何音频,/dev/hidraw0
因为控制消息是通过与音频消息不同的端点处理的。控制消息需要可靠的传输,而音频可能会丢失并且通常使用同步传输。
您的测试程序会导致错误,因为它尝试写入长度为 2 的报告。
以下是解码后的 HID 报告描述符(使用 转换hidrd-convert
):
Usage Page (Consumer), ; 05 0C - Consumer (0Ch)
Usage (Consumer Control), ; 09 01 - Consumer control (01h, application collection)
Collection (Application), ; A1 01
Logical Minimum (0), ; 15 00
Logical Maximum (1), ; 25 01
Usage (Volume Inc), ; 09 E9 - Volume increment (E9h, re-trigger control)
Usage (Volume Dec), ; 09 EA - Volume decrement (EAh, re-trigger control)
Report Size (1), ; 75 01
Report Count (2), ; 95 02
Input (Variable), ; 81 02
Usage (Mute), ; 09 E2 - Mute (E2h, on/off control)
Usage (00h), ; 09 00
Input (Variable, Relative), ; 81 06
Usage (00h), ; 09 00
Report Count (4), ; 95 04
Input (Variable), ; 81 02
Logical Maximum (255), ; 26 FF 00
Usage (00h), ; 09 00
Report Size (8), ; 75 08
Report Count (15), ; 95 0F
Input (Variable), ; 81 02
Usage (00h), ; 09 00
Report Count (16), ; 95 10
Output (Variable), ; 91 02
End Collection ; C0
该描述符描述了可以使用请求Set_Report
(通过控制管道)发送的数据的二进制格式。 (看这个人机接口设备 (HID) 文档的设备类定义详细信息,特别是 8.5 报告示例)。
位布局描述符的解释输入报告(设备到主机,您通过中断端点接收它们,请参阅 HID 1.1 的第 4.4 节):
0.0: Volume Increment
0.1: Volume Decrement
0.2: Mute
0.3: (null)
0.4-7: (null)
15 times 8 bits (1 byte): (null)
如果需要发送 HID 报告,请注意输出报告的报告计数为 16(且位大小为 8)。所以一个输出报告(通过中断输出端点发送的报告)为 16 字节。
据我所知,您的设备只能发送必须由操作系统处理的关键事件。它不提供通过软件调整硬件音频电平的功能。
至于无法读取,设备没有有意义的数据可以通过控制管道报告,因此制造商可能没有费心实施Get_Report
方法。顺便问一下,sudo lsusb -v -d 0b05:1743
看起来怎么样?