linux USB 编程
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:
流程二
流程三,流程四:
linux USB 编程的更多相关文章
- Linux usb 2. 协议分析
文章目录 0. 背景 1. USB 协议传输格式 1.1 Packet 1.1.1 Token Packet 1.1.2 Data Packet 1.1.3 Handshake Packet 1.1. ...
- storysnail的Linux串口编程笔记
storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...
- Linux usb子系统(一):子系统架构
一.USB协议基础知识 前序:USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB) USB2.0版本速度480Mbps(高速USB). ...
- Linux串口编程详解(转)
串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...
- linux串口编程总结
串口本身.标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口以前被广泛用于连接计算机和终端设备和各种外部设备.尽管以太网接口和USB接口也是以一个串行流进行数据传送的.可是串口连接 ...
- linux下编程epoll实现将GPS定位信息上报到服务器
操作系统:CentOS 开发板:fl2440 开发模块:A7(GPS/GPRS),RT3070(无线网卡) ********************************************** ...
- 《网蜂A8实战演练》——8.Linux USB 主机控制器和设备驱动
USB 的全称是 Universal Serial Bus,顾名思义:通用串行总线. 提到总线,联想一下,在你心目中总线总是用来干嘛的?还记得 I2C 总线? I2C 总线上挂有二条信号线,一条是 S ...
- linux usb驱动记录(一)
一.linux 下的usb驱动框架 在linux系统中,usb驱动可以从两个角度去观察,一个是主机侧,一个是设备侧.linux usb 驱动的总体框架如下图所示: 从主机侧看usb驱动可分为四层: ...
- (47)LINUX应用编程和网络编程之二Linux文件属性
Linux下的文件系统为树形结构,入口为/ 树形结构下的文件目录: 无论哪个版本的Linux系统,都有这些目录,这些目录应该是标准的.各个Linux发行版本会存在一些小小的差异,但总体来说,还是大体差 ...
随机推荐
- django ORM 自定义字段
class FixedCharField(models.Field): """ 自定义的char类型的字段类 """ def __init_ ...
- 【Linux】宝塔上 GitLab数据迁移修改配置后nginx无法启动
背景: 服务器A 向 服务器B 迁移数据,修改配置重启.发现gitlab的 nginx 无法启动. 查找原因 gitlab-ctl tail 错误信息: 网上查了查,似乎是宝塔的问题, 原因应该是为了 ...
- Linux下手动查杀木马
(1).模拟木马程序病原体并让其自动运行 黑客让脚本自动执行的3种方法:1.计划任务:2.开机启动:3.系统命令被人替换,定一个触发事件. 1)生成木马程序病原体 [root@youxi1 ~]# v ...
- linux 大量time_wait的解决方法
通过调整内核参数解决vi /etc/sysctl.conf 编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ip ...
- python signal模块
signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时发出SIGALRM等.要注意,signal包主要是针对UNIX平台(比如Linux, MAC ...
- C++ String 及其与char[]的比较
在学习C++之前 一般都是学过了C语言了 在C语言中 我们对字符串进行保存操作 使用的是char[] 但是在C++中 string比char[]的使用更为频繁 常见 下面稍微讲一 ...
- maybatis调用函数和过程的区别
//定义存储过程create or replace procedure pag_add(p1 varchar2,p2 varchar2,p3 out varchar2) as begin p3:=p1 ...
- java端同时获取批量上传图片及其他数据
Controller层: @ResponseBody @RequestMapping(value = "", method = RequestMethod.POST) public ...
- [转帖]PCIe 6.0 v0.3版本草案已完稿:2021年转正、x16带宽飙至128GB/s
PCIe 6.0 v0.3版本草案已完稿:2021年转正.x16带宽飙至128GB/s https://www.cnbeta.com/articles/tech/899389.htm 硬件发展突飞猛进 ...
- 【转帖】docker 如何删除none镜像
https://blog.csdn.net/hicoldcat/article/details/80802447 shell 命令博大精深 需要仔细学习 删除none的镜像,要先删除镜像中的容器.要删 ...