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;
};
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
嵌入式
+关注
关注
5068文章
19014浏览量
303197 -
Linux
+关注
关注
87文章
11225浏览量
208906 -
框架
+关注
关注
0文章
398浏览量
17432
发布评论请先 登录
相关推荐
从硬件角度解析下这个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、设置回调
评论