Linux下USB设备检测

 

USB设备检测也是通过/proc目录下的USB文件系统进行的。为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块。在检测开始时,一般要先检测是否存在/proc/bus/usb目录,若不存在则尝试插入USB桥接模块。

现在一般的USB桥接器模块有两种类型,UHCI和OHCI。在决定插入那一个桥接器模块时,可以察看/proc/pci文 件来决定。打开此文件,您若发现 USB节为 I/O at 0xHHHH格式(例如出现 I/O at 0xe000 [0xe01f]),HHHH为16进制数,则桥接器类型为UHCI。若是它为32 bit memory at 0xHH000000形式 (例如出现32 bit memory at 0xee000000),HH为16进制数,则桥接器类型为OHCI。但是若您的桥接器类型不满足上述任何一种情况,唯一的解决办法就是您尝试插入这两种 模块,直到成功为止。一般而言,UHCI类型的桥接器它的插入模块是uhci或usb-uhci(由内核版本决定);而对于OHCI类型的桥接器它的插入 模块是ohci 或usb-ohci。

您在正确的插入了桥接器模块之后,这时/proc文件系统下就会出现USB设备目录,不过这时这个目录是空的,没 有任何文件。这时您就必须挂接usbdevfs文件系统,然后通过此文件系统检测连接的设备。在成功挂接usb文件 系统之后,就会生成文件 /proc/bus/usb/devices,/proc/bus/usb/drivers和目录--/proc/bus/usb/busNo。挂接 usbdevfs文件您可以通过如下操作实现:

mount -t usbdevfs none /proc/bus/usb

或在


 /etc/fstab上加入
none /proc/bus/usb usbdevfs defaults 0 0

然后通过/proc/bus/usb/devices文件的内容,您就可以获得连接的设备信息,包括设备标识和制造商标是等信息。

[ 编辑]

usb设备类型描述

设备规范 设备类码 接口类码
应用程序特定 - 0xFE
声音接口 0x00 0x01
通信设备 0x02 -
CDC控制接口 - 0x02
CDC数据接口 - 0x0A
HID 0x00 0x03
HUB 0x09 0x09
批量存储设备 0x00 0x08
监视器 same as HID same as HID
电源设备 same as HID same as HID
物理设备 - 0x05
打印机 - 0x07
供应商特定 - 0xFF
[ 编辑]

usb文件系统简介

T = 总线拓扑结构(Lev, Prnt, Port, Cnt, 等),是指USB设备和主机之间的连接方式
B = 带宽 (仅用于USB主控制器)
D = 设备描述信息
P = 产品标识信息
S = 串描述符
C = 配置描述信息 (* 表示活动配置)
I = 接口描述信息
E = 终端点描述信息

提示:一般格式:

d = 十进制数
x = 十六进制数
s = 字符串
[ 编辑]

拓扑信息

T: Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=ddd MxCh=dd

| | | | | | | | |__最大子设备

| | | | | | | |__设备速度(Mbps)

| | | | | | |__设备编号

| | | | | |__这层的设备数

| | | | |__此设备的父连接器/端口

| | | |__父设备号

| | |__此总线在拓扑结构中的层次

| |__总线编号

|__拓扑信息标志

[ 编辑]

带宽信息

B: Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd
| | | |__同步请求编号
| | |__中断请求号
| |__分配给此总线的总带宽
|__带宽信息标志
[ 编辑]

设备描述信息和产品标识信息

D: Ver=x.xx Cls=xx(s) Sub=xx Prot=xx MxPS=dd #Cfgs=dd
P: Vendor=xxxx ProdID=xxxx Rev=xx.xx

D: Ver=x.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd
| | | | | | |__配置编号
| | | | | |______缺省终端点的最大包尺寸
| | | | |
| | | | |__设备协议
| | | |__设备子类型
| | |__设备类型
| |__设备USB版本
|__设备信息标志编号#1
P: Vendor=xxxx ProdID=xxxx Rev=xx.xx
| | | |__产品修订号
| | |__产品标识编码
| |__制造商标识编码
|__设备信息标志编号#2
[ 编辑]

串描述信息

S: Manufacturer=ssss
| |__设备上读出的制造商信息
|__串描述信息

S: Product=ssss
| |__设备上读出的产品描述信息,对于USB主控制器此字段为"USB *HCI Root Hub"
|__串描述信息

S: SerialNumber=ssss
| |__设备上读出的序列号,对于USB主控制器它是一个生成的字符串,表示设备标识
|__串描述信息

[ 编辑]

配置描述信息

C: #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA
| | | | |__最大电流(mA)
| | | |__属性
| | |__配置编号
| |__接口数
|__配置信息标志
[ 编辑]

接口描述信息(可为多个)

I: If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=ssss
| | | | | | | |__驱动名
| | | | | | |__接口协议
| | | | | |__接口子类
| | | | |__接口类
| | | |__中断点数
| | |__可变设置编号
| |__接口编号
|__接口信息标志
[ 编辑]

终端点描述信息

E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddms
E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddms
| | | | |__间隔
| | | |__终端点最大包尺寸
| | |__属性(终端点类型)
| |__终端点地址(I=In,O=Out)
|__终端点信息标志 '
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux是一个开源的操作系统,拥有广泛的支持和使用,同时Python是一种高级编程语言,也是Linux下广泛使用的编程语言之一。检测USB设备的过程在Linux下可以通过Python脚本实现。 检测USB设备的过程分为两部分:首先是检测USB设备的插拔事件,其次是识别这些设备的信息。 在Linux检测USB设备的插拔事件可以使用UDEV模块,该模块是Linux系统中的一个重要模块,可以用于监控和管理系统事件。我们可以使用Python来编写UDEV事件处理器,来获取USB设备插拔时的事件信息。如下所示: ```python import pyudev # 创建一个UDEV事件监听器 context = pyudev.Context() # 监听UDEV事件 monitor = pyudev.Monitor.from_netlink(context) monitor.filter_by(subsystem='usb') # 处理UDEV事件 for device in iter(monitor.poll, None): print(device) ``` 在上面的代码中,我们使用pyudev模块中的Monitor类来创建一个UDEV事件监听器,同时指定其关心的USB设备的子系统。然后使用iter()函数来监控UDEV事件,并打印出设备信息。 识别USB设备的信息,可以使用标准的Linux命令来获取设备的信息,如lsusb等。我们同样可以使用Python来执行这些命令,并解析命令的输出来获取设备的信息。如下所示: ```python import subprocess # 执行lsusb命令 proc = subprocess.Popen(['lsusb', '-v'], stdout=subprocess.PIPE) out, err = proc.communicate() # 解析命令输出 for line in out.splitlines(): if b"iProduct" in line: product = line.split(b":")[1].strip() print(product) ``` 在上面的代码中,我们使用subprocess模块中的Popen类来执行lsusb命令,并获取命令的输出。然后使用split()方法和strip()方法来解析命令输出,并获取设备的信息。 以上代码仅仅是一个简单的示例,实际上可以根据需求进行更多的操作。需要注意的是,在使用UDEV模块时,需要在Linux系统中安装该模块;同时在执行Linux命令时,需要确保系统中已经安装了相应的命令并添加到系统的环境变量中。 总之,Python脚本可以方便地监控和识别USB设备,并实现相应的操作。这对于需要实现USB设备自动检测和管理的应用场景非常有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值