乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       guitarhua 2012-11-23

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

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

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

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

      AD:

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

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

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

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

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

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

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

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

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

      圖25-2右側(cè)是設(shè)備驅(qū)動(dòng)結(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è)備

      每個(gè)USB設(shè)備提供了不同級別的配置信息。一個(gè)USB設(shè)備可以包含一個(gè)或多個(gè)配置,不同的配置使設(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)定義看出,一個(gè)設(shè)備描述符定義了與USB設(shè)備有關(guān)的所有信息。

      3.接口

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

      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總線通信的基本形式,每個(gè)USB設(shè)備接口可以認(rèn)為是端點(diǎn)的集合。主機(jī)只能通過端點(diǎn)與設(shè)備通信。USB體系結(jié)構(gòu)規(guī)定每個(gè)端點(diǎn)都有一個(gè)唯一 的地址,由設(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)的時(shí)間間隔  
      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.配置

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

      1. struct usb_config_descriptor {  
      2.     __u8  bLength;              // 描述符長度  
      3.     __u8  bDescriptorType;      // 描述符類型  
      4.  
      5.     __le16 wTotalLength;        // 配置返回?cái)?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é)

        本站是提供個(gè)人知識管理的網(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)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多