通常網上關於介紹USB Gadget的資料都是基於Linux2.6.32或在這以前的版本,做者在關注了Linux2.6.37和Linux3.0.4版本的內核,USB Gadget的一些API已經與Linux2.6.32的不一樣了。可是那些關鍵的數據結構仍是同樣滴。
Linux USB Gadget分三層架構:
層次關係從上到下
一層:USB Gadget功能層。BSP/Driver開發者一般是要實現這一層,從而實現一個具體的設備驅動,如Anddroid在此層實現了adb,mtp,mass_storage等。瀏覽參考關注此層代碼時,會發現「composite」是此層的關鍵字,此層中關鍵的數據結構是:struct usb_composite_driver。這一層的驅動文件通常爲:driver/usb/gadget/android.c(android實現的)或driver/usb/gadget/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/xxx_udc.c。