gadget驅動框架(一)

2021-10-22 12:12:57 字數 1392 閱讀 4780

之前在linux移植udc驅動的時候,沒有深入的理解整個gadget驅動框架,現在重新再屢屢gadget驅動,以便後期再次學習。本系列的文章以虛擬串列埠進行分析,相關原始碼均是基於linux4.19.123。

gadget原始碼主要在:drivers/usb/gadget,以虛擬串列埠為例,對原始檔做簡單說明:

drivers/usb/gadget/function/*.c:實現具體的usb功能,有serial、video、audio等

drivers/usb/gadget/legacy/*.c:註冊usb class驅動,往上與function銜接,往下與composite

drivers/usb/gadget/composite.c:復合裝置,與硬體無關,往下與udc驅動銜接

linux usb gadget分三層架構,層次關係從上到下:

一層:usb gadget功能層。bsp/driver開發者通常是要實現這一層,從而實現乙個具體的裝置驅動,如linux在此層實現了serial,mtp,mass_storage等。瀏覽參考關注此層**時,會發現「composite」是此層的關鍵字,此層中關鍵的資料結構是:struct usb_composite_driver。這一層的驅動檔案一般為:drivers/usb/gadget/function/*.c或drivers/usb/gadget/f_serial.c(傳統linux實現的usb轉串列埠)。

二層:usb裝置層。這一層是linux核心開發維護者實現的,與我們沒太大關係,不用我們操心,我們只關心其的一些介面就行。瀏覽參考關注此層時,會發現「gadget」是此層的關鍵字,此層的關鍵資料結構是:usb_gadget_driver,usb_composite_dev。這層主要的乙個驅動檔案為:driver/usb/gadget/composite.c

三層:usb裝置控制器驅動層。這一層主要是與cpu、cpu usb控制器有關,與硬體緊密相關,這一層也比較頭痛,主要它和usb控制器牽扯在一起,涉及有暫存器、時鐘、dma等等。但是這一層往往是由晶元廠商去實現。我們一般僅需在板級檔案中處理好所需要的usb介面即可。這層的關鍵字就是「udc」,主要驅動檔案命名含「udc」關鍵字,一般與cpu或晶元廠商有關,如driver/usb/gadget/***_udc.c。

linux驅動(一) linux驅動框架

編寫linux驅動先看一下驅動框架是什麼樣子的。驅動編寫和應用層編寫有什麼區別呢?一 首先 入口函式的問題。應用層編寫我們的入口就是main函式,但在驅動編寫時不是這樣的,有兩種情況,1 預設情況下 int init init module void 載入模組時的初始化函式,也就是驅動模組的入口函式...

Linux USB驅動框架分析(一)

linux usb驅動框架分析 一 初次接觸與os相關的裝置驅動編寫,感覺還挺有意思的,為了不至於忘掉看過的東西,筆記跟總結當然不可缺,更何況我決定為嵌入式賣命了。好,言歸正傳,我 說一說這段時間的收穫,跟大家分享一下linux的驅動開發。但這次只先針對linux的usb子系統作分析,因為周五研討老...

Linux USB驅動框架分析(一)

linux usb驅動框架分析 一 初次接觸與os相關的裝置驅動編寫,感覺還挺有意思的,為了不至於忘掉看過的東西,筆記跟總結當然不可缺,更何況我決定為嵌入式賣命了。好,言歸正傳,我說一說這段時間的收穫,跟大家分享一下linux的驅動開發。但這次只先針對linux的usb子系統作分析,因為周五研討老闆...