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;
  };
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    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

    STM32硬件框架介绍

    目录STM32硬件框架介绍IIC初始化STM32硬件框架介绍首先我们来看IIC通信的硬件架构可以看出,可以分为以上4部分。第一部分:通信接口
    发表于 08-24 06:18

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

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

    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语言
    的头像 发表于 05-25 15:10 675次阅读
    从仿真器的<b class='flag-5'>角度</b><b class='flag-5'>理解</b>Verilog语言1

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

    要想深入理解Verilog就必须正视Verilog语言同时具备硬件特性和软件特性。在当下的教学过程中,教师和教材都过于强调Verilog语言的硬件特性和可综合特性。将Verilog语言
    的头像 发表于 05-25 15:10 628次阅读
    从仿真器的<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 474次阅读

    USB Gadget serial应用实例(上)

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

    怎样理解Gadget框架

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