01 USB基础.docx
- 文档编号:18422685
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:46
- 大小:112.16KB
01 USB基础.docx
《01 USB基础.docx》由会员分享,可在线阅读,更多相关《01 USB基础.docx(46页珍藏版)》请在冰点文库上搜索。
01USB基础
第1章USB基础
USB最初是由英特尔与微软公司倡导发起,其最大的特点是支持热插拔和即插即用。
当设备插入时,主机侦测此设备并自动加载所需的驱动程序。
随着便携式设备的发展,USB的优越性更加明显,没有哪一种手机没有USB接口;没有哪一种通信接口能有USB那么方便可靠;没有哪一种通信方式的传输速度有USB那么快且用线少。
本章主要介绍USB的基本理论、基础知识、基本术语、基本结构等,也简单介绍USB开发流程、枚举过程等。
通过本章的学习,掌握USB基础知识,为后面USB系统开发打好基础。
1.1USB介绍
USB,UniversalSerialBUS(通用串行总线)的缩写,而其中文简称为“通用串型总线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,是应用在PC和嵌入式领域的接口技术。
USB接口支持设备的即插即用和热插拔功能。
USB通信方式为串行通信。
在1994年底由英特尔、康柏、IBM、Microsoft等多家公司联合提出的,目前使用最多的是USB1.1和USB2.0,几乎每一台电脑上都有4-8个USB接口头。
USB3.0已经“崛起”,并向下兼容,USB3.0芯片已经大量生产,其相关产品已经大量投入使用。
USB具有传输速度快(USB1.1是12Mbps,USB2.0是480Mbps,USB3.0是5Gbps),使用方便,支持热插拔,连接灵活,独立供电等优点,可以连接鼠标、键盘、打印机、扫描仪、摄像头、闪存盘、MP3机、手机、数码相机、移动硬盘、外置光软驱、USB网卡、ADSLModem、CableModem等,几乎所有的外部设备。
所以,掌握USB系统开发是很重要的,就像10年前,电子工程师必须掌握UART串行通信一样,不懂USB不能称其为真正的电子工程师。
常用USB接口如图1-1所示,为USB常用接口图。
有方型头(D型头)、扁型公头、扁型母头等,其中公头主要用于USB设备中,比如U盘使用USB扁型公头;母头主要用在USB主机上,其中USB扁型母头用的最多,比如电脑主板上全使用USB扁型母头做USB主机接头。
图1-1USB常用接口图
1.2USB常用术语
学习USB系统开发之前,有必要先了解USB开发中可能会遇到的一些常用术语,将有助于理解USB工作模式和编程模型。
USB系统开发分为USB主机开发和USB设备(从机)开发。
在一个USB系统中,某一个时刻,只有一个USB主机,其余均为USB设备。
但是为了让一个USB系统既有USB主机功能,又有从机功能,便出现了USBOTG。
因此,USB开发主要包括了USB主机、USB设备、USBOTG系统开发。
下面就几个常用术语进行详细解释:
USB主机:
在任何一个USB系统中,只有一个主机。
USB和主机系统的接口称作主机控制器,主机控制器可由硬件、固件和软件综合实现。
USB主机主要与USB设备进行通信,交换数据、设备控制。
USB设备:
主机的“下行”设备,为系统提供具体功能,可以是多个功能,并受主机控制的外部USB设备。
也称作USB外设(从机),使用USBB型连接器连接。
USB主机最多可以支持127个USB设备。
USBOTG:
简单地说,OTG就是OnTheGo,正在进行中的意思。
是近几年发展起来的技术,2001年12月18日由USBImplementersForum(USB-IF)公布,主要应用于各种不同的设备或移动设备间的联接,进行数据交换,特别是PDA、移动电话、消费类设备中运用最多。
改变如数码照相机、摄像机、打印机等设备间多种不同制式连接器,多达7种制式的存储卡间数据交换的不便。
USBOTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG)。
OTG两用设备完全符合USB2.0标准,并可提供一定的主机检测能力,支持主机通令协议(HNP)和对话请求协议(SRP)。
在OTG中,初始主机称为A设备,设备称为B设备。
简单的说,USBOTG既是USB主机也是USB设备。
但是在任意时刻,只能有一个A设备(主机)。
集线器:
集线器(Hub)扩展USB主机所能连接设备的数量,主要用于扩展。
如图1-2所示,为USBHub使用图,从图中可以看出,一个USBHub将一个USB接口扩展为4个,增加USB主机能连接设备的数量。
Hub在USB系统中的功能就像“交换机”在以太网通信中的功能一样,起到数据交换、增加设备连接数量。
图1-2USBHub使用图
SIE:
串行接口引擎,USB控制器内部的“核心”,将低级信号转换成字节,以供控制器使用,并负责处理底层协议,如填充位、CRC生成和校验,并可发出错误报告。
物理层的数据处理,把USB协议规定电信号变成USB数据。
一个USB设备系统由以下几部分组成:
进行数据处理的微处理器部分;USBSIE(串行接口引擎)部分;用于数据存储的存储器部分;进行数据编码与外部相连的USB收发器。
串行接口引擎完成发送和接收,它不对数据内容进行分析。
SIE的主要功能是对USB总线上传输的数据进行编码与解码;检测与产生信息包的起始SOP标志和信息包的结束EOP标志;对数据进行串/并转换;检测接收信息包、传送信息包;串行接口引擎是USB设备系统必不可少的接口模块,它的可靠性是USB设备正确执行后续操作的前提。
端点:
是主机与设备之间通信的目的或来源。
控制端点可以双向传输数据,而其它端点只能在单方向传输数据。
主机和设备的通信最终作用于设备的各个端点上,它是主机与设备间通信流的一个逻辑终端。
每个USB设备有一个唯一的地址,这个地址是在设备连上主机时,由主机分配的,而设备中的每个端点在设备内部有唯一的端点号。
这个端点号是在设计设备时给定的。
每个端点都是一个简单的连接点,或者支持数据流进设备,或者支持其流出设备,两者不可兼得。
基于PnP机制,设备被枚举时,它必须向主机报告各个端点的特性,包括端点号,通信方向,端点支持的最大包大小,带宽要求等(其中端点支持的最大包大小叫做数据有效负载)。
每个设备必须有端点0,它用于设备枚举和对设备进行一些基本的控制功能。
除了端点0,其余的端点在设备配置之前不能与主机通信,只有向主机报告这些端点的特性并被确认后才能被激活。
端点位于USB系统内部,是一个可寻址的FIFO空间。
似于高速公路收费口的入口或出口。
一个端点地址对应一个方向。
所以,端点2-IN与端点2-OUT完全不同。
端点0默认双向控制传输,共享一个FIFO空间。
管道:
是一个USB通信设备上的一个端点和主机上软件之间的联系。
体现了主机缓存和端点间传送数据的能力。
有流和消息两种不同且互斥的管道通信格式。
流指不具有USB定义格式的数据流。
流通道中的数据是流的形式,也就是该数据的内容不具有USB要求的结构。
数据从流通道一端流进的顺序与它们从流通道另一端流出时的顺序是一样的,流通道中的通信流总是单方向的。
对于在流通道中传送的数据,USB认为它来自同一个客户。
USB系统软件不能够提供使用同一流通道的多个客户的同步控制。
在流通道中传送的数据遵循先进先出原则。
流管道只能连到一个固定号码的端点上,或者流进,或者流出。
而具有这个号码的另一个方向的端点可以被分配给其它流通道。
流通道支持同步传送,中断传送和批量传送;消息指具有某种USB定义的格式的数据流。
消息通道与端点的关系同流通道与端点的关系是不同的。
首先,主机向USB设备发出一个请求;接着,就是数据的传送;最后,是一个状态阶段。
为了能够容纳请求/数据/状态的变化,消息通道要求数据有一个格式,此格式保证了命令能够被可靠地传送和确认。
消息通道允许双方向的信息流,虽然大多数的通信流是单方向的。
特别地,缺省控制通道也是一个消息通道。
在某一时刻,一个端点只能为单个信息请求服务。
主机上的多个客户软件通过缺省管道能产生请求,但他们以先进先出的顺序被送到端点上。
在响应主机事务的数据和状态阶段,端点能控制信息的流动。
只有当端点上的当前信息处理完成后,端点才会正常地发送下一个信息。
一个设备信息管道在2个方向(IN或OUT标记)要求有一个单一的设备端点号。
对于每个方向,USB不允许信息管道与不同的端点号相联系。
设备接口:
此接口非物理接口,是一种与主机通信的信道管理。
设备接口中包含多个端点,与主机进行通信。
此接口相当于一个USB系统功能,这个功能可能会使用到多个端点。
比如,一个USB设备既有USB键盘功能,又有U盘功能,这种设备就具备两个接口功能,每一个接口都要使用多个端口。
描述符:
是一个数据结构,使主机了解设备的格式化信息。
打个比方,就像平时写填写申请表一样,格式与内容都有规定,必须按规定格式和字数编写,否则不于理睬。
每一个描述符可能包含整个设备的信息,或是设备中的一个组件(接口)。
标准USB设备有5种描述符:
设备描述符、配置描述符、字符串描述符、接口描述符、端点描述符。
枚举:
USB主机通过一系列命令要求USB设备发送描述符信息。
从而知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作。
打个比方,这就相当于申请处理过程,让你提交什么资料,就得必须提交什么资料,并且必须按申请表规定的格式与字符数进行填写,否则,申请无效。
所以枚举对主机与设备进行通信是非常重要的,枚举不成功,主机就无法了解设备,USB设备也不能称其为USB设备。
三种传输速率:
低速模式传输速率为1.5Mbps,多用于键盘和鼠标。
全速模式传输速率为12Mbps。
高速模式传输速率为480Mbps。
输入:
相对主机而言,如果设备输入端点发送的数据为设备发送数据到主机。
设备发送数据,主机接收数据。
输出:
相对主机而言,如果设备输出端点接收的数据为主机发送到设备的数据。
设备接收数据,主机发送数据。
HCD:
包含主机控制器和根HUB的硬件,为程序员提供了由硬件实现定义的接口主机控制器设备(HCD)。
而实际上它在计算机是就是端口和内存映射。
USB1.0和1.1的标准有两个竞争的HCD实现。
康柏的开放主机控制器接口(OHCI)和Intel的通用主机控制器接口(UHCI)。
VIA威盛采纳了UHCI;其他主要的芯片组多使用OHCI。
它们的主要区别是UHCI更加依赖软件驱动,因此对CPU要求更高,但是自身的硬件会更廉价。
它们的并存导致操作系统开发和硬件厂商都必须在两个方案上开发和测试,从而导致费用上升。
因此USB-IF在USB2.0的设计阶段坚持只能有一个实现规范,这就是扩展主机控制器接口(EHCI)。
因为EHCI只支持全速传输,所以EHCI控制器包括四个虚拟的全速或者慢速控制器。
这里同样是Intel和Via使用虚拟UHCI,其他一般使用OHCI控制器。
某些版本的Windows上,打开设备管理器,如果设备说明中是否有“增强”("Enhanced"),就能够确认它是USB2.0版的。
而在Linux系统中,命令lspci能够列出所有的PCI设备,而USB会分别命名为OHCI、UHCI或者EHCI。
列出为16位地址的为EHCI,32位的为OHCI。
命令lsusb能够显示所有USB设备的信息,命令dmesg能够显示OS启动时关于USB设备的信息。
USB电源:
USB接头提供一组5V的电压,可作为相连接USB设备的电源。
实际上,设备接收到的电源可能会低于5V,只略高于4V。
USB规范要求在任何情形下,电压均不能超过5.25V;在最坏情形下(经由USB供电HUB所连接的LOWPOWER设备)电压均不能低于4.375V,一般情形电压会接近5V。
一个USB的根集线器最多只能提供500mA的电流。
如此的电流已足以驱动许多电子设备,不过连接在总线供电HUB的所有设备,需要共享500mA的电流额度。
一个由总线供电的设备可以使用到它所连接埠上允许输出的所有电源。
总线供电的HUB可以将电源供给连接在HUB上的所有设备,不过USB的规范只允许总线供电的HUB下游串接一层总线供电的设备,因此,总线供电的HUB下游不允许再串接另一个由总线供电的HUB。
许多HUB有外加电源,因此可以提供电源给下游的设备,不会消耗总线上的电源。
若设备需要的电压超过5V,或是需要电流超过500mA,都需要使用外加电源。
相对于之前其他沟通介面仅能传递讯息资料,高电压USB插槽本身还能提供5V(伏特)的主动电压,及0.5A(安培)的电流,因此对于一些小型设备而言,可以不必再外接电源供应装置,就能利用来自USB插槽的电力顺利运作。
利用这特点,也有厂商开发出适当的排线,将USB拿来当作供电插座般使用,例如作为移动电话的充电器;或是提供小型电灯的电力需要,反而与原本用来连接电脑用的主要用途无关。
1.3USB设备开发流程
如图1-3所示,为USB设备开发流图。
USB设备开发流程相当简单,第一、首先确认USB系统开发类型,是USB主机、USB设备还是OTG;第二、如果确定是USB设备,必须明确该设备类型:
HID、UDIO、CDC、HUB、IMAGE等;第三、查找相关设备手册,确定其描述符;第四、完成描述符后,编写USB枚举程序,观察是否枚举成功,如果枚举成功,此设备开发已经完成大部分;第五、编写应用程序,在枚举成功后,主要是进行数据处理,编写应用程序。
以上就是USB设备开发的主要流程,其中最主要的是枚举过程,枚举不成功,该设备不能称其为USB设备,更不能完成USB设备所赋予的任务。
图1-3USB设备开发流程图
1.4USB设备枚举
对于USB设备开发来说,最重要的是枚举,让主机知道设备相关信息。
枚举不成功,设备无法识别、更不能使用。
本节主要讲枚举过程,有关设备其它信息,请参阅USB官方协议手册。
USB设备的属性通过一组描述符来反映它们,这些描述符是具有一定格式的数据结构,主机软件可通过GET_DESCRIPTOR请求获取这些描述符。
每一个描述符的第一个字节表明本描述符的长度,其后是一个字节的描述符类型信息。
如果描述符之中的长度域值少于描述符的定义长度,此描述符被认为非法,不能被主机接收;如果返回的描述符中的长度域值大于描述符的定义长度,则过长部分被忽略。
1.4.1USB设备请求
设备描述符是表征对该设备及所有设备配置起全程作用的信息。
在设备枚举时,主机使用GET_DESCRIPTOR控制指令直接从设备端点0读取该描述符,一个USB设备只能有一个设备描述符。
USB设备与主机连接时会发出USB请求命令。
每个请求命令数据包由8个字节(5个字段)组成,具有相同的数据结构。
如表1-1所示,为USB设备请求数据包格式表:
表1-1USB设备请求数据包格式表
偏移量
域
大小
值
描述
0
bmRequestType
1
位
请求特征
1
bRequest
1
值
请求命令
2
wValue
2
值
请求不同,含义不同
4
wIndex
2
索引
请求不同,含义不同
6
wLength
2
值
数据传输阶段,为数据字节数
标准的USB设备请求命令是用在控制传输中的“初始设置步骤”里的数据包阶段(即DATA0,由八个字节构成)。
标准USB设备请求命令共有11个,大小都是8个字节,具有相同的结构,由5个字段构成(字段是标准请求命令的数据部分),结构如下(括号中的数字表示字节数,首字母bm,b,w分别表示位图、字节,双字节):
bmRequestType
(1)+bRequest
(1)+wvalue
(2)+wIndex
(2)+wLength
(2)
在USB2.0规范里定义的标准USB设备请求结构体数据头:
typedefstruct
{
//定义请求的方向和类型。
unsignedcharbmRequestType;
//请求类型。
unsignedcharbRequest;
//根据请求而定实际含义。
unsignedshortwValue;
//根据请求而定,通常提供索引或偏移
unsignedshortwIndex;
//在数据传输阶段时,指示传输数据的字节数
unsignedshortwLength;
}
tUSBRequest;
①bmRequestType参数:
//位7,说明请求的传输方向.
输入
#defineUSB_RTYPE_DIR_IN0x80
输出
#defineUSB_RTYPE_DIR_OUT0x00
//位6:
5,定义请求的类型
#defineUSB_RTYPE_TYPE_M0x60
#defineUSB_RTYPE_VENDOR0x40
#defineUSB_RTYPE_CLASS0x20
#defineUSB_RTYPE_STANDARD0x00
USB_RTYPE_TYPE_M用于提取请求中的6:
5位,并通过6:
5位判断请求类型,大多数为0x00,即标准请求(USB_RTYPE_STANDARD)。
//位4:
0,定义接收者
#defineUSB_RTYPE_RECIPIENT_M0x1f
#defineUSB_RTYPE_OTHER0x03
#defineUSB_RTYPE_ENDPOINT0x02
#defineUSB_RTYPE_INTERFACE0x01
#defineUSB_RTYPE_DEVICE0x00
USB_RTYPE_RECIPIENT_M用于提取请求中的4:
0位,并能过4:
0位判断请求的接收者。
0x00,设备;0x01,接口;0x02,端点;0x03为其它请求。
②bRequest参数:
//标准请求的请求类型
#defineUSBREQ_GET_STATUS0x00
#defineUSBREQ_CLEAR_FEATURE0x01
#defineUSBREQ_SET_FEATURE0x03
#defineUSBREQ_SET_ADDRESS0x05
#defineUSBREQ_GET_DESCRIPTOR0x06
#defineUSBREQ_SET_DESCRIPTOR0x07
#defineUSBREQ_GET_CONFIG0x08
#defineUSBREQ_SET_CONFIG0x09
#defineUSBREQ_GET_INTERFACE0x0a
#defineUSBREQ_SET_INTERFACE0x0b
#defineUSBREQ_SYNC_FRAME0x0c
当bmRequestType为标准请求(即设备请求的第7位为0)时,bRequest(第6:
5位)参数提示当前请求类型,以上请求类型经常在枚举时使用。
③wValue参数:
ⓐUSBREQ_CLEAR_FEATURE和USBREQ_SET_FEATURE请求命令时:
#defineUSB_FEATURE_EP_HALT0x0000//Endpointhaltfeature.
#defineUSB_FEATURE_REMOTE_WAKE0x0001//Remotewakefeature,deviceonly.
#defineUSB_FEATURE_TEST_MODE0x0002//Testmode
ⓑUSBREQ_GET_DESCRIPTOR请求命令时:
#defineUSB_DTYPE_DEVICE1
#defineUSB_DTYPE_CONFIGURATION2
#defineUSB_DTYPE_STRING3
#defineUSB_DTYPE_INTERFACE4
#defineUSB_DTYPE_ENDPOINT5
#defineUSB_DTYPE_DEVICE_QUAL6
#defineUSB_DTYPE_OSPEED_CONF7
#defineUSB_DTYPE_INTERFACE_PWR8
#defineUSB_DTYPE_OTG9
#defineUSB_DTYPE_INTERFACE_ASC11
#defineUSB_DTYPE_CS_INTERFACE36
请求命令数据包由主机通过端点0发送,当设备端点为接收到请求命令数据包时,会发出端点0中断,控制器可以读取端点0中的数据,此数据格式为tUSBRequest所定义。
根据bmRequestType判断是不是标准请求,bRequest获得具体请求类型,wValue指定更具体的对像,wIndex指出索引和偏移。
在数据传输阶段时,wLength为传输数据的字节数。
整个控制传输都依靠这11个标准请求命令,非标准请求通过callback函数返回给用户处理。
1.4.2描述符
USB采用USB标准描述符说明一个USB设备,这些描述符包括设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。
对于高速设备还包括设备限定描述符和其他速率配置描述符。
设备类和供应商也可以自己定义其设备专用描述符,分别称为设备类定义描述符和供应商自定义描述符。
每一个设备都有自己的一套完整的描述符,包括设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。
这些描述符反映设备特性,由特定格式排列的一组数据结构组。
在USB设备枚举过程中,主机通过标准命令USBREQ_GET_DESCRIPTOR获取描述符,从而得知设备的各种特性。
①设备描述符:
设备描述符给出了USB设备的一般信息。
一个USB设备只能有一个设备描述符。
主机发出USBREQ_GET_DESCRIPTOR请求命令,且wValue值为USB_DTYPE_DEVICE时,获取设备描述符,如表1-2所示,为USB标准设备描述符表:
表1-2标准设备描述符表
偏移量
域
大小
值
描述
0
bLength
1
数字
此描述表的字节数
1
bDecriptorType
1
常量
描述表种类为设备
2
bcdUSB
2
BCD码
USB设备版本号(BCD码)
4
bDeviceClass
1
类
设备类码
5
bDeviceSubClass
1
子类
子类码
6
bDevicePortocol
1
协议
协议码
7
bMaxPacketSize0
1
数字
端点0最大包大小(8,16,32,64)
8
idVendor
2
ID
厂商标志(VID)
10
idProduct
2
ID
产品标志(PID)
12
bcdDevice
2
BCD码
设备发行号(BCD码)
14
iManufacturer
1
索引
厂商信息字串索引
15
iProduct
1
索引
产品信息字串索引
16
iSerialNumber
1
索引
设备序列号信息字串索引
17
bNumConfigurations
1
数字
配置描述符数目
C语言设备描述符结构体为:
typedefstruct
{
//本描述符字节数,设备描述符为18字节。
unsignedcharbLength;
//本描述符类型,设备描述符为1,USB_DTYPE_DEVICE。
unsignedcharbDescriptorType;
//USB规格版本号格式的BCD码。
对于USB2.0是0x0200
unsignedshortbcdUSB;
//设备类代码
unsignedcharbDeviceClass;
//子类代码
unsignedcharbDeviceSubClass;
//协
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 01 USB基础 USB 基础