Linux下USB gadget裝置詳解

2021-08-26 10:17:05 字數 2104 閱讀 8306

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 是乙個比較複雜的規範,以後有時間再研究。

控制器驅動

常見的 usb device 有 u 盤, 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 驅動可以執行在各種硬體平台上。重要的驅動有:

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最常見的 u 盤功能實現。

serial gadget 實現,包括:

generic serial 實現(只需要bulk-in/bulk-out端點+ep0)

cdc acm 規範實現。

gadget filesystem, 將 gadget api 介面暴露給應用層,以便在應用層實現user mode driver。

midi: 暴露alsa介面,提供 recording 以及 playback 功能。

Linux下USB gadget裝置詳解

linux下usb gadget裝置詳解 usb gadget是什麼?linux usb gadget 驅動框架 以下簡稱 gadget 實現了usb 協議定義的裝置端的軟體功能。相對於 linux usb 主機端 host 驅動而言,gadget 驅動出現較晚,它出現在2.4.23 以後。gadg...

Linux下USB gadget裝置詳解

usb gadget是什麼?linux usb gadget 驅動框架 以下簡稱 gadget 實現了usb 協議定義的裝置端的軟體功能。相對於 linux usb 主機端 host 驅動而言,gadget 驅動出現較晚,它出現在2.4.23 以後。gadget 框架提出了一套標準 api,在底層,...

zynq下usb gadget模擬網口 U盤 串列埠

參考usb gadget十分好用,可以模擬成網口 u盤 串列埠等。本文主要講述如何將usb gadget模擬成網口 u盤 串列埠。主控晶元 xc7z020 核心版本 linux zynq 4.14.0 xilinx 所需配置模組在核心device drivers usb support usb ga...