USB原理简单叙述

USB简介:

USB的几种版本:

1. USB 1.0:速度 1.5Mb/s

2. USB 1.1:速度 12Mb/s

3. USB 2.0:速度 60MbB/s

4. USB 3.0:速度 640MB/s

USB的主要优点:

1. 可以热插拔:不需要重复“关机将并口或串口电缆接上再开机”的动作。

2. 携带方便。

3. 标准统一,USB鼠标,USB硬盘,USB打印机都是用同样的标准与个人电脑连接。

4. 可以连接多个设备:可以使用USB HUB不断级联(最高可以连接127个设备)。

USB类型(仔细一看还真不少):

一个正常的USB接口的引脚说明如下:

USB系统结构:

一个USB的系统拓扑结构包含:主机,根集线器,集线器,设备。

主机:对于每个USB系统来说,都有一个成为HOST控制器(就是上图的主机)的设备,该HOST控制器和一个根HUB最为一个整体。这个根HUB下面又可以级联多级的BUB。USB主控制器负责处理主机与设备之间的电器盒协议层互联。常见的USB主控制器规格有:

OHCI:主要是非PC系统上的USB芯片。如ARM。

UHCI:大多是intel和via主板上的USB控制器。他们是USB1.1规格。

EHCI:USB2.0规格,兼容OHCI和UHCI。

根集线器:每个USB Host控制器都会自带一个USB Hub,被称为根集线器。这个根HUB可以接子HUB,每个HUB上挂在USB设备。通过外接USB Hub,可以插更多的USB设备。当USB设备插入到USB Hub或从上面拔出时,都会发出电信号通知系统。

USB设备:USB设备就是插在USB总线上工作的设备,广义上讲USB Hub也算是USB设备。

一个USB设备的逻辑结构如下:

每个USB设备都可以包含一个或者多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接器件需从中选择一个),配置有多个接口组成。在USB协议中,接口由多个端点组成,代表一个基本的功能。看下面的一个例子:

貌似其他的都比较好理解,主要是端点的概念,端点是USB设备中唯一可寻址部分,它是位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据。主机与设备的通信最终作用于设备的各个端点,它是主机与设备间通信交流的一个逻辑终端。

设备枚举:基于pnp机制,设备被枚举时,他必须向主机报告各个端点的特性,包括端点号,通信方向,端点支持的最大包大小,带宽要求。

端点0:每个设备必须有端点0,他用于设备枚举和对设备进行一些基本的控制功能。除了端点0,其余的端点在设备配置前不能与主机通信。

每个USB设备有一个唯一的地址,这个地址实在设备连接上主机时,由主机分配的。而设备中的每个端点在设备内部有唯一的端点号。

USB设备描述符:

当我们把USB设备查到我们的主机上的时候,主机能够自动识别出我们的USB设备类型。就是依靠的USB设备描述符。

就好比每一个PCI设备中,都有这么一组固定格式的配置寄存器,通过这组寄存器,主技能获取PCI设备的信息。在每一个USB设备内部,同样也包含了类似于PCI寄存器这样的固定格式的数据,通过这些数据,USB主机就可以获取USB设备的类型,生产厂商等数据。这组固定格式的数据,我们就称之为USB描述符。标准的USB设备有5种描述符:

1. 设备描述符

2. 配置描述符

3. 接口描述符

4. 端点描述符

5. 字符串描述符

一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个使用了几个端点,就有几个端点描述符。

USB数据传输:

USB传输:针对设备对系统资源要求的不同,在USB规范中规定了4种不同的数据传输方式:

1. 等待传输

2. 中断传输

3. 控制传输

4. 批量传输

控制传输:控制传输主要用来传输设备控制命令,设备状态查询及确认命令。当USB设备接收到这些数据和命令后,将依据先进先出的原则按队列方式处理到达命令。

中断传输:该方式传输的数据量很小,但是这些数据需要及时处理,以达到实时的效果,此方式主要用在键盘,鼠标以及游戏手柄上。注意,这个中断并不是硬件上的中断,因为USB的通信只能有主设备发起,所以这个中断实际上是主设备不断地查询。

等时传输:该方式用来连接对数据的正确性要求不高而对时间极为敏感的外部设备。如麦克风等。等时传输以固定的传输速率,连续不断的在主机与USB设备之间传输数据,在传输数据发生错误的时候,USB并不会处理这些错误。

批量传输:该方式用来传输要求正确无误的数据。通常打印机,扫描仪和数码相机以这种方式与主机连接。

下面粗略的说一下USB抓包工具抓的包的格式,为以后做准备:

USB的数据传递首先是基于Transfer(传输)的:中断传输,批量传输,同步传输,控制传输。

一个transfer由一个或者多个事务(transaction)构成,事务可以分为in事务,out事务,setup事务。

一个事务由一个或者多个packet(包)构成,包可以分为令牌包(setup),数据包(data),握手包(ACK)和特殊包。

一个包可以由多个域构成,域可以分为同步域(SYNC),标示域(PID),地址域(ADDR),端点域(ENDP),帧号域(FRAM),数据域(DATA),校验域(CRC)。

USB设备枚举:

USB设备在正常工作之前,第一件要做的事情就是枚举。枚举是让HOST认得这个USB设备,并且为该设备准备资源,建立好主机和设备之间的数据传递机制。

一个设备枚举的过程分为如下8步:

1. 获取设备描述符

2. 复位

3. 设置地址

4. 再次获取设备描述符

5. 获取配置描述符

6. 获取接口,端点描述符

7. 获取字符串描述符

8. 选择设备配置

下图是接入一个USB鼠标之后完整的枚举过程:

下面,我们来逐步分析:

获取设备描述符:

传输0的第一个事务如下:

可以看出,这是一个setup事务,设备要执行的命令就是GET_DESCRIPTOR,也就是获取描述符。

其中分为三个包,第一个令牌包和第二个数据包为主机传输给设备。第三个握手包为设备传输给主机。

主机发送完令牌包,下一个数据包包含的就是命令了,主要分析一下第二个包数据包中的DATA字段。Data中总共有16位,每位的含义如下(USB协议报文是小端模式!!!):

因为USB是小端模式,所以从最低到最高分析:

0x80:表示期望的数据传输方向为设备传输给主机,这条命令的接收者为设备。

0x06:代表了一个命令,根据table9-3,可以得知,代表的命令为获取描述符。

0x00 0x01:值为1,这两个字节中的高字节代表type,根据下表可查出type为device,所以结合上一字节得出结论:该命令想要得到的描述符为设备描述符。

传输0的第二个事务如下:

这是一个in事务,是设备把自己的描述符传递给主机,可以看出,还是由主机先发起连接,然后设备发送设备描述符,最后主机给出ACK握手包。

传输0的第三个和第四个事务是在继续传输设备描述符

传输0的第五个事务为按照协议发送的,没有实质意义。

复位:

这个包是发送复位命令。

设置地址:

设置地址由传输5和传输6构成。传输6为协议要求,没有实质意义。主要分析传输5的data.

第二个字节为0x05,根据查表可知代表的意义为set_address,当命令为set_address的时候,根据手册可以得出data的格式是这样的:

再次获取设备描述符:

这个过程和第一次获取设备描述符一样,对于usb鼠标这种设备描述符比较简短的设备这个步骤不是必须的,但是对于某些设备描述符比较长的设备第一次只获取部分描述符,这一次才会获取完整描述符。顺便补充一句,软件自动解析的设备描述符是这样滴:

获取配置描述符:

事务12中第二个包,根据其第二个字节可知这是一个获取描述符的命令,根据其第四字节可知获取的描述符类型为

事务13和事务14为设备向主机发送配置描述符。

获取接口,端点描述符:

看到这有个小疑问,事务16中不是获取配置描述符的格式吗????视频里说接口端点描述符在配置描述符中一起获取出来了,现在对协议还是很模糊….

获取字符串描述符:

传输5用来获取字符串描述符:

事务23中第一个包是令牌包,感觉令牌包的作用就是主机用来发起连接。第二个包是数据包,根据第四个字节0x03,可以知道他获取的是字符串描述符。第三个包为设备发送给主机的握手包。

事务24中有设备将字符串描述符发送给主机。

事务25为协议要求,没有实际意义。

传输6和传输7也是用来获取字符串描述符,但是看一看到,不同获取的描述符序号不一样。

选择设备配置:

可以看出,其data选项中第2个字节是0x09,代表set_configuration。根据set_configuration的指令格式:

可以得知,主机选取的是1号配置。

这条有点晕,明明是set传输,但是0x0a是get_interface啊,不过我认为这一步应该是设置接口。

至此,USB鼠标枚举过程结束!

来自为知笔记(Wiz)

时间: 2024-08-17 05:05:12

USB原理简单叙述的相关文章

鸽巢原理简单应用

http://poj.org/problem?id=2356 从n个数里面取出一些数,这些数的和是n的倍数.并输出这些数. 先预处理出前n个数的和用sum[i]表示前i个数的和.若某个sum[i]是n的倍数,直接输出前i个数即可. 否则说明n个数中对n取余的结果有n-1种,即余数为(1~n-1),根据鸽巢原理知必定至少存在两个sum[i]与sum[j]对n取余的结果相等.那么i+1 ~ j之间的数之和一定是n的倍数. #include <stdio.h> #include <iostre

jQuery ui widget和jQuery plugin的实现原理简单比较

一.创建 1.  jQuery plugin (function($){ $.fn.MyPlugin=function(){ //js代码 } })(jQuery) 为了与页面上其他代码友好相处,将plugin定义在一个闭包里,MyPlugin是plugin的名字.调用方式:$('选择器').MyPlugin(); 2.  jquery ui widget (function($){ $.widget('ui.mywidget',{ options:{ //默认的配置参数 }, //方法的定义

SQLServer 原理简单解析

(1) 客户端sqlserver网络接口通过一种网络协议(可以是共享内存:简单高速,客户端和sql server在同一台计算机默认连接方式:TCP/IP:访问sql server最常用的一种协议,客户端指定ip地址和端口号连接到sql server;命名管道:命名管道和TCP/IP协议在体系结构上是类似的,是为局域网设计的,在广域网中速度会慢一些:VIA:虚拟接口适配器,是一种可以让两个系统进行高性能通信的协议,要求通信两端使用特殊的硬件和专门连接)和服务的的SNI建立了一个连接,然后通过网络协

USB OTG简单介绍

1 引言 随着USB2.0版本号的公布,USB越来越流行,已经成为一种标准接口.如今,USB支持三种传输速率:低速(1.5Mb/s).全速(12Mb/s)和快速(480Mb/s),四种传输类型:块传输.同步传输.中断传输和控制传输.USB应用灵活方便,能满足多种外设的须要.随着个人便携式电子产品的增长和嵌入式技术的飞速发展,USB主机已不再局限于单纯的PC,能够是含有USB主控器的不论什么设备,如PDA.MP3播放器等.在USB2.O规范中也添加了USB嵌入式设备的标准--On-The-Go(O

[源码]Condition的原理,简单案例(ArrayBlockingQueue),复杂案例(LinkedBlockingQueue).

源代码解析 Re'entrantLock lock = new ReentrantLock(fair); Condition   notEmpty = lock.newCondition(); //返回内部类 AbstractQueuedSyncronizer.ConditionObject 各自维护了两个队列.一个是阻塞同步队列 syncQueue 双向队列,一个是条件等待队列. Condition.await两个作用.1.放入同步队列 park 2.realse锁,3等待别人获取锁acqui

LDAP服务器的概念和原理简单介绍

LDAP服务器的概念和原理简单介绍 LDAP和JNDI关系

HTTP原理简单介绍

嗯,  cao,卡顿5s,上次计划撸代码来着,后来感觉不很现实?又着实low比~就打算把笔记搞上一搞~然,今天起个大啊早,又来变卦.哈哈哈~人生处处不惊喜~嘻嘻嘻 来开始你的表演~ <HTTP原理简单介绍>,摘自某论坛......记不得了...... HTTP在今后互联网中(原文如是说)必然将扮演越来越重要角色,国外互联网大佬对https部署竭力鼓吹呐喊,HTTP/2协议推广更是逼着你不上也得上!在HTTPS普及化过程中,必然会损害某些集团利益,但这是互联网趋势,历史的洪流是谁也阻挡不了的(历

全文搜索原理简单解析

文前声明:本人只是知识的搬运工,文中许多知识和观点大多数都是来自于网络或书本,因为没有记录的习惯学习研究完,便忘记名称了,如若还记得,在文后自会添加备注. 注:这是本人的第一篇薄文,水平相形见拙,有错误之处,欢迎指正. 今年的计划是存储领域,希望能深入的了解其原理,如果能有创造性的写出一个自己的文件系统出来就更好了,到目前为止尚无动工的迹象,估计会顺延至明年了吧! 我的计划正好赶上公司的总规划,于是便接了“大数据”的活.刚开始进入这一行,走了不少弯路,说多了都是泪(这不是本文的主题,就此打住,后

View的滚动原理简单解析

一直对View的滚动了解的不深,说明确了吧也能说出个所以然来,所以我就花了点时间做了一个小小的总结,言归正传,view的滑动分为下面三种: 1)View本身不滚动,指滚动View的内容,这也是View类提供的原始方法.通过scrollTo和ScrollBy方法来实现. 2)使用动画,让View来产生滚动效果 3)通过动态的改动LayoutParams的margin等属性让View来产生滚动 本篇博客就简单的分析一下第一种情况,同一时候本文最后还会简单的提供了一个样例: View本身就提供了scr