以USB轉串口為例。通常設備節點名為ttyUSBx(x為0 ~ n),Linux內核會根據插入設備的順序進行編號。例如,第壹個插入的設備的編號為0,然後相應地添加1。
如果只用設備節點ttyUSBn來區分是哪個設備,會造成混淆,因為最後壹位的數字會隨時變化。不能保證設備A是0,設備B是1。其實這個問題在LDD3裏面已經提到了,目前的內核已經解決了類似的問題,會把所有的USB設備都引到sys文件系統。其實每個USB口都有唯壹的端口號,相當於每個店的門牌號。只要我們根據端口號來區分設備,問題就解決了。
例如,當前設備插入兩個USB轉串行設備後,檢查ttyUSBn所在端口的端口號:
root @ Android:/$ ls-l/sys/class/tty/
...
lrwxrwxrwx root root 2011-01-01 13:40 ttyusb 0-& gt;../../devices/ff 540000 . USB/USB 3/3-1/3-1.1/3-1.1:1.0/ttyusb 0/tty/ttyusb 0
lrwxrwxrwx root root 2011-01-01 13:43 ttyusb 1->../../devices/ff 540000 . USB/USB 3/3-1/3-1.2/3-1.2:1.0/ttyusb 1/tty/ttyusb 1
root@android:/ $ 12345
ttyUSB0的端口號為3-1.1,ttyUSB1的端口號為3-1.2。
其他類型的USB設備也是如此,以上思路已經清理完畢。
檢查系統當前的usb設備,下面是第二列排序的結果。
$ lsusb
總線001設備001:ID XXX:XXX Linux Foundation 2.0根集線器
總線001設備002: ID xxx:xxx英特爾公司集成速率匹配中樞
總線001設備003: ID xxx:xxx Genesys Logic,Inc. GL827L SD/MMC/MS閃存卡讀卡器
總線001設備005: ID xxx:xxx飛利浦(或恩智浦)
總線002設備001:ID XXX:XXX Linux Foundation 2.0根集線器
總線002設備002: ID xxx:xxx英特爾公司集成速率匹配中樞
總線002設備003: ID xxx:xxx英特爾公司
總線003設備001:ID XXX:XXX Linux Foundation 2.0根集線器
總線004設備001:ID XXX:XXX Linux Foundation 3.0根集線器
第二列是usb設備的集線器號。pc中的usb設備連接到集線器。即使妳的主板提供了很多usb口,實際上也是連接到集線器的。
第四列是usb設備的序列號和本機設備的序列號。
所以以上信息顯示有四個usb hub(3個(三個usb2.0,壹個usb3.0)。如果
粗體字,我的機器上有三個設備,001.003是機箱自帶的讀卡器,001.005是無線鍵盤,002.003是intel無線網卡的藍牙模塊(詳見下文)。
Usb設備也可以在內核文件/sys/bus/usb/devices中找到。Linux將所有設備驅動程序映射到/sys。
ls-1/sys/bus/USB/devices/
1-0:1.0
1-1
1-1:1.0
1-1.2
1-1.2:1.0
1-1.4
1-1.4.1
1-1.4:1.0
1-1.4.1:1.0
1-1.4.1:1.1
1-1.4.1:1.2
1-1.5
1-1.5:1.0
1-1.5:1.1
1-1.5:1.2
2-0:1.0
2-1
2-1:1.0
2-1.5
2-1.5:1.0
2-1.5:1.1
3-0:1.0
4-0:1.0
usb1
usb2
usb3
usb4
都是符號連接妳也可以用ls -l /sys/bus/usb/devices/
輸出看起來很混亂。使用udevadm工具可以清楚地列出設備信息。該命令如下所示:
udevadm info-p/sys/bus/USB/devices/USB 1-q屬性
那麽我們如何找出它是哪壹個usb設備呢?
總線002設備003: ID xxx:xxx英特爾公司
第二列002應該可以在所有從2開始的文件中找到,接下來的壹列符合第壹條規則。
2-0:1.0
2-1
2-1:1.0
2-1.5
2-1.5:1.0
2-1.5:1.1
通常情況下,系統的usb hub占據負號後的第壹個0。第壹個2-0:1.0是usb hub。
2-1.5*檔就是以上設備。
$ udevadm info-p/sys/bus/USB/devices/2-1.5-q屬性
BUSNUM=002
DEVNAME=/dev/bus/usb/002/003
DEVNUM=003
............
ID_MODEL_ID=xxx
............
ID_VENDOR=xxx
............
ID _ VENDOR _ FROM _ DATABASE = Intel corp
............
002和003是lsusb的2/4和6列,來自modelID和vender。
lsusb裏的東西就是這麽來的。
問題是,妳怎麽知道是藍牙?答案是繼續向udevadm查詢:
$ udevadm info-p/sys/bus/USB/devices/2-1.5:1.0-q屬性
ID _ USB _ CLASS _ FROM _ DATABASE =無線
ID _ USB _協議_ FROM _數據庫=藍牙
ID _ USB _ SUBCLASS _ FROM _ DATABASE =射頻
ID _ VENDOR _ FROM _ DATABASE = Intel corp