linux读写usb host,LINUX下USB1.1设备学习小记(3)_host与device

各位还记得”任何传输都是由host发起的”这句话么~

在usb设备插入pc中到拔出usb设备,都是由host进行询问的

一个usb鼠标的工作流程可以表达如下:

usb鼠标插入pc中:

主机询问设备:给我你的设备信息(控制传输)

主机根据usb鼠标的设备信息进行驱动配置,配置结束后

主机询问设备:给我你的数据信息(中断传输)

一定的时间间隔之后....

主机询问设备:给我你的数据信息(中断传输)

一定的时间间隔之后...

主机询问设备:给我你的数据信息(中断传输)

.................

直到这个设备被拔出,主机不断要求设备提供鼠标的按键和移动数据

因为任何传输都是由host发起的,所以host是我解析的第一对象,而UHCI这个host是我将介绍的对象,目前PC上有3类主机控制器,分别为UHCI,OHCI和EHCI

UHCI和OHCI是低速和全速USB设备的主机控制器,所有高速设备都是EHCI这个主机控制器管理的

为什么选择UHCI而不是OHCI呢~ 很简单,因为我是参考fudan_abc的BLOG进行解析的,他写的是关于UHCI的,呢么我只有写UHCI的,因为很多技术规范只有UHCI的生产商英特尔才知道,包括他的BUG

下面我先简短的介绍一下UHCI

UHCI全称Universal Host Controller Interface,也就是通用主机控制器接口,他的一个重要责任就是发送USB通信中最关键的令牌包,下面我们就看看他是怎么发送令牌包的

在UHCI的软件控制中,最小的处理为一个叫Transfer Descriptor的结构,这个结构为16字节

090310140750.png

黄色区域表示主机控制器硬件可以读写的,白色表示主机控制器硬件只能读,不能写

所有字段都能由主机控制器驱动,也就是软件来写

td的这4个字段从上倒下分别为连接字段,控制字段,令牌字段和缓冲字段

呢么这个TD完成一个什么样的功能呢?~

很可惜,从软件上看,这个TD负责完成一个事务的传输,也就是令牌包,数据包和握手包这3个包的传输都由TD来描述,所以单独令牌包的发送是硬件自动完成的,软件是参与不到的,所以我们只能从一个控制传输来看看UHCI是如何完成事务传输的

不过在这之前还需要介绍1个知识,Frame List

Frame List是一个由1024个Frame组成的帧列表,干嘛用呢?~很简单,所有的td都是挂载在Frame上的,然后UHCI分配给每帧1ms的时间做传输,执行Frame上的td队列,

1ms到期后就处理下一帧的td队列

现在我们假定设备的地址为20,使用0号端点,发送一个setup事务,任务为取得大小为18字节的设备描述符

这个setup事务使用一个setup事务,数据阶段使用一个in事务,状态阶段使用一个out事务, 好,现在开始构建td队列

第一个事务为setup事务

1. 首先填充 td令牌字段中的pid字段,setup事务中的令牌包为setup包,setup包的pid为1101,pid效验为0010,则pid字段为0x2D

2. 填充td令牌字段中的地址字段,这里我们使用的地址为20,则填充0x14

3. 填充td令牌字段中的端点字段,这里我们使用的端点为0,则填充0x0

4. 填充td令牌字段中的数据长度字段,setup事务中data的数据大小为8字节,则填充0x8

5. 填充td令牌字段中的数据包类型字段,setup默认为0,这里填充为0

6. 填充td的缓冲字段,这个缓冲字段是一个指针,指向一个DMA地址,UHCI硬件根据事务是写还是读来直接读写这个地址上的数据,不需要CPU的参与,假设我已经为8字节的数据申请了一个DMA地址,为0xFFFF,则填充0xFFFF到缓冲字段

7. 填充td的连接字段,因为还有一个数据阶段的in事务和状态阶段的out事务,这里连接数据阶段的in事务所使用的td地址

第二个事务为数据阶段的in事务

1. 首先填充首先填充 td令牌字段中的pid字段,in事务中的令牌包为in包,in包的pid为1001,pid效验为0110,则pid字段为0x69

2. 填充td令牌字段中的地址字段,这里我们使用的地址为20,则填充0x14

3. 填充td令牌字段中的端点字段,这里我们使用的端点为0,则填充0x0

4. 填充td令牌字段中的数据长度字段,我们所需要的设备描述符的大小为18字节,则这里填写为0x12

5. 填充td令牌字段中的数据包类型字段,因为这是第一个数据包,第一个数据包所使用的类型为data1,这里填充为1

6. 填充td的缓冲字段,这个缓冲字段是一个指针,指向一个DMA地址,UHCI硬件根据事务是写还是读来直接读写这个地址上的数据,不需要CPU的参与,假设我已经为18字节的数据申请了一个DMA地址,为0xCCCC,则填充0xCCCC到缓冲字段

7. 填充td的连接字段,因为还有一个状态阶段的out事务,这里连接状态阶段out事务所使用的td地址

第三个事务为状态阶段所使用的out事务

1. 首先填充首先填充 td令牌字段中的pid字段,out事务中的令牌包为out包,out包的pid为0001,pid效验为1110,则pid字段为0xE1

2. 填充td令牌字段中的地址字段,这里我们使用的地址为20,则填充0x14

3. 填充td令牌字段中的端点字段,这里我们使用的端点为0,则填充0x0

4. 填充td令牌字段中的数据长度字段,状态阶段的数据包中的数据长度为0,这里填充为0x0

5. 填充td令牌字段中的数据包类型字段,因为这是状态阶段的数据包,规定使用的数据包类型为data1,这里填充为1

6. 填充td的缓冲字段,因为该数据包的数据为0,这里填充0

7. 填充td的连接字段,因为后面没有事务了,这里填充停止标志

现在把这3个事务连接到帧上,

形成下图

090310140836.png

UHCI如何进行操作呢?~  我形象的比喻一下

1号td(setup事务)-setup阶段

1. 主机:我发setup包了,等一下我还要发个数据包

2. 主机:我发数据包了

3. 设备:我收到了

2号td(in事务)-数据阶段

1:主机:我发in包了,你给我返还一个数据包

2:设备:我发数据包了

3:主机:我收到了

3号td(out事务)-状态阶段

1. 主机:我发out包了,等一下我还要发个数据包

2. 主机:我发数据包了

3. 设备:我收到了

这样,一个控制传输就完成了

是不是觉得很简单呢?~

其实USB真正复杂的地方在于休眠和恢复,这些都是由主机控制器来完成的,平时USB驱动程序是不会接触到的,但在之后的UHCI在LINUX中的驱动中我将尽自己的能力分析,毕竟我的数模电路基础几乎为0,大家多包涵 = 3=

了解了主机端,我们再看看设备端,设备端的工作相对较少,为什么呢?看看前面控制传输的图,可以发现,所有的事务的第一个包都是黄色的,也就是都是由主机发送的,设备所要发送的包类型只有两种,数据包和握手包,处理流程如下

090310140907.png

在PDIUSBD12中,应答包是由硬件自动判断的,剩下给软件编程人员的就只剩根据令牌包是否发数据包的权利了,真是悲惨啊~

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

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

相关文章

java判断时间区间 隔天_Java初中级程序员面试题宝典

Java基础部分&与&&区别?&和&&都是逻辑运算符,都是判断两边同时真则为真,否则为假;但是&&当第一个条件不成之后,后面的条件都不执行了,而&则还是继续执行,直…

什么是sns

SNS 目录[隐藏] 第一章 什么是SNS? 第二章 SNS带给顾客的特殊价值描绘 第三章 观察SNS的技术与服务 第四章 SNS市场与竞争 第五章 SNS的主要营销策略简介 第六章 中国SNS的发展与主要网站及产品SNSSNS,全称Social Networking Services,即社会…

elsa-core——1.Hello World:Console

github上有一个开源的工作流项目elsa,elsa-core是core语言的版本,其文档因为是英文,因此会让很多人不想看,或者是看不下去,从这篇文章开始我将开始对elsa-core的文档翻译成中文并分享出来,方便大家查看与学…

docker 查看容器_Docker介绍

docker介绍什么是docker?我们先看一下官方文档对docker的定义。翻译一下就是:Docker是一个集开发,发布和运行应用程序的开放平台。Docker能够分离应用和基础架构,从而可以使得用户可以快速交付软件。借助于Docker,用户…

ASF经验谈(上)

http://software.intel.com/zh-cn/blogs/2009/12/01/asf/?cidsw:51cto【前言】写这篇文章之前先声明一下,笔者这里说到的ASF不是指Microsoft的多媒体文件的ASF格式(可能这个很多人更熟悉一些),而是用于远程管理的ASF(Alert Stand…

ubuntu linux 批量部署,使用Cobbler批量部署Linux和Windows:CentOS/Ubuntu批量安装(二)...

通过前面服务端的部署,已经配置好了 Cobbler Server 端,接下来开始进行 CentOS/Ubuntu 的批量安装,在进行 CentOS/Ubuntu 批量安装时,也需要通过Cobbler来做相应的发行版导入配置。流程如下:上传ISO镜像到 Cobbler Ser…

盘点这些年被黑的最惨的语言

全世界只有3.14 % 的人关注了爆炸吧知识这些年,被黑过的语言数不胜数,最惨的要数HTML,但CSS、Python等也惨遭黑手比惨?这就来一波。HTMLHTMLC语言C语言JavaJavaJavaJavaJavaScript JavaScript JavaScriptJavaPHPPHPPHPPHPPythonPy…

2011目标 及 总结

20110918 添加 Glodon 任务规划 20110612 修改 经过年中分析,把下半年目标定为: 重心转向技术开发,有闲暇的时间就继续完成年初计划中的其它项。在技术学习方面,注意:不要花太多时间在开发“小系统”上,也不…

python 批量下载网页图片_Python实现多线程批量下载图片

《派森》(Python)3.13 win32 英文安装版 类型:编程工具大小:21M语言:英文 评分:8.7 标签: 立即下载 爬取图片可真的是一个可遇不可求的机会。 有需求就会动力。 目标:爬取某个网站上n多页的链接&#xff0c…

linux中获取redis的map,深入Redis之 bitmap位图和HyperLogLog(五)

bitmap位图我们知道一个字符占1个字节,也就是8个位例如set name bigbig字符串中的3个字符的ASCII码为98 105 113所以big转为二进制就是:01100010|01101001|01100111b i g占了3个字节的大小,一共24个位。bitmap位图可以帮我们获取…

想象中的同居生活 VS 真实的同居生活

1 长颈鹿是怎么喝水的2 为了防止雨伞被偷设计师还是真动了不少脑筋呢-3 睡在这样的床上,晒着太阳,肯定超赞4 如何阻止猫咪上楼5 想象中的同居生活 VS 真实的同居生活 6 硬生生把苹果削成吃不饱也吃不起的样子7 来来来准备瓜子杏仁你点的每个赞&#xff…

抽丝剥茧!Source Generators原理讲解

前言前段时间,我们已经用Source Generators实现了好多功能,比如AutoMapper、API最佳实践。你看完那些实现代码,是不是还有点云里雾里!Source Generators到底是怎么做到的?基础知识Source Generators是编译过程的一部分…

GPON技术概述

GPON技术转载自《电子发烧友》。文章链接请见:http://www.elecfans.com/article/88/171/2009/2009050556028.htmlGPON技术详述介绍GPON 技术之前,先介绍目前也被应用的另一种PON 技术“EPON”。1.EPON技术介绍EPON 又名 GEPON,是由…

linux中断处理汇编入口,Linux中断处理体系结构分析(一)

中断也是一种异常,之所以把它单独的列出来,是因为中断的处理与具体的开发板密切相关,除一些必须、共用的中断(比如系统时钟中断、片内外设UART中断)外,必须由驱动开发者提供处理函数。内核提炼出中断处理的共性,搭建一…

没有违反GPL,他们真的给了源码

文 | Travis出品 | OSC开源社区(ID:oschina2013)【前情回顾】国内智能设备制造商 UMIDIGI 因违反 GPLv2 协议引发争议,并告知开发者“想要源码上门自取”。而后,知名科技博主 Naomi Wu(机械妖姬&#xff09…

有朋友问我为什么这么帅

1 2 重庆的朋友告诉我这是微辣3 我就说我只是虚胖,这下你相信了吧?4 这明明就是打情骂俏好嘛5 这还是那个平常瓶盖都拧不开的女孩子吗6 被一个机器人撩到了!7 这是什么原理?你点的每个赞,我都认真当成了喜欢

python安装详细步骤mac_Mac安装python3的方法步骤

Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的。 现在 Mac 上默认安装的 python 版本为 2.7 版本,若 安装 新版本需要 通过 该地址进行下载: https://www.python.org/ftp/python/3.5.0/python-3.5.0…

在Excel中实现下拉列表选择录入

我们在用Excel录入表格数据时,常常会遇到某列数据的值只在几个固定值中选择一个的情况,比如:人的性别列只可能录入男或女,对学历列只可能录入高中、大专、本科、研究生之一等。遇到这类数据,如果我们手工录入&#xff…

你吃的瓜子仁,真是老奶奶磕出来的?!

全世界只有3.14 % 的人关注了爆炸吧知识本文转载自微信公众号一只学霸(ID:bajie203)萌萌不是挺爱吃瓜子仁吗有次他吃的时候大毛在旁边看着看着突然想到一个问题吓得我反思了一下自己是怎么和他们考上同个学校的没思考出来吓得我给大家写了这篇…

持续20年,一场威胁Linux存亡的诉讼终结束

文 | 局长出品 | OSC开源社区(ID:oschina2013)一场持续将近 20 年、曾被认为会威胁 Linux 存亡的诉讼终于迎来了尾声。这场诉讼开始于 2003 年,不过其背后的事件最早可追溯到 1998 年。当时 IBM 和 Santa Cruz Operation&#xff…