Linux USB架构

可以看出一个USB体系需要4个驱动:USB设备驱动(主要编写这部分),USB主控制器驱动,Gadget驱动,UDC驱动。

USB主要有4个功能:

MassStorage:大容量存储,如硬盘,U盘。

USB-HID:人体接口设备,鼠标,键盘。

RNDIS:网卡。

CDC-ACM:u转串口。

USB描述符:

USB驱动程序位于不同的内核子系统和USB主控制器之间,USB核心为USB驱动提供了用于访问和控制USB硬件的软件接口,使得USB设备驱动程序不必考虑USB硬件控制器。

从上图看,一个USB驱动是对应一个接口的,所以一个设备可能有多个驱动。

USB总线驱动与设备

驱动结构体

一个USB驱动使用struct usb_driver来描述(每种总线都有driver这种结构):

而上图中设备列表中的usb_device_id如下:

填充上面的ip_table需要定义通过USB_DEVICE来定义一种USB设备的USB_DEVICE(vend,prod)

上面是定义一种,下面的宏是定义一类

注册驱动:

设备结构体

配置描述符:

配置结构体:

Linux内核使用Struct usb_host_config来描述一个USB配置:

配置描述符结构体:

接口描述符:

接口结构体:

Linux kernel使用struct usb_interface来描述usb接口:

接口设置结构体

设置和配置是有区别的:

一个配置包含一个或多个接口

一个接口包含一个或多个设置

下面是一个例子:

Linux kernel使用struct usb_host_interface来描述USB接口设置:

接口描述符结构体

端点描述符:

端点结构体

Linux kernel使用struct usb_host_endpoint来描述USB端点:

端点描述符结构体

Linux内核使用struct usb_endpoint_decriptor来对USB描述符中的端点描述符进行描述

URB:

USB请求块是USB设备驱动中用来描述与USB设备通信所用的基本载体和核心数据结构,非常类似于网络设备驱动中的sk_buff结构体,是USB主机与设备通信的“电波”。

URB处理的流程如下:

1. USB设备驱动程序创建并且初始化一个访问特定USB设备特定端点的urb,并提交给USB core;

2. USB core提交该urb到USB主控制器驱动程序;

3. USB主控制器驱动程序根据该urb描述的信息,来访问USB设备。

4. 当设备访问结束后,USB主控制器驱动程序通知USB设备驱动程序。

流程一

创建urb:

初始化URB:

流程二

流程三,流程四:

最新文章

  1. 【Win10开发】Toast通知——前台激活
  2. ASP.NET MVC 简介
  3. 【目录】Qt
  4. k.APR通道特殊配置
  5. MyBatis入门学习教程-解决字段名与实体类属性名不相同的冲突
  6. iOS获取手机型号,类似iphone 7这种 含swift和OC
  7. UIDynamic(物理仿真)
  8. jackson json转实体 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException
  9. 详解C#委托,事件与回调函数
  10. Ajax的利弊
  11. Linux命令 查看文件内容
  12. 从运维的角度分析使用阿里云数据库RDS的必要性--你不应该在阿里云上使用自建的MySQL/SQL Server/Oracle/PostgreSQL数据库
  13. 【模板小程序】求第n个fibonacci数
  14. IOS开发之记录用户登陆状态,ios开发用户登陆
  15. [NOI2010]海拔(最小割)
  16. MySQL复制ERROR 1794 (HY000): Slave is not configured or failed to initialize properly.
  17. Qt for Embedded Linux
  18. SQL Server占用服务器内存过高
  19. python应用之爬虫实战1 爬虫基本原理
  20. Error:Could not find com.github.dcendents:android-maven-plugin:1.5.

热门文章

  1. 004-行为型-02-模板方法模式(Template Method)
  2. Eclipse安装中文简体语言包
  3. Source Insight 4.0配置格式化工具AStyle.exe
  4. Qt编写气体安全管理系统12-设备双击
  5. 数据库分库分表中间件ShardingSphere推荐
  6. JS的正则表达式限定开始和结尾等测试
  7. 【Leetcode_easy】849. Maximize Distance to Closest Person
  8. 海思HI2115芯片-NB-IOT模块向外发短信测试
  9. linux 使用jar 打包成war
  10. __iter__方法demo