USB 驅動相關基礎知識記錄

1. usb基本概念,速度,發展狀況等
usb_20.pdf中解釋了USB(Universal Serial Bus,通用串行總線)的最初目的:
        ○ Connection of the PC to the telephone ——> 廉價的方案實現計算機領域和通信領域的連接
        ○ Ease-of-use ——> 支持即插即用
        ○ Port expansion ——> 接口統一
    a. usb理論傳輸速度:
        USB 1.0的傳輸速度是1.5Mbps=192KB/s,稱爲低速USB,如USB鍵盤鼠標等
        USB 1.1的傳輸速度是12Mbps=1.5MB/s,稱爲全速USB
        USB 2.0的傳輸速度是480Mbps=60MB/s,稱爲高速USB,如USB存儲器等
        USB 3.0的傳輸速度是5Gbps=600MB/s,稱爲超高速USB,如USB移動硬盤等
        USB 3.2···
    b. usb接口類型及引腳定義
        USB的接口類型,根據接口形狀不同,主要可以分爲三大類:
            i. 普通的硬件直接叫做Type
            ii. 小型版本的叫Mini迷你的
            iii. 更加小的,叫做Micro微小的
    其中每一種大類中,又都可以分爲兩類
            i. A類(Type A)
            ii. B類(Type B)

    下面詳細對比USB的各種接口,包括對應的插頭和插座:

引腳定義:

                    USB 2.0                                                        USB 3.0

        USB2.0向下兼容USB1.0和1.1,host和設備之間的速度識別,依靠D+和D-線的電平高低及枚舉時雙方通信確定的。
    c. USB主機控制器分類:
            i. UHCI(Universal Host Controller Interface,通用主機控制器接口):該標準有Intel提出,常用在基於Intel的PC機上
            ii. OHCI(Open Host Controller Interface,開放主機控制器接口):由Compaq,Microsoft等公司提出.
            共同點:都是基於USB 1.1的標準的,完全符合USB協議標準。
            不同點:
                    OHCI更多地把要做的事情,用硬件來實現,因此實現OHCI的USB控制器(HCD->Host Controller Drivers)的軟件驅動的開發工作,相對要容易些,軟件要做的事情相對較少。對應地,OHCI更多地應用在擴展卡,尤其是嵌入式領域中,常見的很多開發板中的USB的控制器,很多都是OHCI的。而UHCI把更多的功能,留給了軟件,相對來說軟件做的事情,即負擔要重些。但是實現對應的UHCI的硬件的USB控制器,價格上,就相對便宜些。對應地,UHCI更多地應用在PC機中的主板上的USB控制器。
            iii. EHCI(Enhanced Host Controller Interface,增強型主機控制器接口),基於USB2.0協議標準,但是兼容UHCI和OHCI控制器用於支持低速USB設備

            iv. xHCI(Extensible Host Controller Interface,擴展主機控制器接口),基於USB3.0協議標準。


        

        v. USB OTG(On-The-Go)控制器:常用於嵌入式微控制器領域,該技術使每個通信終端都能充當DRD(Dual-Role Device,雙重角色設備),即可以利用主機溝通協議根據功能需要在主機模式和設備模式之間任意切換。

2. USB子系統在內核中的位置
        如下圖所示,USB 驅動位於不同的內核子系統(塊設備, 網絡設備, 字符設備等等)和USB硬件控制器之間. USB 核心爲 USB 驅動提供了一個接口用於訪問和控制 USB 硬件, 而不必考慮出現在系統中的不同的 USB 硬件控制器.

        USB Device Driver 向下利用 USB Core 提供的接口訪問和控制硬件(Hardware),向上表現爲將 USB 設備抽象成塊設備,網絡設備或字符設備同 User 使用。


3. usb設備連接星形拓撲圖
    一個 USB host 最多支持128個地址,地址0作爲默認地址,只在設備枚舉時臨時使用,而不能分配給任何一個設備,因此一個host最多同時支持127個地址。若一個設備佔用一個地址,USB hub也是需要佔用地址的,所以一個USB host實際可支持的設備一定少於127個。

        USB 體系採用分層的星形拓撲連接所有USB設備,以HOST-ROOT Hub爲起點,最多支持7層,也就是說一個USB系統中最多允許使用5個USB Hub級聯。

                                                            usb_20.pdf->ch4 4.1.1 Bus Topology

4. USB設備組織及端點尋址
        在USB設備的邏輯組織中,包含設備,配置,接口和端點4個層次,一個設備通常有一個或多個配置,一個配置有一個或多個接口,一個接口有零個或多個端點。同一設備的不同配置使設備對外表現出不同的功能組合(在探測/連接時選擇一個配置)。在USB協議中,接口由多個端點組成,代表一個基本的功能,是USB設備驅動程序控制的對象。

舉例:
    一個USB播放器帶有音頻、視頻、旋鈕和按鈕。
    配置1:音頻(接口)+ 旋鈕(接口)
    配置2:音頻(接口)+ 旋鈕(接口)+ 視頻(接口)
    配置3:音頻(接口)+ 視頻(接口)
    而音頻接口,視頻接口,按鈕接口,旋鈕接口均需要一個驅動程序。
    USB設備中唯一可尋址的部分是端點,可以抽象成USB設備上的一個數據緩衝區,用來存放和發送USB的各種數據。主機和設備的通信最終作用於省的各個端點,它是主機和設備間通信的一個邏輯終端。
    每個USB設備在USB總線上都有一個唯一的地址,在連接主機時由主機分配,而USB設備中的每個端點在設備內部有唯一的端點號,是在設計設備是指定的。所以在USB設備被枚舉時,必須向主機報告自己所有端點的特性,包括端點號,通信方向,端點支持的最大包大小等(詳見usb_endpoint_descriptor結構體)。每個設備必須有端點0,用於設備枚舉時對設備進行基本的控制功能,除了端點0其餘端點在設備配置之前不能與主機通信,只有向主機報告這些端點的特性並確認後才能被激活。

5. USB描述符
標準USB設備5種USB描述符,包括:
    設備描述符(usb_device_descriptor)->usb_20.pdf->ch9 Table 9-8
    配置描述符(usb_config_descriptor)->usb_20.pdf->ch9 Table 9-10
    接口描述符(usb_interface_descriptor)->usb_20.pdf->ch9 Table 9-12
    端點描述符(usb_endpoint_descriptor)->usb_20.pdf->ch9 Table 9-13
    字符串描述符(usb_string_descriptor)->usb_20.pdf->ch9 Table 9-16
各描述符關係:
    與USB設備組織類似,一個USB設備只有一個USB描述符,而一個USB描述符可以包含多個配置描述符,一個配置描述符可以包含多個接口描述符,一個接口使用了幾個端點就有幾個端點描述符,字符串描述符是可選的,包含一些設備的描述信息。

各種描述符在源碼中的聯繫:


例如在設備上插入U盤,使用lsusb命令:
# lsusb -d 1976:1307 -v

查看到U盤信息->HYUNDAI.lsusb

Bus 001 Device 003: ID 1976:1307 Chipsbrand Microelectronics (HK) Co., Ltd. 
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x1976 Chipsbrand Microelectronics (HK) Co., Ltd.
  idProduct          0x1307 
  bcdDevice            1.00
  iManufacturer           1 ChipsBnk
  iProduct                2 USB Reader
  iSerial                 3 110074973765
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk-Only
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)
6. USB數據傳輸
四種傳輸模式:
控制傳輸(control)->傳送主機和外設之間的設置、控制、狀態等信息
等時傳輸(isochronous)->傳輸實時數據,傳輸速率預先可知。可容忍偶爾錯誤,一般用於麥克風,音響,usb視頻設備等
批量傳輸(bulk)->傳輸大量時延要求不高的數據,但是要求不能出錯,適用於打印機,存儲設備等
中斷傳輸(interrupt)->傳輸數據量小,但是對傳輸時延敏感,要求馬上響應,如鍵盤鼠標等。

    USB通信最基本的形式是通過端點(endpoint),USB端點只能往一個方向傳輸數據,從host到device(稱爲輸出端點)或從device到host(稱爲輸入端點)。對應時鐘傳輸模式,端點也分成4種:
控制端點:
        用來允許對 USB 設備的不同部分存取. 通常用作配置設備, 獲取關於設備的信息, 發送命令到設備, 或者獲取關於設備的狀態報告. 每個 USB 設備有一個控制端點稱爲"端點 0", 被 USB 核用來在插入時配置設備(枚舉). 這些傳送由 USB 協議保證來總有足夠的帶寬使它到達設備.
等時端點:
        可以傳送大量數據, 但是這個數據常常不能保證傳輸完全正確. 這些端點用在可以處理數據丟失的設備中, 並且更多依賴於保持持續的數據流. 實時數據收集, 例如音頻和視頻設備, 一直都使用這些端點.
批量端點:
        用來傳送大量的數據. 對於需要傳送不能有任何數據丟失的數據. 這些傳送不被 USB 協議保證來一直使它在特定時間範圍內完成. 如果總線上沒有足夠的空間來發送整個 BULK 報文, 它被分爲多次傳送到或者從設備. 這些端點普遍在打印機, 存儲器, 和網絡設備上
中斷端點:
        傳送小量的數據, 以固定的速率在每次 USB 主請求設備數據時. 這些端點對 USB 鍵盤和鼠標來說是主要的傳送方法. 它們還用來傳送數據到 USB 設備來控制設備, 但通常不用來傳送大量數據. 這些傳送由 USB 協議保證來總有足夠的帶寬使它到達設備.

注意:
    a. 所有傳輸都是有USB主機發起的,不能由USB設備發起傳輸。
    b. 注意此處的中斷區別於硬件中斷,而是CPU一直在輪詢設備狀態,有數據則發起中斷取走數據。

    c. 一個設備也可能會使用多種傳輸模式,如USB存儲設備使用控制傳輸模式完成磁盤訪問命令,使用批量傳輸模式和主機交換數據。

7. USB數據組織
USB的數據傳遞首先是基於傳輸(Transfer)的,四種傳輸:控制傳輸,等時傳輸,批量傳輸,中斷傳輸;
一次傳輸由一個或多個事務(transaction)構成,三種事務:IN事務,OUT事務,SETUP事務;
一個事務有一個或多個包(Packet)構成,四種包:令牌包(SETUP),數據包(DATA),握手包(ACK),特殊包(PRE);

一個包由多個域(字段)構成,多種域:同步域(SYNC),標識域(PID),地址域(ADDR),端點域(ENDP),幀號域(FRAM),數據域(DATA),校驗域(CRC)等


8. USB設備枚舉
USB設備枚舉8個步驟:
        a. 獲取設備描述符
        b. 設備復位
        c. 設置設備地址
        d. 再次獲取設備描述符
        e. 獲取配置描述符
        f. 獲取接口描述符、端點描述符
        g. 獲取字符串描述符
        h. 選擇設備配置

利用軟件分析usb協議(傳輸過程)->usb_mouse.usb

9. usb基本函數及數據結構->usb-DS+FUNC

Data Structures: 
數據結構						路徑									說明
urb 					include/linux/usb.h				USB數據傳輸機制的核心結構
pipe 					include/linux/usb.h				存放URB的地址信息等 Line 1796
usb_device_descriptor 		        include/linux/usb/ch9.h				usb設備描述符
usb_config_descriptor									usb配置描述符
usb_interface_descriptor								usb接口描述符
usb_endpoint_descriptor									usb端點描述符
usb_device 				include/linux/usb.h				USB設備在內核裏的抽象
usb_interface				include/linux/usb.h				USB設備接口
usb_device_id 				include/linux/mod_devicetable.h		        標識一個USB設備,用於.id_table
usb_driver 				include/linux/usb.h				USB客戶驅動程序
usb_gadget_driver 			include/linux/usb_gadget.h			USB gadget驅動程序


Kernel Function: 
內核接口						路徑									說明
usb_register() 				include/linux/usb.h				向USB核心註冊usb_driver結構體
					drivers/usb/core/driver.c			
usb_deregister() 			driver/usb/core/driver.c 			從USB核心註銷usb_driver結構體
usb_set_intfdata() 			include/linux/usb.h 				把設備相關的數據附着到usb_interface
usb_get_intfdata() 			include/linux/usb.h				從usb_interface中獲得相關數據
usb_register_dev() 			drivers/usb/core/file.c				把字符設備接口和USB客戶驅動程序關聯起來
usb_deregister_dev() 		        drivers/usb/core/file.c 			解除關聯
usb_alloc_urb() 			drivers/usb/core/urb.c 				創建並置零、初始化URB->kerf等
usb_fill_[control
|int|bulk|_urb()			include/linux/usb.h 				初始化URB
usb_[control|interrupt
|bulk]_msg()				drivers/usb/core/message.c 			URB同步提交函數
usb_submit_urb() 			drivers/usb/core/urb.c 				URB異步提交函數
usb_free_urb() 				drivers/usb/core/urb.c 				釋放URB
usb_unlink_urb() 			drivers/usb/core/urb.c				取消URB的提交
usb_[rcv|snd][ctrl
|int|bulk|isoc]pipe()		        include/linux/usb.h 				創建URB管道 Line 1820
usb_find_interface() 		        drivers/usb/core/usb.c 				獲得與USB客戶驅動程序相關的usb_interface變量
usb_buffer_alloc() 			drivers/usb/core/usb.c 				分配一致性DMA傳輸緩衝區
usb_buffer_free() 			drivers/usb/core/usb.c 				釋放usb_buffer_alloc函數分配的緩衝區
usb_serial_register() 		        drivers/usb/serial/usb_serial.c 	        向USB-Serial核心註冊驅動程序
usb_serial_deregister() 	        drivers/usb/serial/usb_serial.c 	        從USB-Serial核心註銷驅動程序

10. USB驅動基本框架 usb-skeleton.c 簡析
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章