USB设备驱动程序的开发与USB协议.docx
《USB设备驱动程序的开发与USB协议.docx》由会员分享,可在线阅读,更多相关《USB设备驱动程序的开发与USB协议.docx(36页珍藏版)》请在冰豆网上搜索。
![USB设备驱动程序的开发与USB协议.docx](https://file1.bdocx.com/fileroot1/2023-2/2/5b073947-27c2-4558-9586-534529ea9732/5b073947-27c2-4558-9586-534529ea97321.gif)
USB设备驱动程序的开发与USB协议
⏹
更多企业学院:
《中小企业管理全能版》
183套讲座+89700份资料
《总经理、高层管理》
49套讲座+16388份资料
《中层管理学院》
46套讲座+6020份资料
《国学智慧、易经》
46套讲座
《人力资源学院》
56套讲座+27123份资料
《各阶段员工培训学院》
77套讲座+324份资料
《员工管理企业学院》
67套讲座+8720份资料
《工厂生产管理学院》
52套讲座+13920份资料
《财务管理学院》
53套讲座+17945份资料
《销售经理学院》
56套讲座+14350份资料
《销售人员培训学院》
72套讲座+4879份资料
第1章 绪论
1.1 USB简介
USB是由世界著名计算机和通信公司等共同推出的新一代接口标准,全称为UniversalSerialBus(通用串行总线)[1],是一种快速、灵活的总线接口。
它是为了解决日益增加的PC外设与有限的主板插槽和端口之间的矛盾而制定的一种串行通信标准。
USB应用十分广泛,并具有下述优点:
1、适用于多种外设,使它不需要为不同的外设准备不同的接口和协议;
2、Windows能自动检测到USB设备的热插拔,并自动配置;
3、PC机上的接口线非常紧缺,而USB设备并不需要用户设置端口故无论从用户使用方便性,或从对资源的占用方面看,USB都很优秀;
4、当接入一个USB设备时,全速USB接口可达12Mbit/s。
考虑到状态、控制和出错信息,最大理论速度仍可达到9.6Mbit/s,这是其他串行接口协议所不能比拟的,且USB也支持1.5Mbit/s的低速传输。
5、USB接口芯片价格低廉,这也大大促进USB设备的开发与应用。
在USB出现之前,计算机典型接口有并行口、串行口、鼠标口、键盘口、显示器口,及各种卡式接口等,与这些接口对应的有各种不同的电缆,在传输速度方面,这些接口都存在速度偏低的问题。
在技术方面,这种设计容易产生I/O冲突,中断不够用,以及对于每一种新的外设都必须设计新的接口卡等缺点。
当今的计算机外部设备,都在追求高速度和高通用性。
USB接口适应了这种要求,并以其速度快、使用方便、成本低等优点,迅速得到了众多PC厂商和半导体厂商的大力支持,外设向USB过度成为必然趋势。
1.2 USB驱动程序的意义
如果PC主机不知道如何与USB外设通信,那么这个USB外设一点用处都没有,人机接口设备(HID)[2]类是Windows完全支持的USB设备类型中的一种,应用程序可以使用操作系统内设置的驱动与HID通信,但与HID通信不像打开一个端口,设定几个参数,然后就可以读写数据那么简单,在应用程序能与HID交换数据之前,它先要找到设备,获取有关它的报告信息。
为做到这些,应用程序必须通过访问通信API函数,使位于上层的应用程序与位于下层的设备驱动程序进行数据交换。
应用程序可以使用任何能访问API函数的程序语言,VC++是一种能访问API函数的功能强大的语言,因此,我们应用VisualC++6.0环境下编写与USB设备通信的Windows程序。
1.3 VC++软件的介绍
应用基于MFCAppWizard的应用程序。
MFC(MicrosoftFoundationClassLibrary)中的各种类结合起来构成了一个应用程序框架,它的目的就是在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。
因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。
MicrosoftVisualC++提供了相应的工具来完成这个工作:
AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。
1.4 系统方案设计
上位机界面应用VC++6.0软件来编写,为了简单适用,在创建工程时采用对话框类型。
一个好的应用程序首先要有好的用户界面,看起来赏心悦目,使用起来简单、方便。
显示界面上的各个元素需要和USB设备上的元件摆放位置相对应。
把要完成的一系列功能的显示元素分成不同的模块来进行程序的编写,每一个模块分别完成一种功能,这样既方便检查程序,也方便在通信发生错误时的对错误进行分析。
为了实现PC机对USB设备的识别,上位机端需要有一个USB设备的驱动程序来识别和支持USB设备,否则PC机将无法识别USB设备。
这里选用DriverStudio软件来编写,它能生成一个简单的驱动程序的框架,根据需要,可以在此基础上进行更深层的开发。
1.5 预期结果
通过上位机软件和驱动程序的编写实现以下功能:
1、完成上位机软件的编写,并可以在设备没有连接时显示连接错误。
2、完成驱动程序的编写,实现上位机能发现USB设备,并使上位机能正确配置设备。
同时在显示界面上显示出找到设备。
3、实现双向传输。
在上位机软件中可以控制USB设备中的相应显示,同时可以接收到USB设备传回的消息,并在显示界面上显示。
达到一个PC机与USB设备信息的交互,完成通信。
4、利用VC编程实现对计算机底层硬件的操作,培养在此方面工程开发的能力。
第2章 USB协议
2.1 USB系统的使用分类及系统的描述
USB设计的初衷是针对桌面电脑而不是应用于可移动的环境下的。
软件体系通过对各种主机控制器提供支持以保证将来对USB的扩充[3]。
USB是一种电缆总线,支持在主机和各式各样的即插即用的外设之间进行数据传输。
由主机预定的标准的协议使各种设备分享USB带宽,当其它设备和主机在运行时,总线允许添加、设置、使用以及拆除外设。
USB系统的描述:
一个USB系统主要被定义为三个部分:
USB的互连、USB的设备、USB的主机。
USB的互连是指USB设备与主机之间进行连接和通信的操作,主要包括以下几方面:
(1)总线的拓扑结构:
USB设备与主机之间的各种连接方式;
(2)内部层次关系:
根据性能叠置,USB的任务被分配到系统的每一个层次;
(3)数据流模式:
描述了数据在系统中通过USB从产生方到使用方的流动方式;
(4)USB的调度:
USB提供了一个共享的连接。
对可以使用的连接进行了调度以支持同步数据传输,并且避免的优先级判别的开销。
USB的设备如下所示:
(1)网络集线器,向USB提供了更多的连接点;
(2)功能器件:
为系统提供具体功能,如ISDN的连接,数字的游戏杆或扬声器。
USB设备提供的USB标准接口的主要依据:
(1)对USB协议的运用;
(2)对标准USB操作的反馈,如设置和复位;
(3)标准性能的描述性信息;
USB传输方式:
USB总线属一种轮讯方式的总线,主机控制端口初始化所有的数据传输。
每一总线执行动作最多传送三个数据包。
按照传输前制定好的原则,在每次传送开始时,主机控制器发送一个描述传输运作的种类、方向,USB设备地址和终端号的USB数据包,这个数据包通常称为标志包(tokenpacket)。
USB设备从解码后的数据包的适当位置取出属于自己的数据。
数据传输方向不是从主机到设备就是从设备到主机。
在传输开始时,由标志包来标志数据的传输方向,然后发送端开始发送包含信息的数据包或表明没有数据传送。
接收端也要相应发送一个握手的数据包表明是否传送成功。
发送端和接收端之间的USB数据传输,在主机和设备的端口之间,可视为一个通道。
存在两种类型的通道:
流和消息。
流的数据不像消息的数据,它没有USB所定义的结构,而且通道与数据带宽、传送服务类型,端口特性(如方向和缓冲区大小)有关。
USB中有一个特殊的通道——缺省控制通道,它属于消息通道,当设备一启动即存在,从而为设备的设置、查询状况和输入控制信息提供一个入口。
2.2 USB物理接口的电器特性
2.2.1 USB物理接口
USB传送信号和电源是通过一种四线的电缆,两根线是用于发送信号。
存在两种数据传输率:
图2.1 USB物理接口
(1)USB的高速信号的比特率定为12Mbps;
(2)低速信号传送的模式定为1.5Mbps;
电缆中包括VBUS、GND二条线,向设备提供电源。
VBUS使用+5V电源。
USB对电缆长度的要求很宽,最长可为几米。
通过选择合适的导线长度以匹配指定的IRdrop和其它一些特性,如设备能源预算和电缆适应度。
为了保证足够的输入电压和终端阻抗。
重要的终端设备应位于电缆的尾部。
在每个端口都可检测终端是否连接或分离,并区分出高速,或低速设备。
2.2.2 电源
主要包括两方面:
(1)电源分配:
即USB的设备如何通过USB分配得到由主计算机提供的能源。
每个USB单元通过电缆只能提供有限的能源。
主机对那种直接相连的USB设备提供电源供其使用。
并且每个USB设备都可能有自己的电源。
那些完全依靠电缆提供能源的设备称作“总线供能”设备。
相反,那些可选择能源来源的设备称作“自供电”设备。
而且,集线器也可由与之相连的USB设备提供电源。
(2)电源管理:
即通过电源管理系统,USB的系统软件和设备如何与主机协调工作。
USB主机与USB系统有相互独立的电源管理系统。
USB的系统软件可以与主机的能源管理系统结合共同处理各种电子元件如挂起、唤醒,并且有特色的是,USB设备应用特有的电源管理特性,可让系统软件和控制其电源管理。
2.2.3 总线协议
主机控制端口初始化所有的数据传输。
每一总线执行动作最多传送三个数据包。
按照传输前制定好的原则,在每次传送开始时,主机控制器发送一个描述传输运作的种类、方向,USB设备地址和终端号的USB数据包,这个数据包通常称为标志包(tokenpacket)。
USB设备从解码后的数据包的适当位置取出属于自己的数据。
数据传输方向不是从主机到设备就是从设备到主机。
在传输开始时,由标志包来标志数据的传输方向,然后发送端开始发送包含信息的数据包或表明没有数据传送。
接收端也要相应发送一个握手的数据包表明是否传送成功。
发送端和接收端之间的USB数据传输,在主机和设备的端口之间,可视为一个通道。
存在两种类型的通道:
流和消息。
流的数据不像消息的数据,它没有USB所定义的结构,而且通道与数据带宽、传送服务类型,端口特性(如方向和缓冲区大小)有关。
多数通道在USB设备设置完成后即存在。
USB中有一个特殊的通道——缺省控制通道,它属于消息通道,当设备一启动即存在,从而为设备的设置、查询状况和输入控制信息提供一个入口。
事务预处理允许对一些数据流的通道进行控制,从而在硬件级上防止了对缓冲区的高估或低估,通过发送不确认握手信号从而阻塞了数据的传输速度。
当不确认信号发过后,若总线有空闲,数据传输将再做一次。
这种流控制机制允许灵活的任务安排,可使不同性质的流通道同时正常工作,这样多种流通常可在不同间隔进行工作,传送不同大小的数据包。
1、USB设备的安装
所有的USB设备都是通过端口接在USB上,网络集线器知道这些指定的USB设备,集线器有一个状态指示器指明在其某个端口上,USB设备是否被安装或拆除了,主机将所有的集线器排成队列以取回其状态指示。
在USB设备安装后,主机通过设备控制通道激活该端口并以预设的地址值给USB设备。
主机对每个设备指定唯一的USB地址。
并检测这种新装的USB设备是集线器还是功能部件。
主机为USB设备建立了控制通道,使用指定的USB的地址和零号端口。
如果安装的USB设备是集线器,并且USB设备连在其端口上,上述过程对每个USB设备的安装都要做一遍。
如果安装的设备是功能部件,那么主机中关于该设备的软件将因设备的连接而被引发。
2、USB设备的拆卸
当USB设备从集线器的端口拆除后,集线器关闭该端口,并且向主机报告该设备已不存在。
USB的系统软件将准确进行处理,如果去除的USB设备上集线器,USB的系统软件将对集线器反连在其上的所有设备进行处理。
3、总线标号
总线标号就是对连接在总线上的设备指定唯一的地址的一种动作,因为USB允许USB设备在任何时刻从USB上安装或拆卸,所以总线标号是USB的系统软件始终要作的动作,而且总线标号还包括对拆除设备的检测和处理。
4、数据流种类
数据和控制信号在主机和USB设备间的交换存在两种通道:
单向和双向。
USB的数据传送是在主机软件和一个USB设备的指定端口之间。
这种主机软件和USB设备的端口间的联系称作通道。
总的来说,各通道之间的数据流动是相互独立的。
一个指定的USB设备可有许多通道。
例如,一个USB设备存在一个端口,可建立一个向其它USB设备的端口,发送数据的通道,它可建立一个从其它USB设备的端口接收数据的通道。
USB的结构包含四种基本的数据传输类型:
(1)控制数据传送:
在设备连接时用来对设备进行设置,还可对指定设备进行控制,如通道控制;
(2)批量数据传送:
大批量产生并使用的数据,在传输约束下,具有很广的动态范围;
(3)中断数据的传送:
用来描述或匹配人的感觉或对特征反应的回馈。
(4)同步数据的传送:
由预先确定的传送延迟来填满预定的USB带宽。
对于任何对定的设备进行设置时一种通道只能支持上述一种方式的数据传输,数据流模式的更多细节在第四章中详述。
5、控制数据传送
当USB设备初次安装时,USB系统软件使用控制数据对设备进行设置,设备驱动程序通过特定的方式使用控制数据来传送,数据传送是无损性的。
6、批量数据传送
批量数据是由大量的数据组成,如使用打印机和扫描仪时,批量数据是连续的。
在硬件级上可使用错误检测可以保证可靠的数据传输,并在硬件级上引入了数据的多次传送。
此外根据其它一些总线动作,被大量数据占用的带宽可以相应的进行改变。
7、中断数据传输
中断数据是少量的,且其数据延迟时间也是有限范围的。
这种数据可由设备在任何时刻发送,并且以不慢于设备指定的速度在USB上传送。
中断数据一般由事件通告,特征及座标号组成,只有一个或几个字节。
匹配定点设备的座标即为一例,虽然精确指定的传输率不必要,但USB必须对交互数据提供一个反应时间的最低界限。
8、同步传输
同步数据的建立、传送和使用时是连续且实时的,同步数据是以稳定的速率发送和接收实时的信息,同步数据要使接收者与发送者保持相同的时间安排,除了传输速率,同步数据对传送延迟非常敏感。
所以同步通道的带宽的确定,必须满足对相关功能部件的取样特性。
不可避免的信号延迟与每个端口的可用缓冲区数有关。
一个典型的同步数据的例子是语音,如果数据流的传送率不能保持,数据流是否丢失将取决于缓冲区的大小和损坏的程度。
即使数据在USB硬件上以合适的速率传送,软件造成的传送延迟将对那些如电话会议等实时系统的应用造成损害。
实时的传送同步数据肯定会发生潜在瞬时的数据流丢失现象,换句话说,即使许多硬件机制,如重传的引入也不能避免错误的产生。
实际应用中,USB的数据出错率小到几乎可以忽略不计。
从USB的带宽中,给USB同步数据流分配了专有的一部分以满足所想得到的传速率,USB还为同步数据的传送设计了最少延迟时间。
9、指定USB带宽
USB的带宽分配给各个通道,当一个通道建立后,USB就分配给它一定的带宽,USB设备需要提供一些数据缓冲区。
若USB提供了更多带宽,则需更多的缓冲区。
USB的体系要保证缓冲引导的硬件的延迟限定在几毫秒内。
USB的带宽容量可以容纳多种不同的数据流,因此保证USB上可以连接大量设备,如可以容纳从1B+D直到T1速率范围的电信设备。
同时USB支持在同一时刻不同设备具有不同比特率,并具有一个动态变动的范围。
2.3 USB设备
USB设备分为诸如集线器、分配器或文本设备等种类。
集线器类指的是一种提供USB连接点的设备,USB设备需要提供自检和属性设置的信息,USB设备必须在任何时刻执行与所定义的USB设备的状态相一致的动态。
2.3.1 设备特性
当设备被连接、编号后,该设备就拥有一个唯一的USB地址。
设备就是通过该USB地址被操作的,每一个USB设备通过一个或多个通道与主机通讯。
所有USB设备必须在零号端口上有一指定的通道,每个USB设备的USB控制通道将与之相连。
通过此控制通道,所有的USB设备都列入一个共同的准入机制,以获得控制操作的信息。
在零号端口上,控制通道中的信息应完整的描述USB设备、此类信息主要有以下几类:
(1)标准信息:
这类信息是对所有USB设备的共同性的定义,包括一些如厂商识别、设备种类、电源管理等的项目。
设备设置、接口及终端的描述在此给出。
(2)类别信息:
此类信息给出了不同USB的设备类的定义,主要反映其不同点。
(3)USB厂商信息:
USB设备的厂商可自由的提供各种有关信息,其格式不受该规范制约。
此外,每个USB设备均提供USB的控制和状态信息。
2.3.2 设备描述
主要分为两种设备类:
集线器和功能部件。
只有集线器可以提供更多的USB的连接点,功能部件为主机提供了具体的功能。
USB设备可被划分三层:
(1)底层是传送和接收数据包的总线接口;
(2)中间层处理总线接口与不同端点之间的数据路由端节点是数据的终结提供处或使用处,它可被看作数据源或数据接收端(Sink);
(3)最上层的功能由串行总线设备提供,比如鼠标,或ISDN接口。
2.3.3 设备状态
USB设备有若干可能的状态,其中一些对于USB与主机(host)来说是外置的,而另外一些对USB设备来说是内置的。
(1)连接状态
USB设备可被连接到USB接口上或从接口断开。
(2)加电状态
USB设备的电源可来自外部电源,也可从USB接口的集线器而来。
电源来自外部电源的USB设备被称作自给电源式的(self-powered)。
尽管自给电源式的USB设备可能在连接上USB接口以前可能已经带电,但它们直到连线上USB接口后才能被看作是加电状态(Poweredstate)。
而这时候VBUS已经对设备产生作用了。
一个设备可能有既支持自给电源的,同时也支持总线电源式的配置。
有一些支持其中的一种,而另一些设备配置可能只有在自给电源下才能被使用。
设备对电源支持的能力是通过配置描述表(configurationdescriptor)来反映的。
当前的电源供给形式被作为设备状态的一部分被反映出来。
设备可在任何时候改变它们的供电来源,比如说:
从自给式向总线式改变,如果一个配置同时支持两种模式,那此状态的最大电源需求就是指设备在两种模式下从VBUS上获取电能的最大值。
设备必须以此最大电源作为参照,而究竟处于何状态是不考虑的。
如果有一配置仅支持一种电源模式,那么电源模式的改变会使得设备失去当前配置与地址,返回加电状态。
如果一个设备是自给电源式,并且当前配置需要大于100mA电流,那么如果此设备转到了总线电源式,它必须返回地址状态(Addressstate)。
自给电源式集线器使用VBUS来为集线控制器(Hubcontroller)提供电源,因而可以仍然保持配置状态(Configuredstate),尽管自给电源停止提供电源。
(3)缺省状态
设备加电以后,在它从总线接收到复位信号之前不应对总线传输发生响应。
在接收到复位信号之后,设备才在缺省地址处变得可寻址。
(4)地址状态
所有的USB设备在加电复位以后都使用缺省地址。
每一设备在连接或复位后由主机分配一个唯一的地址。
当USB设备处于挂起状态时,它保持这个地址不变。
USB设备只对缺省通道(Pipe)请求发生响应,而不管设备是否已经被分配地址或在使用缺省地址。
(5)中止状态
为节省电源,USB设备在探测不到总线传输时自动进入中止状态。
当中止时,USB设备保持本身的内部状态,包括它的地址及配置。
所有的设备在一段特定的时间内探测不到总线活动时必须进入中止态。
不管设备是被分配了非缺省的地址或者是被配置了,已经连接的设备必须在任何加电的时刻随时准备中止。
总线活动的中止可能是因为主机本身进入了中止状态。
另外,USB设备必须在所连接的集线器端口失效时进入中止态。
这就是所指的选择性中止(Selectivesuspend)。
USB设备在总线活动来到时结束中止态。
USB设备也可以远程唤醒的电流信号来请求主机退出中止态或选择性中止态。
具体设备具有的远程唤醒的能力是可选的,也就是说,如果一个设备有远程唤醒的能力,此设备必须能让主机控制此能力的有效与否。
当设备复位时,远程唤醒能力必须被禁止。
2.4 BusEnumeration总线标号
当USB设备接上或从USB设备移开的时候,主机启动一个被称作总线标识(busenumeration)的进程,来标识并管理设备状态的改变,当USB设备接上一个加电端口时,系统当采取以下操作:
(1)USB设备所连的集线器通过其通向主机的状态改变通道向主机,汇报本USB设备已连接上。
此时,USB设备处于加电状态,它所连接的端口是无效的。
(2)主机通过寻问集线器决定此次状态改变的确切含义。
(3)主机一旦得知新设备已连上以后,它至少等待100ms以使得插入操作的完成以及设备电源稳定工作。
然后主机发出端口使能及复位命令给那个端口。
(4)集线器将发向端口的复位信号持续10ms当复位信号撤消后,端口已经有效了。
这时USB设备处于缺省状态,并且可从VBUS汲取小于100mA的电能,所有设备寄存器及状态已经被复位,设备可对缺省地址产生响应。
(5)主机给设备分配一个唯一的地址,设备转向编址状态。
(Addressstate)。
(6)在USB设备接受设备地址之前,它的缺省控制通道(DefaultControlPipe)在缺省地址处自然是可寻址的,主机通过读取设备描述表,判决设备缺省通道的实际净数据负载。
(7)主机从设备读取配置信息要从配置0读到配置n-1,其中n为配置个数,此操作须花费几个毫秒。
(8)基于从设备取来的配置信息及设备如何被使用的信息,主机给设备一个配置值,此刻,设备就处于配置状态(Configuredstate)并此配置有关的所有端节点,都按照配置各就各位,USB设备现在可以从VBUS得到描述中所要求的电量了。
从设备的角度来讲,它已经准备就绪了。
当UBS设备被取走时,集线器同样会通知主机,断开一个设备连接会使得设备所连接的端口无效,一收到断开通知后,主机就会更新的拓扑信息。
2.5 通用USB设备操作
1、动态插接与拔开
USB设备必须在任意时刻允许被插接与拔开。
提供连接点或端口的集线器应当负责汇报端口的状态改变情况。
当主机探测到连接操作后,会使得所连的集线器端口生效,设备也会因此而复位,一个被复位了的USB设备有如下特性:
(1)对缺省USB地址发生响应;
(2)没有被配置;
(3)初始状态不是挂起。
当设备从一个集线器端口移去时,集线器会使得原来连接的端口失效,并且通知主机设备已移去。
2、地址分配
当USB设备连接以后,由主机负责给此设备分配一个唯一的地址,这个操作是在设备复位及端口使能操作以后。
3、配置
USB设备在正常被使用以前,必须被配置,由主机负责配置设备。
主机一般会从USB设备获取配置信息后再准定此设备有哪些功能。
作为配置操作的一部分,主机会设置设备的配置值,并且,如果必要的话会选择合适的接口的备选设置。
只须一个简单配置,一个设备可能支持多重接口。
一个接口是一组端结点集合,它们代表了设备向主机提供的单一的功能或特性,用来与这组相关端结点通信的协议以及接口内各端结点的目的可以作为一个设备类的一部分或者由厂商制定具体定义。
另外,一个配置中的接口可能有备选设置。
这些备选设置会重定义相关端结点的数目或特性。
如果是这样的话,设备必须支持GetInterface(接口请求)与SetInt