USB中文协议.docx

上传人:b****5 文档编号:30744808 上传时间:2023-08-20 格式:DOCX 页数:23 大小:30.63KB
下载 相关 举报
USB中文协议.docx_第1页
第1页 / 共23页
USB中文协议.docx_第2页
第2页 / 共23页
USB中文协议.docx_第3页
第3页 / 共23页
USB中文协议.docx_第4页
第4页 / 共23页
USB中文协议.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

USB中文协议.docx

《USB中文协议.docx》由会员分享,可在线阅读,更多相关《USB中文协议.docx(23页珍藏版)》请在冰豆网上搜索。

USB中文协议.docx

USB中文协议

USB协议深入分析

(1)

2009年03月25日星期三09:

54

现在非常流行USB设备,时时刻刻都在我们身边,比如使用U盘,使用MP3,使用手机,都需要与PC的USB通讯。

通过USB的接口,使用我们的生活非常方便了,想什么时候听歌,就可以插入MP3到PC机那里,然后再从PC上下载MP3。

这个过程在用户看来是非常的简单,不需要安装驱动程序,不需要断掉PC机的电源。

真正体现“科技以人为本”的思想。

使用这么方便的U盘或者MP3,那么我们又需要去问个为什么了,为什么会这么方便呢?

往往方便的背后,就意味着需要工程师做大量的工作,才会让大家使用USB这么方便。

下面就来详细地分析USB的协议。

USB通讯是非常复杂的,刚刚协议定义就厚厚的一本,要完全地去看完,并且理解它,是很费时间的事情。

希望本文可以提供给你一个非常好的指导,让你深入地理解USB的协议。

USB的协议是主从协议,在所有通讯里,只有一个主控器,其它都是从设备。

最多能接127个从设备,因为协议里只保留了7bit作为设备地址。

所有的USB数据交流都是由主控器发起,其它从设备进行响应。

现在就以WINDOWS上的USB通讯来学习一下USB的通讯协议,后面所有提到的数据,都是WINDOWS上的USB驱动程序发下来的数据。

为了把所有通讯数据都显示出来,我找到了一个USB的ARM开发板,通过这个开发板,就可以把主控器所有数据打印出来,并作相应的分析。

同时,使用这个开发板,也可以用来调试龙芯的主控器驱动程序的调试。

当USB的开发板加电时,就会先初始化USB的连接,但没有插入PC的连接线,这时开发板就会从串口输出下面的字符:

USBSuspend

USBResume

从上面看到,从设备的USB一直不断地挂起和唤醒,直到插入PC的连接线。

当插入连接线到PC时,就会收到主控器发来的信息。

下面的数据,就是开发板与USB主控器交流的数据。

1.        收到主控器的获取设备描述符配置包。

Setupm=0,n=0,val=37

8006000100004000

这是主控器发来第一个配置包数据。

由于主控器不知道USB设备设备描述符有多长,所以包的最后里的长度是0x0040,也就是64个字节长度。

REQUEST_STANDARD=0x6

USB_DEVICE_DESCRIPTOR_TYPE(0)

根据USB的协议,分析上面的数据,就知道它是获取设备描述符。

为了实现即插即用,就需要对插入来的设备进行获取描述信息,才知道这个USB的设备是什么样的设备,是U盘,还是HID的键盘。

因此,USB设备就返回下面的数据给主控器:

USB_DataInStage,cnt=18,EP0Data.Count=18

1201100100000040008000800001042C4A01

这条数据,就是USB的设备描述符,描述了这个设备使用什么USB的协议版本,这里是1.1的版本,还有厂家标识、产品标识,以及厂家、产品和序列号等字符串的偏移地址。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

USB_EVT_OUT

通过设备描述符,就可以让主控器知道这个设备是使用什么版本的USB协议,是高速的设备,还是低速的设备,是谁产生的,是什么产品,然后操作系统就可以通过这些信息去找到相应的驱动程序,如果操作系统没有找到相应的驱动程序,就会提示用户插入光盘,或者其它方来安装相应的驱动程序。

2.        收到主控器的设置设备地址配置包。

Setupm=0,n=0,val=37

0005010000000000

这条数据,根据USB的协议,就可以知道它是设置USB设备的地址配置包。

它的作用,就是分配USB设备的地址,由于USB总线上可以有127个设备,那么每个设备都需要分配一个唯一的地址才通讯,这跟网卡的MAC地址的作用是一样的。

其实,就像分配门牌号,让大家看到那个门牌就知道什么房了。

从下面的数据分析来看,是分配地址为1.

REQUEST_STANDARD=0x5

USB_DeviceAddress=129

USB_EVT_IN,USB_SetAddress

(1)

3.        收到主控器的获取设备描述符配置包。

Setupm=0,n=0,val=37

8006000100001200

再次收到获取设备描述符的配置包,由于第一次不知道设备描述符有多大,因而总是发送一个最大数据的包,就是64个字节大,现在知道描述符的大小为0x0012个大小了,就把它发送下来了。

所以USB设备再次回应设备描述符就可以了。

REQUEST_STANDARD=0x6

USB_DEVICE_DESCRIPTOR_TYPE

(1)

USB_DataInStage,cnt=18,EP0Data.Count=18

1201100100000040008000800001042C4A01

在这里再次回应设备描述符。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

4.        收到配置描述符包

Setupm=0,n=0,val=45

8006000200000900

根据USB协议可以知道,这是一个配置描述符的包,也就是让USB设备发送本设备有多少个配置方式给主控器。

由于USB的设备是多种多样,满足不同的用户需要的。

比如鼠标和键盘,就是不同的设备了。

还有MP3播放器,还有各种数码相机等等,都是不一样的设备了。

就可以通过下面的方式来说明这个配置有多少种方式,主要是通讯的方式。

REQUEST_STANDARD=0x6

USB_CONFIGURATION_DESCRIPTOR_TYPE

(2)(Offset=0x0)

USB_DataInStage,cnt=9,EP0Data.Count=9

090222000101000132

这里就是USB设备返回配置描述符给主控器的,它主要说明了这个设备有多少个配置,比如定义端点的类型,端点的传送方式,还有这个设备使用USB总线的电源多少。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

5.        收到字符串描述符包

Setupm=0,n=0,val=45

800600030000FF00

这里收到获取字符串描述符。

由于在设备描述符里已经说明字符串描述符在那里,主要是偏移地址,比如04就是厂家的描述符。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(3)(Offset=0x0)

USB_DataInStage,cnt=4,EP0Data.Count=4

04030904

这里返回偏移地址为0的字符串描述,其实那里是保存字符串描述符的语言描述标识,这里英语的标识,0X0409。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

6.        收到字符串描述符包

Setupm=0,n=0,val=45

80064A030904FF00

这时收到获取字符串描述符,根据偏移地址,就知道它是想返回0x4A的字符串,也就是字符串描述符里的偏移地址。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(4)(Offset=0x4A)

USB_DataInStage,cnt=36,EP0Data.Count=36

240343004100490032003000300037003000330032003500200031002E0030002E003000

USB设备返回0x4A的字符串给PC。

这里是我放置的字符串:

CAI200703251.0.0

它作为产品的序列号。

由于采用UNICODE编码,所有高位字节全是0。

由于USB协议是使用小端格式来发送数据,所以都低位在前,高位在后。

这样在PC那里就可以看到USB设备的产品序列号了。

又前进了一步。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

7.        收到第二个配置描述符包

Setupm=0,n=0,val=45

800600020000FF00

这里收到是第二个配置描述符包,与第一个的区别是返回长度不同。

第一个配置包返回的长度是9个字节,而这里的长度是255。

REQUEST_STANDARD=0x6

USB_CONFIGURATION_DESCRIPTOR_TYPE(5)(Offset=0x0)

USB_DataInStage,cnt=34,EP0Data.Count=34

09022200010100013209040000010300006E09210001000122240007058103400020

在这里返回全部配置描述给PC,让PC知道USB设备所有的配置。

在这里包括设备配置,接口配置,端点配置,还有设备特别配置信息。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

8.        收到字符串描述符包

Setupm=0,n=0,val=45

800600030000FF00

收到PC的字符串描述符,后面设备就返回。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(6)(Offset=0x0)

USB_DataInStage,cnt=4,EP0Data.Count=4

04030904

返回设备描述符的语言定义。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

9.        收到字符串描述符包

Setupm=0,n=0,val=45

80062C030904FF00

收到PC需要产品字符串。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(7)(Offset=0x2C)

USB_DataInStage,cnt=30,EP0Data.Count=30

1E0342006900670053006C006F0070006500330044002000480049004400

这里USB设备返回产品字符串给PC了。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

10.    收到字符串描述符包

Setupm=0,n=0,val=45

800600030000FF00

这里收到字符串描述符。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(8)(Offset=0x0)

USB_DataInStage,cnt=4,EP0Data.Count=4

04030904

返回语言标识。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

11.    收到字符串描述符包

Setupm=0,n=0,val=45

80062C030904FF00

收到PC需要产品字符串。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(9)(Offset=0x2C)

USB_DataInStage,cnt=30,EP0Data.Count=30

1E0342006900670053006C006F0070006500330044002000480049004400

这里USB设备返回产品字符串给PC了。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

12.    收到字符串描述符包

USB_EVT_OUT

Setupm=0,n=0,val=37

800600030000FF00

这里收到字符串描述符。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(10)(Offset=0x0)

USB_DataInStage,cnt=4,EP0Data.Count=4

USB协议深入分析

(2)

2009年03月25日星期三09:

55

04030904

返回语言标识。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

1.        收到字符串描述符包

Setupm=0,n=0,val=45

80062C030904FF00

收到PC需要产品字符串。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(11)(Offset=0x2C)

USB_DataInStage,cnt=30,EP0Data.Count=30

1E0342006900670053006C006F0070006500330044002000480049004400

这里USB设备返回产品字符串给PC了

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

2.        收到字符串描述符包

Setupm=0,n=0,val=45

800600030000FF00

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(12)(Offset=0x0)

USB_DataInStage,cnt=4,EP0Data.Count=4

04030904

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

Setupm=0,n=0,val=45

80062C030904FF00

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(13)(Offset=0x2C)

USB_DataInStage,cnt=30,EP0Data.Count=30

1E0342006900670053006C006F0070006500330044002000480049004400

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

3.        收到字符串描述符包

USB_EVT_OUT

Setupm=0,n=0,val=45

8006000100001200

这里收到需要返回厂商字符串的请求。

REQUEST_STANDARD=0x6

USB_DEVICE_DESCRIPTOR_TYPE(14)

USB_DataInStage,cnt=18,EP0Data.Count=18

1201100100000040008000800001042C4A01

在这里返回设备的厂商字符串给PC。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

4.        收到第三个配置描述符包

Setupm=0,n=0,val=45

8006000200000900

REQUEST_STANDARD=0x6

USB_CONFIGURATION_DESCRIPTOR_TYPE(15)(Offset=0x0)

USB_DataInStage,cnt=9,EP0Data.Count=9

090222000101000132

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

5.        收到第四个配置描述符包

Setupm=0,n=0,val=45

8006000200002200

REQUEST_STANDARD=0x6

USB_CONFIGURATION_DESCRIPTOR_TYPE(16)(Offset=0x0)

USB_DataInStage,cnt=34,EP0Data.Count=34

09022200010100013209040000010300006E09210001000122240007058103400020

根据长度返回不同的数据。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

6.        收到设置描述符包

Setupm=0,n=0,val=45

0009010000000000

REQUEST_STANDARD=0x9

USB_SetConfigurationWB.L=1

USB_Configure(TRUE)

USB_SetConfigurationtrue

由上面可以知道经过这么多次来回后,主控器已经配置完成,对这个设备可以使用了。

这时,如果在WINDOWS里就会看到可以设备安装完成,可以使用了。

7.        收到设置空闲描述符包

Setupm=0,n=0,val=37

210A000000000000

收到这个描述符,就表明设备在空闲状态。

8.        收到HID的报告描述符包

Setupm=0,n=0,val=37

8106002200006400

由于在配置描述符里,我把这个设备描述成HID的设备,所以会收到HID的报告描述符。

REQUEST_STANDARD=0x6

REQUEST_TO_INTERFACE(0x22)

HID_REPORT_DESCRIPTOR_TYPE

USB_DataInStage,cnt=36,EP0Data.Count=36

0600FF0901A10119012908150025FF953F7508810219012908150025FF953F75089102C0

这里就返回报告描述的类型,说明每次发送数据报告的大小,还有数据的格式。

这里是返回63个字节输出,63个输入的描述符。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

USB_EVT_OUT

到这里就把USB设备初始化完成了。

从上面可以知道,要想配置一个USB设备,需要经过20个来回才能完成配置,这个过程是非常多的。

如果在调试过程中,只要任何一个地方出错,都不会配置成功的。

如果再加上硬件的出错,就需要花费更长的时间了。

杉琔SB的设备虽然非常方便使用,但是花费了工程师大量的精力和相当多的时间。

因而USB是一个非常值钱的设备。

目前USB设备已经非常流行,今后PC机与外设的通讯,大部份都是使用USB设备来完成的。

完全会取代串口、并口的通讯。

我看到有一个厂家开发的USB设备,就200多种,从USB风扇到USB电话,从USB网络到USB装饰品,比如USB接口的彩灯。

还有通过USB控制的按摩器等健身器材等等。

希望你看到本文之后,又可以开发一款更好的USB设备到来了。

在龙芯电脑里,已经没有软驱,那么它是通过USB的U盘来启动的,这样就需要配置USB的设备,所以龙芯里的BIOS是非常复杂的,龙芯的PMON还在继续地开发支持USB的键盘、USB的鼠标,这样完全可以不使用任何的PS2的设备了,可以直接任何时间插入鼠标、键盘,都可以正常地使用,不像PS2那样,需要重新启动操作系统。

我希望龙芯的电脑,以后增加一个USB的设备在那里,直接通过那个设备就可以连接到其它PC机,可以共享数据,并不需要网络的配置

USB协议及规范---(之三)术语和缩略词

2009年03月25日星期三09:

55

ACK:

确认信号

ActiveDevice:

正在使用的设备

AsynchronousData:

异步数据

AsynchronousRA:

异步自适应速率

AsynchronousSRC:

异步抽样转换率

AudioDevice:

音频设备

AWG#(AmericanWireGauge):

美国电线标准

Babble:

帧传输中的总线动作

Bandwidth:

带宽

BigEndian:

Bit:

比特

BitStuffing:

数据填充,以使PLL可以提取时钟信号

b/s:

每秒多少比特

B/s:

每秒多少字节

Buffer:

缓冲区

BulkTransfer:

批量传送

BusEnumeration:

总线标号

Byte:

字节

Capabilities:

能力

Characteristics:

特征

Client:

客户

ConfiguringSoftware:

配置软件

ControlEndpoint:

控制端口

ControlPipe:

控制通道

ControlTransfer:

控制传送

CTI:

计算机电信组织

CyclicRedundancyCheck(CRC):

循环冗余校验

DefaultAddress:

缺省地址

DefaultPipe:

缺省通道

Device:

设备、器件

DeviceAddress:

设备地址

DeviceEndpoint:

设备端口

DeviceResource:

设备资源

DeviceSoftware:

设备软件

Downstream:

下行

Driver:

驱动

DWORD:

双字                                                      

DynamicInsertionandRemoval:

动态插入与拆除

ElectricallyErasablePro

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1