2. 從硬件軟件角度理解 Gadget 框架
USB 傳輸的核心是 endpoint,使用 endpoint 可以收發數據。在 endpoint 之上,就可以模擬 USB 串口、USB 觸碰屏、USB 攝像頭。基于這個角度,Gadget 框架可以分為兩層:
- 底層 endpoint 操作
- 上層模擬各類 USB 設備
2.1 底層硬件操作_UDC 驅動
不同平臺采用的 USB 控制器型號不同,確認型號方法是從 dtb 反編譯,找到包含 otg 字符的節點,在 Linux code 中搜索 dts 節點的 compatible,可以找到對應的 usb 從機控制器驅動。
對于底層 endpoint 的代碼,需要從 UDC 驅動開始分析:
ci_hdrc_imx_probe
ci_hdrc_add_device
pdev = platform_device_alloc("ci_hdrc", id);
// Linux-4.9.88driversusbchipideacore.c
static struct platform_driver ci_hdrc_driver = {
.probe = ci_hdrc_probe,
.remove = ci_hdrc_remove,
.driver = {
.name = "ci_hdrc",
.pm = &ci_pm_ops,
},
};
ci_hdrc_probe
ret = ci_hdrc_gadget_init(ci);
udc_start
- STM32MP157 的代碼:
Linux-5.4driversusbdwc2platform.c
dwc2_driver_probe
retval = dwc2_gadget_init(hsotg);
2.2 上層軟件操作
模擬各類 USB 設備時,軟件怎么分層?以訪問設備、獲取描述符為例:
- Host 要分配地址、把地址發送給設備:不管要模擬什么設備,Gadget 都必須接收地址,這部分由 usb_gadget (硬件相關的驅動程序)實現
- Host 要讀取各類描述符,這些描述符是由上層的驅動程序提供的
- 怎么把上層的描述符通過底層的 usb_gadget 傳回給 Host?還需要一個中間層。Host 獲取描述符時,方法是固定、通用的,這些方法可以由內核統一提供,這就是:usb_gadget_driver。
所以,從獲取描述符的角度看看,上層軟件至少分為 2 層:
- usb_gadget_driver:實現一些通用的 USB 訪問方法,比如 Host 訪問描述符時,由 usb_gadget_driver 提供
- 在這上面提供各類描述符,實際上,描述符的提供還可以分為兩層:
軟件層次可以進一步細化,如下圖:
這涉及 2 個結構體:
- usb_composite_dev:它里面匯集有各類描述符、有一個 usb_funciton 鏈表(實現數據傳輸)
struct usb_composite_dev {
struct usb_gadget *gadget;
struct usb_request *req;
struct usb_request *os_desc_req;
struct usb_configuration *config;
/* OS String is a custom (yet popular) extension to the USB standard. */
u8 qw_sign[OS_STRING_QW_SIGN_LEN];
u8 b_vendor_code;
struct usb_configuration *os_desc_config;
unsigned int use_os_string:1;
/* private: */
/* internals */
unsigned int suspended:1;
struct usb_device_descriptor desc;
struct list_head configs;
struct list_head gstrings;
struct usb_composite_driver *driver;
u8 next_string_id;
char *def_manufacturer;
/* the gadget driver won't enable the data pullup
* while the deactivation count is nonzero.
*/
unsigned deactivations;
/* the composite driver won't complete the control transfer's
* data/status stages till delayed_status is zero.
*/
int delayed_status;
/* protects deactivations and delayed_status counts*/
spinlock_t lock;
/* public: */
unsigned int setup_pending:1;
unsigned int os_desc_pending:1;
};
- usb_udc:UDC 的本意是"usb device controller",usb_udc 結構體里面有 usb_gadget (表示 UDC 本身)、usb_gadget_driver()
struct usb_udc {
struct usb_gadget_driver *driver;
struct usb_gadget *gadget;
struct device dev;
struct list_head list;
bool vbus;
};
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
嵌入式
+關注
關注
5087文章
19145瀏覽量
306121 -
Linux
+關注
關注
87文章
11320瀏覽量
209845 -
框架
+關注
關注
0文章
403瀏覽量
17510
發布評論請先 登錄
相關推薦
從硬件角度解析下這個USB Type-C
我來從硬件角度解析下這個USB Type-C,順便解惑。尺寸小,支持正反插,速度快(10Gb)。這個小是針對以前電腦上的USB接口說的,實際相對android機上的microUSB還大了點。
[分享]從Java的角度理解設計模式(連載)
從Java的角度理解設計模式1:什么是重構 MF在《重構》一書中是這樣定義重構的:重構是這樣一個過程,在不改變代碼外在行為的前提下,對代碼作出修改,以改進程序的內部結構。重構
發表于 06-19 16:40
從需求的角度去理解Linux系列:總線、設備和驅動
總線設備驅動框架的前提!從面向對象的角度,我們要弄清楚,物理意義上的硬件是什么,而對應的軟件對象是如何表述的。以下闡述會重點講述
發表于 03-11 14:45
從需求的角度去理解嵌入式Linux:總線、設備和驅動
和原理。事實上,對于一個代碼量有幾萬甚至幾十萬行代碼量的軟件框架,一開始接觸就學習原理和代碼并不是好事。這種做法很像是試圖從軟件框架的學習
發表于 12-11 16:34
字符設備驅動、設備驅動模型、sysfs、平臺設備驅動的關系 -----從需求的角度去理解Linux之三
,能夠熟悉某一點并分享出來已很難得,但對于專注傳授技術和經驗給學習者而言,橫向比較關聯各個驅動相關的知識點和縱向剖析Linux整個驅動軟件層次是非常有必要的,也非常有意義。本文依然是從需求的角度去
發表于 12-17 16:16
如何理解現場總線?從工業通信的角度看看資料下載
電子發燒友網為你提供如何理解現場總線?從工業通信的角度看看資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
發表于 04-15 08:45
?12次下載
從仿真器的角度理解Verilog語言1
只作為語法設定來介紹,忽略了Verilog語言的軟件特性和仿真特性。使得初學者無法理解Verilog語言在行為級語法(過程塊、賦值和延遲)背后隱藏的設計思想。本文嘗試從仿真器的角度對V
從仿真器的角度理解Verilog語言2
只作為語法設定來介紹,忽略了Verilog語言的軟件特性和仿真特性。使得初學者無法理解Verilog語言在行為級語法(過程塊、賦值和延遲)背后隱藏的設計思想。本文嘗試從仿真器的角度對V
AMD Xilinx Linux 2022.1 USB Gadget使用
有客戶使用Linux中的USB Gadget功能,把MPSoC器件做USB從設備
USB Gadget serial應用實例(上)
1. 硬件體驗 使用 Linux 自帶的 USB Gadget 驅動 /drivers/usb/gadget/legacy/serial.c 使用 USB 線,連接板子的 OTG 口和 PC
怎樣理解Gadget框架
。 意思是說,一個開發板,可以當 USB 主機,接鼠標、鍵盤等從機;一個開發板也可以當 U 盤,接入 PC 電腦,此時開發板是從機。因此,我們要掌握兩套驅動框架。這是 Linux 下 USB 相對于 I2C
從獲取描述符的角度理解Gadget框架
安裝好 gadget 驅動程序后(比如 modprobe g_zero), 它只是構造好了各類描述符。在設備的枚舉過程會讀取描述符。 使用 OTG 線連接電腦和開發板時,電腦軟件會執行如下
從數據傳輸的角度理解Gadge框架
5.1 使用流程 在 USB 協議中,永遠是 Host 主動發起傳輸。作為一個 Gadget 驅動程序,它永遠都是這樣: 想接收數據: 先構造好 usb_request:分配 buffer、設置回調
評論