usb gadget

2024-01-11 23:38
文章标签 usb gadget

本文主要是介绍usb gadget,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 前言

2. 源码架构

3. 枚举过程


1. 前言

Gadget,小饰品。USB Gadget,就是指所开发的电子设备以USB从设备的模式通过USB连接到主机。比如手机用USB线插入PC后,手机就是USB Gadget。本文以Mavell为例,以Gadget插入主机的全过程为主线,分析USB Gadget的架构。

 

2. 源码架构

USB的源码位于/drivers/usb文件夹内,其中包括核心层core,主控制器host,U盘storage,以及USB Gadget等。

gadget文件夹里存放了各芯片厂商支援的USB Gadget控制器驱动,比如支持Mavell的PXA9XX系列的USB Gadget驱动为mv_gadget.c,其架构如下图所示,

 2.1 Gadget控制器驱动

 设备要有gadget功能,硬件上要集成gadget控制器,软件上要具备gadget控制器驱动。

首先是该驱动的数据结构 struct mv_usb_dev,

-> struct usb_gadget, 由linux定义的gadget所需要的数据成员,其中包含了sturct usb_ep。

-> struct mv_usb_ep, 其中的struct usb_ep是由linux定义的endpoint所需要的成员,关于endpoint参看USB协议。

-> struct usb_gadget_driver, 对应该gadget设备功能的驱动,下节将作具体描述。

-> void *mv_usb_handle, 指针指向芯片控制器的数据结构。

 

概括地讲,gadget控制器驱动完成了五个任务,

  • 通过platform_data和resource的到gadget芯片物理地址,中断号等 (橙色)
  • 初始化gadget芯片和相关数据 (浅灰色)
  • 初始化数据struct usb_gadget (蓝色)
  • 初始化数据struct usb_ep (粉色)
  • 注册gadget服务

gadget服务,即该设备所具备的gadget能力,比如reset, suspend, resume, speed,以及需要重点关注的枚举功能mv_usb_ep0_complete_service。注意到,注册服务的函数usb_device_register_service()的第一个参数mv_usb_handle用于得到底层芯片的数据,第三个参数回调函数实现具体功能。

 2.2 Gadget设备驱动

  需要区别gadget设备驱动与上节提到的gadget控制器驱动。gadget设备驱动,是指设备插入主机后具备的功能,该驱动被挂在到struct usb_gadget_driver下。比如手机插入PC作为U盘,那么U盘的驱动程序就是所谓的gadget设备驱动。

(*bind)绑定设备的功能,比如U盘。

(*setup)实现USB设备的枚举。

 2.3 Composite

如果一个设备插入主机后拥有多个功能,比如同时有U盘和Android调试功能,那么该设备称为composite复用设备。其数据结构如下,

通过(*bind)绑定设备的各个功能。

 

 

3. 枚举过程

系统初始化USB设备的过程就是枚举过程。

根据USB协议,USB设备初始化的过程为attached->powered->default->address->configured。

当设备插入主机,将等待来自主机的中断信号,通过request_irq()进入中断处理函数。

设备通过读取控制器状态寄存器的值,得到来自主机的反馈,进而执行相应的任务,枚举就是其中的一项任务,通过调用gadget控制器驱动已经注册好的枚举服务,开始枚举过程。

该枚举服务归纳为两步,

第一步,通过读取gadget控制器,得到来自主机的请求,存放至mv_ctrl_req。

第二步,通过switch(mv_ctrl_req),对具体请求作具体处理,处理类别又可分为两类。

1) 标准请求,即所有USB设备可通用的请求,具体有得到状态请求,设置/清除feature请求,设置地址请求。

2) USB设备请求,即根据具体设备,处理具体请求,通过回调函数mv_dev->driver->setup()来实现。

PS: 关于请求,参看USB协议ch9。

重点关注mv_dev->driver->setup()的枚举过程,其实质就是主机从USB设备得到描述符。

这里的mv_dev->driver就是上文2.2所提到的gadget设备驱动,通过driver->bind绑定具体的驱动功能,如果是composite复用设备,则绑定usb_composite_driver结构,通过driver->setup实现设备的枚举过程,代码如下,其中的GET_DESCRIPTOR, SET_CONFIGURATION, 以及f->setup是必要的枚举过程。

这篇关于usb gadget的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/596081

相关文章

Usb Audio Device Descriptor(10) Hid Device

对于 Standard Interface Descriptor, 当 bInterfaceClass=0x03时,即为HID设备。Standard Interface Descriptor如下 struct usb_standard_interface_descriptor{U8 bLength; /*Size of this descriptor in bytes*/U8 bDescrip

Android rk3399 UAC(USB Audio)开发笔记

一、UAC有1.0和2.0,因Windows对2.0支持不好,我使用的是UAC1.0驱动 内核配置:CONFIG_USB_CONFIGFS_F_UAC1          ---这个宏配置无需物理codec,使用虚拟 alsa codec  驱动路径:"kernel\drivers\usb\gadget\function\f_uac1.c" 内核配置:CONFIG_USB_CONFIGFS_

多款式随身WiFi如何挑选,USB随身WiFi、无线电池随身WiFi、充电宝随身WiFi哪个好?优缺点分析!

市面上的随身WiFi款式多样琳琅满目,最具代表性的就是USB插电款、无线款和充电宝款。今天就来用一篇文章分析一下这三种款式的优缺点。 USB插电款 优点:便宜,无需充电,在有电源的地方可以随时随地插电使用,比如中兴的USB随身WiFi。 缺点:无电源的情况下,无法带出门使用,部分品牌考虑到这个问题,会配备一个充电仓,这个充电仓相对来说就有点累赘了。网速上也不太稳定,波动比较大。

基于FPGA的开源项目:FOC/SHA/USB/JPEG等

文章目录 [1. USB 1.1控制器](https://github.com/WangXuan95/FPGA-USB-Device)[2. FOC控制算法](https://github.com/WangXuan95/FPGA-FOC)[3. BSV高级硬件描述语言入门指南](https://github.com/WangXuan95/BSV_Tutorial_cn)[4. 基于XDMA的

关于小米手机USB传输稍大点的文件老中断的问题解决方法!

关于小米手机USB传输稍大点的文件老中断的问题解决方法! 这是一个很痛苦的事情,当你传输大文件的时候,传输到一半就会莫名其妙的中断,拔插数据线很多次以后,好不容易没准可以成功传输一次。 后来使用了360的手机助手,从调试模式传输文件,虽然不会中断,但是慢的要死。 最后我看到手机插上后手机提示 有3种模式:仅限充电 传输文件(MTP) 传输照片(PTP)。当然我们选择传输文件是没戏了,会中

VirtualBox安装VirtualBox Extension Pack,支持USB No USB devices connected after upgrade

安装步骤及出现问题解决No USB devices connected after upgrade: 一、本要主机ubuntu14.04,安装virtualbox,支持usb设置步骤: 1.安装VirtualBox. 可以从https://www.virtualbox.org官方站点下载或者从软件中心。 2.在VirtualBox里安装Windows; 3.为USB2.0,你需要

QT Android开发之Android端usb调试模式设置与问题解决

一.QT android开发android端usb调试模式设置 QT android开发环境搭建完成后,android设备需要打开usb调试模式才能正常连接,下面以小米ipad为例进行设置(其他手机和ipad设置方法类似) 常见问题: 本文会介绍相关问题的解决方法。 二.小

【电子通识】无法识别USB设备怎么就和USB线序有关系

最近在做一个和USB通信有关的工装,有点类似于HUB但又有点不同。Type-C和USB-A两种输入选择,然后再选择输出8个通道中的一个。         在焊接调试时,首先先验证一路。因为USB-A公头转USB-A公头的线有点难找,所以找到一根USB线缆,中间剪掉一半直接焊在USBA焊盘上方便调试。         根据标准的USB接口线颜色的定义,一般为红(VCC)

将RK3588平台的TMC等USB function驱动挪出内核源码树

背景 前一段时间定位一个上位机通过USB-TMC连接下位机(基于RK3588平台)时界面发生卡顿的问题,发现USB-TMC驱动代码是放在内核源码树里跟内核一起编译的,觉着这样既不便于更换TMC 驱动版本(每次修改代码都要重编内核),也不便于将TMC驱动代码单独放到SVN管理(RK的build系统有16GB之巨,全部提交到SVN服务器吃不消),于是考虑将其挪到源码树外。 想参照自己之前在zynq

Linux内核源码-USB驱动分析

基础层次详解 通用串行总线(USB)主要用于连接主机和外部设备(协调主机和设备之间的通讯),USB 设备不能主动向主机发送数据。USB 总线采用拓扑(树形),主机侧和设备侧的 USB 控制器(Host 和 UDC),每个总线只要一个主机控制器。 主机侧的 USB 节点为根节点,所有子节点都连接在根节点集线器(Root hub)上,根节点有 USB 主机控制器(USB Host Controll