0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从硬件软件角度理解Gadget框架

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-13 11:32 次阅读

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 驱动开始分析:

  • IMX6ULL 的代码:Linux-4.9.88driversusbchipideaci_hdrc_imx.c
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 提供
  • 在这上面提供各类描述符,实际上,描述符的提供还可以分为两层:
    • 设备描述符、配置描述符:由程序员决定,由 usb_composite_driver 提供
    • 接口描述符、endpoint 描述符:由内核事先实现的、常用的 function 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还大了点。
    的头像 发表于 01-23 08:53 1.5w次阅读
    <b class='flag-5'>从</b><b class='flag-5'>硬件</b><b class='flag-5'>角度</b>解析下这个USB Type-C

    [分享]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

    数字化实现的角度理解PI环节

    本文数字化实现的角度理解PI(proportional integral, PI)环节,为数字化实现PI打下基础。...
    发表于 08-30 07:41

    应用于嵌入式系统软件硬件接口问题的设计

    最理想的解决方案是软件小组参与硬件设计,但是在时间安排、资金和人员方面往往又是不实际的。一种变通的方法是创建一套硬件接口规范来加速软件开发流程。
    的头像 发表于 11-01 08:58 2680次阅读
    应用于嵌入式系统<b class='flag-5'>软件</b>和<b class='flag-5'>硬件</b>接口问题的设计

    如何理解现场总线?工业通信的角度看看资料下载

    电子发烧友网为你提供如何理解现场总线?工业通信的角度看看资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-15 08:45 12次下载
    如何<b class='flag-5'>理解</b>现场总线?<b class='flag-5'>从</b>工业通信的<b class='flag-5'>角度</b>看看资料下载

    仿真器的角度理解Verilog语言1

    只作为语法设定来介绍,忽略了Verilog语言的软件特性和仿真特性。使得初学者无法理解Verilog语言在行为级语法(过程块、赋值和延迟)背后隐藏的设计思想。本文尝试仿真器的角度对V
    的头像 发表于 05-25 15:10 896次阅读
    <b class='flag-5'>从</b>仿真器的<b class='flag-5'>角度</b><b class='flag-5'>理解</b>Verilog语言1

    仿真器的角度理解Verilog语言2

    只作为语法设定来介绍,忽略了Verilog语言的软件特性和仿真特性。使得初学者无法理解Verilog语言在行为级语法(过程块、赋值和延迟)背后隐藏的设计思想。本文尝试仿真器的角度对V
    的头像 发表于 05-25 15:10 821次阅读
    <b class='flag-5'>从</b>仿真器的<b class='flag-5'>角度</b><b class='flag-5'>理解</b>Verilog语言2

    AMD Xilinx Linux 2022.1 USB Gadget使用

    有客户使用Linux中的USB Gadget功能,把MPSoC器件做USB设备
    的头像 发表于 07-07 14:15 685次阅读

    USB Gadget serial应用实例(上)

    1. 硬件体验 使用 Linux 自带的 USB Gadget 驱动 /drivers/usb/gadget/legacy/serial.c 使用 USB 线,连接板子的 OTG 口和 PC
    的头像 发表于 07-13 11:06 2626次阅读
    USB <b class='flag-5'>Gadget</b> serial应用实例(上)

    怎样理解Gadget框架

    。 意思是说,一个开发板,可以当 USB 主机,接鼠标、键盘等机;一个开发板也可以当 U 盘,接入 PC 电脑,此时开发板是机。因此,我们要掌握两套驱动框架。这是 Linux 下 USB 相对于 I2C
    的头像 发表于 07-13 11:18 609次阅读
    怎样<b class='flag-5'>理解</b><b class='flag-5'>Gadget</b><b class='flag-5'>框架</b>

    获取描述符的角度理解Gadget框架

    安装好 gadget 驱动程序后(比如 modprobe g_zero), 它只是构造好了各类描述符。在设备的枚举过程会读取描述符。 使用 OTG 线连接电脑和开发板时,电脑软件会执行如下
    的头像 发表于 07-13 11:38 852次阅读
    <b class='flag-5'>从</b>获取描述符的<b class='flag-5'>角度</b><b class='flag-5'>理解</b><b class='flag-5'>Gadget</b><b class='flag-5'>框架</b>

    数据传输的角度理解Gadge框架

    5.1 使用流程 在 USB 协议中,永远是 Host 主动发起传输。作为一个 Gadget 驱动程序,它永远都是这样: 想接收数据: 先构造好 usb_request:分配 buffer、设置回调
    的头像 发表于 07-13 11:41 1076次阅读
    <b class='flag-5'>从</b>数据传输的<b class='flag-5'>角度</b><b class='flag-5'>理解</b>Gadge<b class='flag-5'>框架</b>