(1)用户模式USB
usbfs虚拟文件系统允许从用户空间以原始方式访问USB设备。usbfs通常挂载在/proc/bus/usb/上,usbfs树包含了系统中与每个USB控制器(或总线)对应的目录,每个目录依次包含了与该总线上的USB设备相对应的结点。
为了更好地理解usbfs,我们看一下包含英特尔ICH4南桥芯片组的系统。USB控制器是PC系统中南桥芯片组的1部分。ICH4支持1个USB EHCI(高速USB 2.0)控制器和3个USB UHCI控制器,我们称EHCI控制器为bus1,3个UHCI控制器分别为bus2、bus3和bus4。现在假设系统只有2个物理USB端口,它们与bus3 相应的UHCI控制器连接。
我们将一个全速尼康数码相机和高速希捷USB 2.0硬盘连接到系统上的2个USB。先看一下/proc/bus/usb/devices,找到相关入口:
bash> ls –lR /proc/bus/usb/devices
T: Bus=03 Lev=01 Prnt=01 Port=01 Cnt=01 Dev#= 5 Spd=12 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=04b0 ProdID=0205 Rev= 1.00
S: Manufacturer=NIKON
S: Product=NIKON DSC E5200
S: SerialNumber=2507597
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 2mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50
Driver=usb-storage
E: Ad=01(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms
E: Ad=82(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms
T: Bus=01 Lev=01 Prnt=01 Port=02 Cnt=01 Dev#= 12 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=0bc2 ProdID=0501 Rev= 0.01
S: Manufacturer=Seagate
S: Product=USB Mass Storage
S: SerialNumber=000000062459
C:* #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50
Driver=usb-storage
E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms
E: Ad=88(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms
(2)libusb。与插入设备相应的usbfs文件包含了相关的USB设备及配置描述符。在前面的例子中,读取/proc/bus/usb/003/003
可获得相机的描述符信息,读取/proc/bus/usb/001/007可获得硬盘描述符信息。但管理usbfs文件并不是那么简单的,因为设备文件名在设备拔出后需要重新使用。解决办法是用libusb库,它封装使用usbfs。使用libusb而不直接操作usbfs,还有一个好处:只要操作