Android通过cat /sys/kernel/debug/usb/devices获取USB信息
cat /sys/kernel/debug/usb/devices得到的信息如下
下圖是我們產品USB 拓撲圖
?
USB設備通過debugfs導出/sys/kernel/debug/usb/devices顯示內核已知的每個USB設備及其配置描述符,比如下面EHCI控制器的信息
每個設備debugfs文件系統對應的文件內容包含有如下內容:
T = Topology (etc.)拓撲結構
B = Bandwidth (applies only to USB host controllers, which are
??? virtualized as root hubs)帶寬信息,只用于USB Host控制器,它被虛擬為一個root hub
D = Device descriptor info.設備描述符信息
P = Product ID info. (from Device descriptor, but they won't fit
??? together on one line)產品ID信息,來至于設備描述符。
S = String descriptors.字符串描述符
C = Configuration descriptor info. (* = active configuration)配置描述符信息
I = Interface descriptor info.接口描述符信息
E = Endpoint descriptor info.端點描述符信息
?
T:? Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=? 1 Spd=480? MxCh= 1
Bus:表示總線號。
Lev:表示此USB設備位于所在總線拓撲結構的層次,見圖1,EHCI控制器對應的Lev=00,其下面掛接的HUB的Lev=01,掛載在HUB下的USB網卡的Lev=02。
Prnt:表示父設備數量,比如EHCI控制器是root,位于最頂層,其Prnt=0,其下面掛接的HUB的Prnt=01,掛載在HUB下的USB網卡的Prnt=02(包括EHCI控制器和HUB)。
Port:此USB設備的父設備上的連接器/端口,比如HUB的父設備是EHCI控制器
For reasons lost in the mists of time, the Port number is always
??? too low by 1(意思是從0開始).? For example, a device plugged into port 4 will
??? show up with "Port=03".
EHCI是第1層:Port=00。
HUB是第2層:為Port=00:其父設備是EHCI,而且只有一個,根據規則(端口號從0開始編號),所以也是0
USB攝像頭、USB網卡和U盤是第3層:port的值分別是00、01、02。
?
Cnt:這層的枚舉到的第幾個USB設備,比如USB攝像頭的Cnt=01,USB網卡的Cnt=02,U盤的Cnt=03。
?
Dev:表示設備編號,EHCI為1,HUB為2,USB網卡為3,U盤為4,按順序排列的,一個總線上最多掛127個;可以有多個總線。
Spd:設備速率,單位為Mbps
可能的速率為
??? 1.5?? Mbit/s for low speed USB
?????? 12??? Mbit/s for full speed USB
?????? 480? Mbit/s for high speed USB (added for USB 2.0);
????????????? ? also used for Wireless USB, which has no fixed speed
?????? 5000?????? Mbit/s for SuperSpeed USB (added for USB 3.0)
MxCh:當前設備可連接的子設備最大數量,比如EHCI的MxCh=1表示EHCI下可以連接一個USB設備;HUB的MxCh=4表示此HUB可最多連接4個USB設備;USB網卡的MxCh=0表示它下面不能連接USB設備了,也就是最底層。
?
2.B帶寬信息
Alloc:該總線分配得到的帶寬。寬帶分配在使用中是一個近似值,此值表示一幀需要多少ms。
Int:中斷請求數
Iso:同步請求數,USB有四大傳輸,中斷、控制、批量和同步。
?
3. D設備描述符信息
Ver:USB協議版本,比如Ver=2.00。
Cls:由USB-IF(USB Implementers Forum)分配的設備類類碼,Hub對應09;廠家自定義的為ff;如果該字段為0x00,表示由接口描述符bInterfaceClass來指定。
?
官方鏈接:https://www.usb.org/defined-class-codes
?
Cls=08h,可知是Mass Storage類
Sub:設備子類,USB子類代碼,由USB-IF分配。
Prot:設備協議碼,由USB-IF分配。如果D的Cls和Sub都為00,則該字段也必須為00,采用I的Prot=50。
MxPs:默認斷電的最大包大小,只有8、16、32或64有效。
Cfgs:表示設備支持的配置數量。僅表示當前運行速度下的配置數量。計數中不包括其他運行速度的配置。 如果特定速度的設備有特定配置,則bNumConfigurations字段僅反映單個速度的配置數量,而不是兩個速度的配置總數量。這里的EHCI、HUB、USB網卡和U盤下的Cfgs都是1,因為只使用了一個配置,所以設置為1
?
4. P產品ID信息
Vendor:廠商ID,比如ECHI的vendor=1d6b
ProdID:廠商產品的ID,比如ECHI的ProdID=0002表示支持USB2.0的產品。
Rev:產品版本號,比如3.18這里指linux內核版本。
USB-IF為廠商分配的vendor和product ID的鏈接http://www.linux-usb.org/usb.ids。
5.?S字符串描述符信息
Manufacturer:從設備中讀到的生產商描述性信息,比如USB網卡Manufacturer=ASIX Elec. Corp.
Product:從設備中讀取的產品描述性信息,比如USB網卡Product=AX88772B,比如EHCI控制器的Product=EHCI Host Controller,這在kernel\msm-3.18\drivers\usb\host\ehci-hcd.c中定義。
SerialNumber:從設備中讀取的產品序列號
?
6. C配置描述符信息
Ifs:此配置支持的USB接口數量,每個配置有一個或多個接口組成,每個接口具有獨特的功能,并且綁定到不同的USB設備驅動。一個常見的例子是一個USB播放器,它帶有一個播放的音頻接口和一個用于音量控制的HID接口。EHCI、HUB,HUB下的U盤和USB網卡的Ifs都是1,說明它們支持1個USB接口。HUB下的USB攝像頭的Ifs是2,說明它支持2個USB接口。
Cfg:此配置配置數量,這里我們的都是01。
Atr:屬性,供電配置,位詳細定義如下:
????????????????????????? D7????????????? 保留,必須置1
????????????????????????? D6????????????? 自供電模式
????????????????????????? D5????????????? 遠程喚醒
????????????????????????? D4~D0????? 保留
MPwr:最大功耗,以2mA為單位,例如0x32為50*2=100mA。 USB設備供電有兩種方式,self-powered和bus-powered兩種方式,驅動代碼會判斷設備標志寄存器是否過流的。最大500mA。
?
7.I接口描述符信息
If:該接口編號,接口編號從0開始分配,當一個配置有多個接口時,就用該字段來區分不同的接口。我們這里的If都為0
Alt:USB設備配置與USB配置描述符是一一對應的, 即一個配置只能有一個配置描述符。雖然由bInterfaceNumber字段可知, 每一個接口都有一個惟一確定的接口編號, 但是一個接口卻可以由不只一個接口描述符來描述它。USB 允許多個接口描述符來描述同一個接口, 且這些描述符都可通過命令切換。此字段就是每一個這類描述符惟一的編號。USB可通過調用這個字段來切換描述同一個接口的不同描述符。控制傳輸中的Get_Inter face 命令可以用來得到目前正在使用的描述一個確定接口的接口描述符的編號, 即此字段。而Set_Inte rface 命令則以此字段值為參數, 用來使相應的接口描述符描述某個確定的接口。我們這里的Alt都為0。
Eps:端點數量,不包括端點0。USB網卡AX88772C這里的Alt=3(不包括Endpoint0)
AX88772C關于端點的說明
Cls:接口類碼,比如HUB的為09h,USB-IF分配的類代碼,0預覽未來使用,0xFF表示接口類是廠家自定義,其他值由USB-IF指定。
Sub:接口子類碼。USB-IF分配的子類代碼,由Cls限制
Prot:接口的協議,如果一個接口支持特定類請求,此代碼標識由特定設備類定義的協議,如果該字段為0,設備部在此接口不使特定類的協議,如果該字段為0xFF,設備為此接口使用廠家自定義協議。
Driver:驅動名字
?
8.E端點描述符信息。
Ad:端點地址(I=In,O=out)
Atr:端點屬性。
MxPS:端點所支持最大數據包的長度。
Ivl:端點數據傳輸的訪問時間間隔。對于全速/低速的中斷端點,取值范圍為 1~255,對于高速中斷端點,取值范圍為1~16,詳細定義可以參考USB協議。比如HUB的Ivl=256ms。
?
參考鏈接:
/sys/kernel/debug/usb/devices解析
https://www.cnblogs.com/hellokitty2/p/9418895.html
?
Linux下,查看USB設備信息
https://blog.csdn.net/zouli415/article/details/79886084
?
linux下的ehci控制器調試
https://blog.csdn.net/xiaojsj111/article/details/41864597
?
lsusb、usbfs查看usb拓撲結構
https://blog.csdn.net/shichaog/article/details/42269483
?
總結
以上是生活随笔為你收集整理的Android通过cat /sys/kernel/debug/usb/devices获取USB信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USB2.0 设备类代码表
- 下一篇: Android高通平台下编译时能生成(拷