linux usb Gadget (usb裝置側驅動分析)

來源:互聯網
上載者:User

Linux-USB Gadget

之簡介
 Linux-USB Gadget 驅動架構(以下簡稱 Gadget )實現了 USB 協議定義的裝置端的軟體功能。
相對於 Linux USB 主機端( Host ) 驅動而言, Gadget 驅動出現較晚,它出現在 2.4.23 以後。
Gadget 架構提出了一套標準 API, 在底層USB 裝置控制器 (USB Device Controller, UDC) 驅動
則實現這一套 API, 不同的 UDC (通常是 SOC 的一部分) 需要不同的驅動, 甚至基於同樣的 UDC
的不同板子也需要進行代碼修改。這一層我們可以稱之為平台相關層。
   基於 API, Gadget 驅動實現了一套硬體無關的功能,這基本上可以對應到 USB 協議裡 的各種 USB Class ,
也有比如 USB Gadget Generic Serial 驅動,沒有對應的 Class 。當然, Gadget 驅動還是受限於底層提供
的功能的:比如 某些 Class 需要 USB Isochronous 端點,這時我們就不能支援該 Class 。
  普通的 Gadget 驅動只實現一個功能(比如, u 盤, usb 網卡)。複合裝置可以支援多個功能,後面將仔細研究
一下複合裝置的實現。像智能手機 , PDA 這樣的裝置,硬體支援較豐富的端點、 DMA Buffer, 給軟體提了支援複合
功能的基礎。
   有兩點值得注意,第一是 usb gaget 驅動架構不象 usb 主機端有 usb core 的概念, usb 主機可能支援
成百類型的外設,把通用功能抽象出來很有意義。 Usb device 端則通常沒有這個需求,一些通用功能抽象在一些 Helper
函數裡就可以了。第二是 usb 2.0 裡提出了 OTG 的概念,可以在同一介面上支援 host 以及 device 功能。
OTG 是一個比較複雜的規範,以後有時間再研究。

之驅動結構分析
    Linux USB 裝置端驅動有兩部分組成。一部分是USB 裝置控制器(USB Device Controller, UDC)驅動,
另一部分是硬體無關的功能驅動--Gadget驅動(如:滑鼠、u盤、usb串口、usb網路等);也可以分為3層的,分別
是:Controller Drivers、Gadget Drivers、Upper Layers,大概意思都差不多。

一、控制器(USB Device Controller, UDC)驅動

  Gadget 架構提出了一套標準 API, 在底層,USB 裝置控制器驅動則實現這一套 API, 不同的 UDC需要不同的驅動, 甚至
基於同樣的 UDC 的不同板子也需要進行代碼修改。這一層是硬體相關層。

  Linux 標準核心裡支援各種主流 SOC 的 udc 驅動,如:S3C2410、PXA270等。你可以通過核心直接配置支援。你也可以通過
修改它們擷取更高的效率。如:s3c2410_uda.c 中並沒有利用到控制器的dma功能,你可以根據需要修改它。

  常見的 usb device 有 USB 磁碟機, usb 滑鼠、鍵盤,usb 藍芽模組,usb 讀卡機,等等。這些裝置比較簡單,通常不會運行Linux。
運行Linux Gadget 的通常是一些整合 CPU 以及很多外設介面的 SOC (System-on-Chip), 其中 CPU 通常為 32 bit 的 CPU,
 並且 udc 也是該 SOC 的一部分(順帶還有 DMA 通道,FIFO)。

  Linux 標準核心裡支援各主流 SOC 的 udc 驅動,make menuconfig 一下可以看到具體列表,其中值得一提的是 dummy_hcd,
 它是一個軟體類比的 udc, 在開發新的 gadget 驅動時很有協助。

  控制器驅動處理很少的 USB 控制請求(主要由硬體負責的部分)。其它所有的控制請求,比如返回描述符,設定當前配置,由 Gadget Driver
完成。控制器驅動一個主要責任就是負責管理各個端點的 I/O 隊列,在 Gadget Driver 的 buffer 和硬體buffer 之間傳輸資料(通常是通過 DMA)。

  我們前面提過,上層 Gadget 驅動能夠實現什麼功能要依賴底層提供的硬體條件。比如一個複合裝置需要至少 5 個端點,這些硬體特性
通過一組 gadget_is_*()函數實現

二、Gadget 驅動
  重要的驅動有:
    Gadget Zero: 類似於 dummy hcd, 該驅動用於測試 udc 驅動。它會協助您通過 USB-IF 測試。

    Ethernet over USB: 該驅動類比乙太網路網口,它支援多種運行方式:

        CDC Ethernet: usb 規範規定的 Communications Device Class “Ethernet Model” protocol。

        CDC Subset: 對硬體要求最低的一種方式,主要是 Linux 主機支援該方式。

        RNDIS: 微軟公司對 CDC Ethernet 的變種實現。

     File-backed Storage Gadget最常見的 USB 磁碟機功能實現。

     Serial Gadget 實現,包括:

        Generic Serial 實現(只需要Bulk-in/Bulk-out端點+ep0)

        CDC ACM 規範實現。

     Gadget Filesystem, 將 Gadget API 介面暴露給應用程式層,以便在應用程式層實現user mode driver。

     MIDI: 暴露ALSA介面,提供 recording 以及 playback 功能。

參考了:百度百科 http://baike.baidu.com/view/319313.htm
       劉洪濤的專欄 http://blog.csdn.net/hongtao_liu/article/details/4566548

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.