|
USB設備檢測的一般過程 打開此文件,您若發(fā)現 USB節(jié)為 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。 在成功掛接usb文件系統(tǒng)之后,就會生成文件 /proc/bus/usb/devices,/proc/bus/usb/drivers和目錄/proc/bus/usb/busNo。 掛接usbdevfs文件 您可以通過如下操作實現: D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1 T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 3 T: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh= 0 對于Linux下的usb設備而言,T:(總線拓撲)行用于生成連接在hub上的設備的描述信息,I:(接口信息)行可用于決定每個設備所用的驅動程序,C:(配置信息)可用于列出設備使用最大電流。 USB的枚舉過程 所謂USB設備與主機是通過檢測Vcc上拉電阻的變化來確定是否有設備連接的。在D12內部集成了1.5kΩ的上拉電阻,默認狀態(tài)下不與Vcc相連,程序運行時可以向D12發(fā)送連接命令使1.5kΩ電阻連接到Vcc,這樣主機便檢測到有設備連接。 它的枚舉過程分析如下。 設備連接到總線后,設備從總線獲得5V電源,程序首先初始化,端口,然后向D12發(fā)出USB連接命令。 主機檢測到設備連接。 主機向設備發(fā)出第一個信號:總線復位??偩€復位產生一個中斷,并且D12器件在默認地址0處使能,以便在接下來的枚舉過程中使用地址0傳輸命令和數據,同 時中斷寄存器的總線復位位被置為1。在程序中的表現是,D12向主循環(huán)請求中斷,進入中斷處理程序USB_int_handler(),讀取中斷寄存器, 確定中斷的類型,進行相應的處理。 主機使用默認地址0讀取設備描述符。 具體過程是:主機向D12發(fā)送第一個Setup包,每個Setup包都是8個字節(jié),第一個包Get Descriptor的內容為:80 06 00 01 00 00 40 00 ,數據為16進制表示。其中的40表示返回的數據最大長度為40H字節(jié)。此Setup包存儲在D12的端點0緩沖區(qū)中,并產生一個外部中斷。(這時在 D12的中斷寄存器中保存了中斷的類型:端點0的OUT中斷,即中斷寄存器字節(jié)1的值應為0x01)進入中斷服務程序后,由于D12端點0的緩沖區(qū)只有 16個字節(jié),所以單片機就先發(fā)送16個字節(jié)的設備描述符。 當主機接收到這16個字節(jié)的字符后,就認為真正有設備連接了。 地址分配。 主機向D12發(fā)送第二個Setup包,這是一個含有指定地址的數據包,其內容一般為:00 05 02 00 00 00 00 00 ,其中的02就表示主機為設備分配的地址為0x02,在以后的通信里設備就只對0x02地址的信息作出應答。D12收到這個Setup包后同樣產生一個中斷(端點0的OUT中斷),需要注意的是單片機處理這個中斷時需要向主機返回一個長度為0的空數據包。 主機從新的地址獲取設備描述符。 主機收到設備發(fā)來的空的應答數據包后,確認地址分配成功。然后主機向D12發(fā)送第三個Setup包,再次要求獲取設備描述符。這個Setup包的內容一般是:80 06 00 01 00 00 12 00 。與上次不同的是,這次要求實際的描述符長度,其中的12(十六進制數)表示要求得到全部18字節(jié)的設備描述符。因為每次只能發(fā)送16字節(jié),因此程序中要分兩次完成此要求。第一次16字節(jié),第二次2字節(jié)。 主機讀取配置描述符。 成功得到18字節(jié)的設備描述符后,主機向D12發(fā)送第四個Setup包,要求得到設備的配置描述符。這個Setup包的數據為:80 06 00 02 00 00 09 00 。其中的09指定設備返回9字節(jié)數據,這正是配置描述符的長度。 讀取描述符集合。 成功得到9字節(jié)的配置描述符后,主機向D12發(fā)送第五個Setup包,要求得到設備的配置描述符、接口描述符、端點描述符的集合。這次Setup包的內容是:80 06 00 02 00 00 FF 00 。由于不知道描述符集合的真實長度,因此它要求得到256字節(jié)。 到這一步,主機現在應該已經發(fā)現新硬件并為新設備安裝好驅動程序。對于以上過程,主機是在總線驅動層處理,下面的一步,也是典型枚舉過程的最后一步,就需要設備驅動程序來做了。 數值配置。 主機得到各種描述符之后,認為設備的信息已經齊全,便對設備進行配置,使設備從地址狀態(tài)進入配置狀態(tài)。 主機向D12發(fā)送第六個Setup包,其數據為:00 09 01 00 00 00 00 00 。程序中需要調用Set Configuration()函數處理此事件,允許所有端點進入工作狀態(tài)。 至此,USB枚舉過程結束,設備可以正常使用了。在這個過程中D12指示燈根據通信的狀況間歇閃爍。 USB 最主要的的是要理解 USB主機發(fā)送命令給設備,設備要對主機的命令進行響應, USB通訊的基本單位為 “包” 理解好“包”這個概念是學習USB的關鍵所在。 包有如下分類: 令牌包:可分為輸入包、輸出包、設置包和幀起始包(注意這里的輸入包是用于設置輸入命令的,輸出包是用來設置輸出命令的,而不是放據數的)其中輸入包、輸出包和設置包的格式都是一樣的: SYNC+PID+ADDR+ENDP+CRC5(五位的校驗碼) 下面舉幾個例子來說明USB的通訊過程: lsusb輸出內容詳細解讀lsusb(選項)
-v:顯示USB設備的詳細信息; -s<總線:設備號>僅顯示指定的總線和(或)設備號的設備; -d<廠商:產品>:僅顯示指定廠商和產品編號的設備; -t:以樹狀結構顯示無理USB設備的層次; -V:顯示命令的版本信息。 ----------------------------------------- Bus 005 Device 001: ID 0000:0000 Bus 001 Device 001: ID 0000:0000 Bus 004 Device 001: ID 0000:0000 Bus 003 Device 001: ID 0000:0000 Bus 002 Device 006: ID 15d9:0a37 Bus 002 Device 001: ID 0000:0000 內容解讀: ----------------------------------------- Bus 005 表示第五個usb主控制器(機器上總共有5個usb主控制器 -- 可以通過命令lspci | grep USB查看)
Device 006 表示系統(tǒng)給usb鼠標分配的設備號(devnum),同時也可以看到該鼠標是插入到了第二個usb主控制器 006 usb_device.devnum /sys/devices/pci0000:00/0000:00:1d.1/usb2/2-2/devnum ID 15d9:0a37 表示usb設備的ID(這個ID由芯片制造商設置,可以唯一表示該設備) 15d9 usb_device_descriptor.idVendor 0a37 usb_device_descriptor.idProduct /sys/devices/pci0000:00/0000:00:1d.1/usb2/2-2/idVendor Bus 002 Device 006: ID 15d9:0a37 Bus 002 Device 001: ID 0000:0000 表示002號usb主控制器上接入了兩個設備: 一個是usb根Hub -- 001 一個是usb鼠標 -- 006 轉自: http://www.ahfyzs.com/content/14/0722/15/14129940_396294047.shtml
通用串行總線(USB)被設計成為連接計算機外設的標準,如鍵盤、鼠標、打印機、數碼相機、便攜式媒體播放器、磁盤和網絡適配器等等 - 來源:Wikipedia
它已經成為了一個工業(yè)標準,現在很難看到一個沒有USB口的計算機了。USB閃存的使用使得它更加流行。在Linux上,我們可以使用lsusb來列出USB設備和它的屬性。 什么是lsusb在它的手冊上,lsusb定義成:
如何運行l(wèi)susb? 要運行l(wèi)susb,你可以直接在控制臺輸入lsusb。 $ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 003: ID 17ef:4811 Lenovo Integrated Webcam [R5U877]
Bus 008 Device 002: ID 0a5c:217f Broadcom Corp. Bluetooth Controller
lsusb會顯示驅動和內部連接到你系統(tǒng)的設備。 下面介紹如何理解輸出。我抓取了上面輸出的最后一行: Bus 008 Device 002 : ID 0a5c:217f Broadcom Corp. Bluetooth Controller
我們同樣可以看到在我們的系統(tǒng)中同時使用了USB2.0 root hub驅動和USB 1.1 root hub驅動。 用dmesg命令同樣可以看到。下面是一個例子。 $ dmesg |grep -i usb
[ 0.353138] usbcore: registered new interface driver usbfs
[ 0.353150] usbcore: registered new interface driver hub
[ 0.353182] usbcore: registered new device driver usb
[ 0.730026] ehci_hcd: USB 2.0 ‘Enhanced’ Host Controller (EHCI) Driver
[ 0.730116] ehci_hcd 0000:00:1a.7: new USB bus registered, assigned bus number 1
[ 0.748019] ehci_hcd 0000:00:1a.7: USB 2.0 started, EHCI 1.00
[ 0.748169] hub 1-0:1.0: USB hub found
[ 0.748336] ehci_hcd 0000:00:1d.7: new USB bus registered, assigned bus number 2
[ 0.768019] ehci_hcd 0000:00:1d.7: USB 2.0 started, EHCI 1.00
[ 0.768147] hub 2-0:1.0: USB hub found
[ 0.768236] ohci_hcd: USB 1.1 ‘Open’ Host Controller (OHCI) Driver
[ 0.768251] uhci_hcd: USB Universal Host Controller Interface driver
如何列出USB詳細信息使用-v選項來開啟。下面是一個例子。 $ lsusb -v
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 5
bNumEndpoints 2
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×83 EP 3 IN
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0×0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×03 EP 3 OUT
bmAttributes 1
Transfer Type Isochronous
Synch Type None
Usage Type Data
wMaxPacketSize 0×0040 1x 64 bytes
bInterval 1
找出連接了多少USB設備使用下面的命令 $ find /dev/bus
接著你會看到像下面的輸出: /dev/bus
/dev/bus/usb
/dev/bus/usb/008
/dev/bus/usb/008/002
/dev/bus/usb/008/001
/dev/bus/usb/007
/dev/bus/usb/007/001
/dev/bus/usb/006
/dev/bus/usb/006/001
/dev/bus/usb/005
/dev/bus/usb/005/001
/dev/bus/usb/004
/dev/bus/usb/004/001
/dev/bus/usb/003
/dev/bus/usb/003/001
/dev/bus/usb/002
/dev/bus/usb/002/004
/dev/bus/usb/002/003
/dev/bus/usb/002/001
/dev/bus/usb/001
/dev/bus/usb/001/001
使用lsusb 命令 的-D 選項,你可以打印特定設備的詳細信息。下面是一個博通藍牙設備的示例。 $ lsusb -D /dev/bus/usb/008/002
Device: ID 0a5c:217f Broadcom Corp. Bluetooth Controller
Couldn’t open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 224 Wireless
bDeviceSubClass 1 Radio Frequency
bDeviceProtocol 1 Bluetooth
bMaxPacketSize0 64
idVendor 0x0a5c Broadcom Corp.
idProduct 0x217f Bluetooth Controller
bcdDevice 3.60
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 216
bNumInterfaces 4
bConfigurationValue 1
iConfiguration 0
bmAttributes 0xe0
Self Powered
Remote Wakeup
MaxPower 0mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 3
bInterfaceClass 224 Wireless
bInterfaceSubClass 1 Radio Frequency
bInterfaceProtocol 1 Bluetooth
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0×0010 1x 16 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0×0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0×02 EP 2 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0×0040 1x 64 bytes
bInterval 1
找出大容量存儲設備既然 lsusb -v給我們很詳細的信息,那么你或許會錯過一些信息。我們可以使用grep命令指定特定的信息。 大容量存儲設備會有一個供應商名和ID。我們可以用它作為一個起點。 $ lsusb -v |grep -Ei ‘(idVendor|Mass\ Storage)’
idVendor 0×1005 Apacer Technology, Inc.
bInterfaceClass 8 Mass Storage
你可以看到,我們系統(tǒng)上有一個來自Apacer Technology, Inc的USB大容量存儲設備。 以樹層級結構輸出USB設備使用 -t選項滿足這個要求 $ lsusb -t
/: Bus 08.Port 1: Dev 1, Class=root\_hub, Driver=uhci_hcd/2p, 12M
/: Bus 07.Port 1: Dev 1, Class=root\_hub, Driver=uhci_hcd/2p, 12M
/: Bus 06.Port 1: Dev 1, Class=root\_hub, Driver=uhci_hcd/2p, 12M
/: Bus 05.Port 1: Dev 1, Class=root\_hub, Driver=uhci_hcd/2p, 12M
/: Bus 04.Port 1: Dev 1, Class=root\_hub, Driver=uhci_hcd/2p, 12M
/: Bus 03.Port 1: Dev 1, Class=root\_hub, Driver=uhci_hcd/2p, 12M
/: Bus 02.Port 1: Dev 1, Class=root\_hub, Driver=ehci_hcd/6p, 480M
|__ Port 1: Dev 4, If 0, Class=stor., Driver=usb-storage, 480M
|__ Port 6: Dev 3, If 0, Class=’bInterfaceClass 0x0e not yet handled’, Driver=uvcvideo, 480M
|__ Port 6: Dev 3, If 1, Class=’bInterfaceClass 0x0e not yet handled’, Driver=uvcvideo, 480M
/: Bus 01.Port 1: Dev 1, Class=root\_hub, Driver=ehci_hcd/6p, 480M
數字12M和480M 是指USB類型的傳輸速率。
如果你找到5.0G,那意味這你有USB 3.0類型接口。它有5.0Gbit/s的傳輸速率。Linux從/var/lib/usbutils/usb.ids識別USB設備的詳細信息?;蛘吣憧梢栽L問Linux-USB.org獲取最新的USB ID列表。 這些就是lsusb命令的基礎。你可以用lsusb命令對你的系統(tǒng)上的USB設備做一個診斷。一般來說,你可以通過lsusb的手冊探索命令的更多詳細細節(jié)。只要輸入man lsab來打開它的手冊。 轉自: http://www./Linux/2014-01/94874.htm |
|
|