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