Linux开发讲课28---Linux USB 设备驱动模型

Linux 内核源码:include\linux\usb.h

Linux 内核源码:drivers\hid\usbhid\usbmouse.c

1. BUS/DEV/DRV 模型

"USB 接口"是逻辑上的 USB 设备,编写的 usb_driver 驱动程序,支持的是"USB 接口":

  • USB 控制器或 Hub 识别出 USB 设备后,会创建、注册 usb_device
  • usb_device 被"drivers\usb\core\generic.c" 驱动认领后,会选择、设置某个配置
  • 这个配置下面的接口,都会分配、设置、注册一个 usb_interface
  • 左边的 usb_driver 和右边的 usb_interface 如果匹配,则调用 usb_driver.probe

2. 接口函数

在 USB 设备驱动程序中,能使用的 USB 函数都在这个头文件里:include\linux\usb.h

2.1 pipe

使用这些接口函数的主要目的是传输数据,传输数据的对象是 USB 设备里的某个 endpoint,这被称为 pipe:

2.2 同步传输函数

对于控制传输、批量传输、中断传输,有 3 个同步函数可以用来直接发起传输。这些函数内部会创建、填充、提交一个 URB("usb request block"),并等待它完成或超时。

函数原型如下:

2.3 异步传输函数

使用 URB 进行传输时,它是异步方式:需要先分配、构造、提交一个 URB("usb request block"),当传输完成后,它的回调函数被调用。

关键就在于需要填充 URB:

  • dev:跟谁传输数据
  • pipe:跟哪个 pipe 传输数据
  • buffer:里面存有要发送的数据,或者用来接收要读取的数据
  • 数据长度
  • 回调函数
2.3.1 分配和释放 URB

函数原型如下:

2.3.2 分配/释放 DMA Buffer

发起 USB 传输时,数据保存在 buffer 里。这个 buffer 可以是一般的 buffer,也可以是 DMA Buffer。

对于一般的 buffer,在提交 URB 时会临时分配一个 DMA Buffer:

  • 发送数据时:函数内部会先从一般 buffer 中把数据复制到 DMA Buffer,在提交给 USB 控制器
  • 读取数据时:USB 控制器先把数据传到 DMA Buffer,函数内部在把 DMA Buffer 的数据复制到一般 buffer
  • 中间增加了一次数据的拷贝,效率低

我们可以直接使用 DMA Buffer,函数原型如下:

2.3.3 填充 URB

对于控制传输、批量传输、中断传输,分别有如下函数:

如果 URB 使用 DMA Buffer,那么还需要设置一个 flag 表明这点:

2.3.4 提交 URB

构造好 URB 后,需要提交到 USB 系统里,才能启动传输。

2.3.5 取消 URB

已经提交的 URB,可以取消它,有 2 个函数:

  • usb_kill_urb:这是一个同步函数,它会等待 URB 结束
  • usb_unlink_urb:这是一个异步函数,它不会等待 URB 结束,USB 控制器驱动会调用它的回调函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/37922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DDR自学笔记

DDR的技术发展 标准名称 内核时钟(MHz) I/O时钟(MHz) 工作电压(v) 预取位数 突发长度 数据速率(MT/s) 数据带宽(GB/s) 拓扑 SDRAM 100-166 100-166 3.3 1 / 100-166 0.8-1.3 T DDR 133-200 133-200 2.5 2n 2 266-400 2.1-3.2 T DDR2 133-200 266-…

【面试干货】与的区别:位运算符与逻辑运算符的深入探讨

【面试干货】&与&&的区别:位运算符与逻辑运算符的深入探讨 1、&:位运算符2、&&:逻辑运算符3、&与&&的区别 💖The Begin💖点点关注,收藏不迷路💖 & 和 …

英飞凌TC3xx之DMA工作原理及应用实例

英飞凌TC3xx之DMA工作原理及应用实例 1 DMA的架构2 必要的术语解释3 DMA请求3.1 DMA软件请求3.2 DMA硬件请求3.3 DMA 菊花链请求3.4 DMA自动启动请求3.5 总结4 小结DMA是直接存储访问Direct Memory Access的简称。它的唯一职能就是在不需要CPU参与的情况下,将数据从源地址搬运…

了解跨站点脚本 (XSS) 漏洞

跨站点脚本 (XSS) 漏洞简介 跨站点脚本 (XSS) 是网络上持续存在的安全威胁,被 Web 应用程序安全项目 (OWASP) 列为十大风险之一。尽管 XSS 是一种老技术,但它仍然困扰着网站,对用户数据和系统完整性构成严重风险。 针对公司的 XSS 攻击实例…

麻雀优化算法(Sparrow Search Algorithm,SSA)

麻雀优化算法(Sparrow Search Algorithm,SSA)是一种基于麻雀觅食行为的优化算法,模拟了麻雀觅食时的搜索策略和社会学习行为。该算法结合了个体的局部搜索和群体的全局搜索特性,能够有效地应用于连续优化问题的求解。 …

(六)SvelteKit教程:刷新数据,preload data,环境变量和部署

(六)SvelteKit教程:刷新数据,preload data,环境变量和部署 1.刷新数据 文件目录如下: ├── stocks │ ├── page.js │ └── page.sveltepage.js 内容如下: export const load a…

Linux线程同步【拿命推荐版】

目录 🚩引言 🚩听故事,引概念 🚩生产者消费者模型 🚀再次理解生产消费模型 🚀挖掘特点 🚩条件变量 🚀条件变量常用接口 🚀条件变量的原理 🚩引言 上一篇…

【Android面试八股文】说一说你对Android中的Context的理解吧

文章目录 一、Context是什么?1.1 主要功能和用途1.2 如何获取 Context 实例?1.3 注意事项二、Context 类的层次结构三、Context的数量四、Context的注意事项五、Android 中有多少类型的 Context,它们有什么区别 ?六、Contextlmpl实例是什么时候生成的,在 Activity 的 oncr…

C语言力扣刷题11——打家劫舍1——[线性动态规划]

力扣刷题11——打家劫舍1和2——[线性动态规划] 一、博客声明二、题目描述三、解题思路1、线性动态规划 a、什么是动态规划 2、思路说明 四、解题代码(附注释) 一、博客声明 找工作逃不过刷题,为了更好的督促自己学习以及理解力扣大佬们的解…

消防设施操作员试题含答案

消防设施操作员试题库与参考答案 1、在网络中传输信息的物理载体指的是( )。 A、导向传输网 B、非导向传输网 C、网络传输介质(正确答案) D、网络传输信号 2、消防安全重点单位应当按照和应急疏散预案,至少( )进行一次演练,…

Java中System的用法

System指的是当前进程运行的操作系统,属于java.lang包下面的类 常见的用法有以下几种: 第一种简单,我们直接上第二种方法吧 currentTimeMills()用法 // 演示currentTimeMillis方法public static void main(String[] args) {// 获取当前时间所对应的毫秒…

获取HTML元素的offsetParent属性

获取HTML元素的offsetParent属性 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在前端开发中常用的一个属性——HTML元素的offsetParent属性…

Apache Ranger 2.4.0 安装部署

1、安装ranger admin 2、源码编译Ranger wget https://www.apache.org/dist/ranger/2.4.0/apache-ranger-2.4.0.tar.gz tar zxvf apache-ranger-2.4.0.tar.gz cd apache-ranger-2.4.0 mvn -Pall clean mvn clean package -DskipTests maven settting可以设置阿里云进行资源下载…

昇思25天学习打卡营第4天|扩散模型

文章目录 昇思MindSpore应用实践基于MindSpore的Diffusion扩散模型1、Diffusion Models 简介2、构建 Diffusion Model 的准备工作3、Attention 机制4、条件 U-Net5、Diffusion 正向过程6、Diffusion 反向过程7、Diffusion 模型训练 Reference 昇思MindSpore应用实践 本系列文章…

YOLO深度学习基准模型概念与应用

YOLO深度学习基准模型概念与应用 YOLO(You Only Look Once)是一种先进的深度学习目标检测模型,由Joseph Redmon等人在2016年首次提出,它彻底改变了目标检测领域的游戏规则,因其独特的一阶段检测方法和实时处理能力而广…

【Qt知识】Geometry属性

一、走进Geometry的世界 Geometry属性是Qt框架中用于处理和操作几何形状的一系列类的集合。它包括了QPoint、QPointF、QSize、QSizeF、QRect和QRectF等。这些类分别代表点、大小、矩形等基本几何概念,它们的存在让图形界面的创建变得既简单又直观。 位置和尺寸。 其…

算法训练营第七十三天 | Bellman_ford算法、SPFA算法、Bellman_ford之判断负权回路

算法训练营第七十三天 | Bellman_ford算法、SPFA算法、Bellman_ford之判断负权回路 Bellman_ford算法 题目链接: https://kamacoder.com/problempage.php?pid1152 对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离&#xff…

新消息!2025第十四届北京国防信息化装备与技术博览会

2025第十四届中国(北京)国防信息化装备与技术博览会 展会时间:2025年6月12日-14日 展会地点:北京中国国际展览中心(朝阳馆) 展会规模:展览面积45000平米,展商1000余家,展…

css 滚动词云

css javascript 实现滚动词云效果 // 163css.js var radius 120; var dtr Math.PI / 180; var d 300; var mcList []; var active false; var lasta 1; var lastb 1; var distr true; var tspeed 10; var size 250; var mouseX 0; var mouseY 0; var howElliptic…

MySQL高级-MVCC-隐藏字段

文章目录 1、介绍2、测试2.1、进入服务器中的 /var/lib/mysql/atguigu/2.2、查看有主键的表 stu2.3、查看没有主键的表 employee2.3.1、创建表 employee2.3.2、查看表结构及其其中的字段信息 1、介绍 ---------------- | id | age | name | ---------------- | 1 | 1 | Js…