前言
接下來我們看一下Linux下USB驅(qū)動的架構(gòu),因為內(nèi)容較多,會分成多篇來介紹!
USB整體框架
USB驅(qū)動分為主機(jī)側(cè)和設(shè)備側(cè),主機(jī)側(cè)和設(shè)備側(cè)的USB控制器分別稱為主機(jī)控制器(Host Controller)和USB設(shè)備控制器(UDC)。USB核心層向上下提供編程接口,維護(hù)整個系統(tǒng)的USB信息,完成熱插拔控制,數(shù)據(jù)傳輸控制。
主機(jī)側(cè)
從上圖看,我們需要實現(xiàn)兩個驅(qū)動,USB主機(jī)控制器驅(qū)動和USB設(shè)備驅(qū)動。
USB主機(jī)控制器驅(qū)動:控制插入的USB設(shè)備
USB設(shè)備驅(qū)動:控制具體USB設(shè)備和主機(jī)如何通信
設(shè)備側(cè)
設(shè)備側(cè)也需要實現(xiàn)兩部分驅(qū)動,UDC驅(qū)動和Gadget Function驅(qū)動。
UDC驅(qū)動:控制USB設(shè)備和主機(jī)的通信
Gadget Function驅(qū)動:控制USB設(shè)備功能的實現(xiàn)
* 為什么叫“Gadget驅(qū)動”,是為了不和USB設(shè)備驅(qū)動混淆,所以改為“器件驅(qū)動”
重要結(jié)構(gòu)體
之前在基礎(chǔ)知識中,我們介紹過設(shè)備,配置,接口,端點等概念,它在Linux中有4個對應(yīng)的結(jié)構(gòu)體來表示。同時也有對應(yīng)的結(jié)構(gòu)體來描述USB設(shè)備。
內(nèi)核版本:4.20.12
usb_device_descriptor -- 設(shè)備描述符
usb_config_descriptor -- 配置描述符
usb_interface_descriptor -- 接口描述符
usb_endpoint_descriptor -- 端點描述符
bmAttributes : Bit1-0:00控制,01同步,02批量,03中斷。
usb_string_descriptor -- 字符串描述符
字符描述符是可選的,如果一個設(shè)備不支持字符串描述符,設(shè)備描述符、配置描述符和接口描述符中對字符串描述符的引用必須設(shè)置為0。
usb_device -- usb設(shè)備
它描述了一個USB設(shè)備, 里面包含了設(shè)備描述符,配置,端點等信息。
為了更清晰的了解設(shè)備,配置,接口,端點等結(jié)構(gòu)體信息,我在Ubuntu上插入一個U盤,然后使用lsusb -v去查看該usb設(shè)備的設(shè)備描述符等信息。
它展示了一個設(shè)備的描述符信息,各個參數(shù)和上面的結(jié)構(gòu)體都可以一一對上,它也描述了一個設(shè)備各種信息。
總結(jié)
后面會根據(jù)上面驅(qū)動框架分成USB主機(jī)控制器驅(qū)動,USB設(shè)備驅(qū)動,UDC驅(qū)動,Gadget Function驅(qū)動等4個部分來介紹對應(yīng)的內(nèi)容。
審核編輯:劉清
評論
查看更多