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;
};
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
嵌入式
+关注
关注
4983文章
18286浏览量
288493 -
Linux
+关注
关注
87文章
10990浏览量
206738 -
框架
+关注
关注
0文章
297浏览量
17045
发布评论请先 登录
相关推荐
[分享]从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
基于RS485的Modbus通讯(从硬件层 到软件层的理解和STM32实践) 精选资料推荐
通讯协议 的理解 :1、通讯协议通俗易懂的理解就是两个设备之间互相 传递信息 大家一起 约定好的一种规则;通讯协议 又分为硬件层协议和 软件层协议,常用的
发表于 08-23 08:09
Linux 驱动 = 软件框架 + 硬件操作
Linux 驱动 = 软件框架 + 硬件操作 驱动程序依赖于 Linux 内核,你为开发板 A 开发驱动,那就先在 Ubuntu 中得到、 配置、编译开发板 A 所使用的 Linux 内核
发表于 12-17 07:11
RK3399 Android7.1系统WiFi中的SDIO和电源框架介绍
1、WiFi中的SDIO和电源框架 Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 框架: 引用网友一张框图,画得很不错 从硬件
发表于 11-30 17:47
从仿真器的角度理解Verilog语言1
要想深入理解Verilog就必须正视Verilog语言同时具备硬件特性和软件特性。在当下的教学过程中,教师和教材都过于强调Verilog语言的硬件特性和可综合特性。将Verilog语言
从仿真器的角度理解Verilog语言2
要想深入理解Verilog就必须正视Verilog语言同时具备硬件特性和软件特性。在当下的教学过程中,教师和教材都过于强调Verilog语言的硬件特性和可综合特性。将Verilog语言
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 线连接电脑和开发板时,电脑软件会执行如下
评论