小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Linux內(nèi)核USB驅(qū)動框架

 guitarhua 2012-11-23

您所在的位置:讀書頻道 > 操作系統(tǒng) > Linux > 25.2.1 Linux內(nèi)核USB驅(qū)動框架

25.2.1 Linux內(nèi)核USB驅(qū)動框架

2009-12-14 09:30 弓雷 清華大學(xué)出版社 我要評論(0) 字號:T | T
一鍵收藏,隨時查看,分享好友!

《ARM嵌入式Linux系統(tǒng)開發(fā)詳解》第25章USB驅(qū)動開發(fā),本章講解了Linux內(nèi)核USB驅(qū)動體系結(jié)構(gòu)、USB設(shè)備驅(qū)動結(jié)構(gòu)等知識,并在最后給出了兩個USB設(shè)備驅(qū)動開發(fā)實(shí)例。本節(jié)為大家介紹Linux內(nèi)核USB驅(qū)動框架。

AD:

25.2  USB驅(qū)動程序框架

Linux內(nèi)核提供了完整的USB驅(qū)動程序框架。USB總線采用樹形結(jié)構(gòu),在一條總線上只能有唯一的主機(jī)設(shè)備。Linux內(nèi)核從主機(jī)和設(shè)備兩個角度觀察USB總線結(jié)構(gòu)。本節(jié)介紹Linux內(nèi)核USB驅(qū)動程序框架。

25.2.1  Linux內(nèi)核USB驅(qū)動框架

圖25-2是Linux內(nèi)核從主機(jī)和設(shè)備兩個角度觀察USB總線結(jié)構(gòu)的示意圖。

從圖25-2中可以看出,Linux內(nèi)核USB驅(qū)動是按照主機(jī)驅(qū)動和設(shè)備驅(qū)動兩套體系實(shí)現(xiàn)的,下面介紹兩套體系的結(jié)構(gòu)和特點(diǎn)。

1.基本結(jié)構(gòu)

圖25-2的左側(cè)是主機(jī)驅(qū)動結(jié)構(gòu)。主機(jī)驅(qū)動的最底層是USB主機(jī)控制器,提供了OHCI/EHCI/UHCI這3種類型的總線控制功能。在USB控 制器的上一層是主機(jī)控制器的驅(qū)動,分別對應(yīng)OHCI/EHCI/UHCI這3種類型的總線接口。USB核心部分連接了USB控制器驅(qū)動和設(shè)備驅(qū)動,是兩者 之間的轉(zhuǎn)換接口。USB設(shè)備驅(qū)動層提供了各種設(shè)備的驅(qū)動程序。

USB主機(jī)部分的設(shè)計結(jié)構(gòu)完全是從USB總線特點(diǎn)出發(fā)的。在USB總線上可以連接各種不同類型的設(shè)備,包括字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備。所有類型的 USB設(shè)備都是用相同的電氣接口,使用的傳輸協(xié)議也基本相同。向用戶提供某種特定類型的USB設(shè)備時,需要處理USB總線協(xié)議。內(nèi)核完成所有的USB總線 協(xié)議處理,并且向用戶提供編程接口。

 
(點(diǎn)擊查看大圖)圖25-2  Linux內(nèi)核USB總線結(jié)構(gòu)

圖25-2右側(cè)是設(shè)備驅(qū)動結(jié)構(gòu)。與USB主機(jī)類似,USB設(shè)備提供了相同的層次結(jié)構(gòu)與之對應(yīng)。但是在USB設(shè)備一側(cè)使用名為Gadget API的結(jié)構(gòu)作為核心。Gadget API是Linux內(nèi)核實(shí)現(xiàn)的對應(yīng)USB設(shè)備的核心結(jié)構(gòu)。Gadget API屏蔽了USB設(shè)備控制器的細(xì)節(jié),控制具體的USB設(shè)備實(shí)現(xiàn)。

2.設(shè)備

每個USB設(shè)備提供了不同級別的配置信息。一個USB設(shè)備可以包含一個或多個配置,不同的配置使設(shè)備表現(xiàn)出不同的特點(diǎn)。其中,設(shè)備的配置是通過接口組成的。Linux內(nèi)核定義了USB設(shè)備描述結(jié)構(gòu)如下:

  1. struct usb_device_descriptor {  
  2.     __u8  bLength;              // 設(shè)備描述符長度  
  3.     __u8  bDescriptorType;      // 設(shè)備類型  
  4.  
  5.     __le16 bcdUSB;              // USB版本號(使用BCD編碼)  
  6.     __u8  bDeviceClass;         // USB設(shè)備類型  
  7.     __u8  bDeviceSubClass;      // USB設(shè)備子類型  
  8.     __u8  bDeviceProtocol;      // USB設(shè)備協(xié)議號  
  9.     __u8  bMaxPacketSize0;      // 傳輸數(shù)據(jù)的最大包長  
  10.     __le16 idVendor;            // 廠商編號  
  11.     __le16 idProduct;           // 產(chǎn)品編號  
  12.     __le16 bcdDevice;           // 設(shè)備出廠號  
  13.     __u8  iManufacturer;        // 廠商字符串索引  
  14.     __u8  iProduct;             // 產(chǎn)品字符串索引  
  15.     __u8  iSerialNumber;        // 產(chǎn)品序列號索引  
  16.     __u8  bNumConfigurations;   // 最大的配置數(shù)量  
  17. } __attribute__ ((packed)); 

從usb_device_descriptor結(jié)構(gòu)定義看出,一個設(shè)備描述符定義了與USB設(shè)備有關(guān)的所有信息。

3.接口

在USB體系中,接口是由多個端點(diǎn)組成的。一個接口代表一個基本的功能,是USB設(shè)備驅(qū)動程序控制的對象。一個USB設(shè)備最少有一個接口,功能復(fù)雜的USB設(shè)備可以有多個接口。接口描述定義如下:

  1. struct usb_interface_descriptor {  
  2.     __u8  bLength;              // 描述符長度  
  3.     __u8  bDescriptorType;      // 描述符類型  
  4.  
  5.     __u8  bInterfaceNumber;     // 接口編號  
  6.     __u8  bAlternateSetting;    // 備用接口編號  
  7.     __u8  bNumEndpoints;        // 端點(diǎn)數(shù)量  
  8.     __u8  bInterfaceClass;      // 接口類型  
  9.     __u8  bInterfaceSubClass;   // 接口子類型  
  10.     __u8  bInterfaceProtocol;   // 接口使用的協(xié)議  
  11.     __u8  iInterface;           // 接口索引字符串?dāng)?shù)值  
  12. } __attribute__ ((packed)); 

4.端點(diǎn)

端點(diǎn)是USB總線通信的基本形式,每個USB設(shè)備接口可以認(rèn)為是端點(diǎn)的集合。主機(jī)只能通過端點(diǎn)與設(shè)備通信。USB體系結(jié)構(gòu)規(guī)定每個端點(diǎn)都有一個唯一 的地址,由設(shè)備地址和端點(diǎn)號決定端點(diǎn)地址。端點(diǎn)還包括了與主機(jī)通信用到的屬性,如傳輸方式、總線訪問頻率、帶寬和端點(diǎn)號等。端點(diǎn)的通信是單向的,通過端點(diǎn) 傳輸?shù)臄?shù)據(jù)只能是從主機(jī)到設(shè)備或者從設(shè)備到主機(jī)。端點(diǎn)定義描述如下:

  1. struct usb_endpoint_descriptor {  
  2.     __u8  bLength;              // 描述符長度  
  3.     __u8  bDescriptorType;      // 描述符類型  
  4.  
  5.     __u8  bEndpointAddress;     // 端點(diǎn)地址  
  6.     __u8  bmAttributes;         // 端點(diǎn)屬性  
  7.     __le16 wMaxPacketSize;      // 端點(diǎn)接收的最大數(shù)據(jù)包長度  
  8.     __u8  bInterval;            // 輪詢端點(diǎn)的時間間隔  
  9.  
  10.     /* NOTE:  these two are _only_ in audio endpoints. */  
  11.     /* use USB_DT_ENDPOINT*_SIZE in bLength, not sizeof. */  
  12.     __u8  bRefresh;  
  13.     __u8  bSynchAddress;  
  14. } __attribute__ ((packed)); 

5.配置

配置是一個接口的集合。Linux內(nèi)核配置的定義如下:

  1. struct usb_config_descriptor {  
  2.     __u8  bLength;              // 描述符長度  
  3.     __u8  bDescriptorType;      // 描述符類型  
  4.  
  5.     __le16 wTotalLength;        // 配置返回數(shù)據(jù)長度  
  6.     __u8  bNumInterfaces;       // 最大接口數(shù)  
  7.     __u8  bConfigurationValue;  // 配置參數(shù)值  
  8.     __u8  iConfiguration;       // 配置描述字符串索引  
  9.     __u8  bmAttributes;         // 供電模式  
  10.     __u8  bMaxPower;            // 接口的最大電流  
  11. } __attribute__ ((packed)); 

配置描述符結(jié)構(gòu)定義了配置的基本屬性和接口數(shù)量等信息。

【責(zé)任編輯:云霞 TEL:(010)68476606】

回書目   上一節(jié)   下一節(jié)

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多