USB Device 数据读取方式的研究

作者:Sam (甄峰)   sam_code@hotmail.com

随着越来越多的设备通过USB接口与主机连接,我们需要读取USB设备的数据。现就几种不同读取USB Device Data的方法进行探讨。非常欢迎网友补充。


方法一:读取/dev/input/eventX
此方法只对HID设备有效。只要USB设备注明是HID Input设备,则它的数据就会被解析为输入设备并填入/dev/input/eventX.

对此设备的操作和数据读取。见:
http://blog.sina.com.cn/s/blog_602f87700101dno6.html

要系统自动创建/dev/input/eventX. 则需要在Kernel配置中作如下动作:
Device Drivers  ---> Input device support  --->  -*- Generic input layer (needed for keyboard, mouse, ...)
Device Drivers  ---> Input device support  --->  <<font color="#ed1c24">*>   Event interface

优点:ioctl众多,可以得到输入设备非常多的信息。且数据结构明显。读取数据方便。
缺点:数据只包括HID Input 数据,其它非Input Event数据如Raw Data。 则无法从这里得到。




方法二:读取/dev/hidrawX 设备
/dev/hidrawX设备解释:
当支持不是标准的User interface Device的HID Device时。/dev/hidrwa与稍候会提到的/dev/hiddev的区别是:这个Device不处理hid Event. not parsing, no lookups.
要避免使用用户层库  libhid/libusb. ( Sam对Kernel中这个说明也不太明白,因为发现hidraw与libusb可以同时使用的)

要支持/dev/hidraw. 则需要Kernel作如下配置:
Device Drivers  ---> [*] HID Devices  --->  [*]     /dev/hidraw raw HID device support

读取过程:
首先看其数据结构:
#hexdump /dev/hidraw2

0000000 fe04 0054 0000 0000 0001 0000 0000 0000
0000010 0000 0000 0000 ff00 00ff 0000 2300 005a
0000020 fe04 0054 0000 0000 0001 0000 0000 0000
0000030 0000 0000 0000 ff00 00ff 0000 2300 005a
0000040 fe04 0054 0000 0000 0001 0000 0000 0000
0000050 0000 0000 0000 ff00 00ff 0000 2300 005a

以Sam这个设备为例:可以发现每32个字节,数据有个重复。所以推测USB设备每个数据包32字节。

所以可以使用open,read 等方式得到USB Device Raw Data.
相关文章
相关标签/搜索