USB裝置驅動

來源:互聯網
上載者:User

1.LINUX USB架構

 

USB通訊都是由host端發起的。USB裝置驅動程式分配並初始化一個URB發給USB Core,USB Core改一改,發給USB主機控制器驅動,USB主機控制器驅動把它解析成包,在匯流排上進行傳送。USB Core是由核心實現的,其實也就是把host control driver裡的功能更集中的向上抽象了一層,它是用來對最上層的USB裝置驅動屏蔽掉host control的不同。

 

2.在核心中的位置


USB驅動程式存在於不同的核心子系統和USB硬體控制器之中。USB核心為USB驅動程式提供了一個用於訪問和控制USB硬體的介面。而不必考慮系統當前存在的各種不同類型的USB硬體控制器。

 

3.USB裝置的構成,包括配置,介面和端點


描述了linux USB裝置的結構層次。每一個interface代表一個功能,對應有一個驅動程式。

 

4.USB裝置驅動描述

在linux核心中,使用structusb_driver結構描述一個USB驅動。

struct usb_driver {

    const char *name;       /* 驅動程式名 */

 

    /* 當USB核心發現了該驅動能夠處理的USB介面時,調用該函數 */

    int (*probe) (structusb_interface *intf,      

              const struct usb_device_id *id);

 

    /* 當相應的USB介面被移除時,調用該函數*/

    void (*disconnect)(struct usb_interface *intf);

 

    /* USB驅動能處理的裝置列表 */

    const structusb_device_id *id_table;

    ……

};

USB裝置的枚舉過程和我們通常看到裝置稍有不同,比如I2C裝置,我們需要在板檔案中去註冊I2C裝置的資訊(比如裝置名稱和一些硬體設定資訊),而USB匯流排會自動去枚舉USB裝置,只要能與id_table匹配,就能枚舉成功,然後載入相應的驅動程式。

 

5.USB裝置描述

Linux核心使用struct usb_device來描述一個USB裝置

struct usb_device {

    int     devnum;     /*USB裝置號*/

    char        devpath[16];  /* 裝置ID字串 */

    enum usb_device_state   state;  /* 裝置狀態:未串連,已配置*/

    enum usb_device_speed   speed; /* 高速,全速,低速*/

 

    struct usb_device*parent;

    struct usb_bus *bus;

    structusb_host_endpoint ep0;

 

    struct device dev;

 

    structusb_device_descriptor descriptor;  /* USB裝置描述符,根據USB協議來定義的*/

    struct usb_host_config*config;

 

    struct usb_host_config*actconfig;

    structusb_host_endpoint *ep_in[16];

    structusb_host_endpoint *ep_out[16];

 

    /* static strings fromthe device */

    char *product;      /* 產品號 */

    char *manufacturer; /* 生產商 */

    char *serial;   /* 裝置串號 */

};

 

6.USB描述符

在linux 核心中定義一下幾種描述符結構體,都是嚴格按照USB協議來定義:

裝置描述符:關於裝置的通用資訊,如生產商ID,產品ID等;

配置描述符:此配置中的介面數,支援的掛起和恢複能力以及功率要求;

介面描述符:介面類,子類和適用的協議,介面備用配置的數位和端點數目;

端點描述符:端點地址,方向和類型,支援的最大包大小,如果是中斷類型的端點則還包括輪詢頻率。

字串描述符:在其他描述符中會為某些欄位提供字串索引,他們可悲用來檢索描述性字串。

 

7.URB

    USB請求塊(USBrequest block,URB)是USB裝置驅動中用來描述與USB裝置通訊所用的基本載體和核心資料結構,非常類似於網路裝置驅動中的sk_buff結構體。

 

1. USB裝置驅動程式建立並初始化一個訪問特定USB裝置特定端點的URB,並提交給USB core;

2. USB core提交該URB到USB主控制器驅動程式;

3. USB主控制器驅動程式根據該URB描述的資訊,來訪問USB裝置;

4. 當裝置訪問結束後,USB主控制驅動程式通知USB裝置驅動程式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.