龙芯软件开发(32)-- USB协议深入分析

现在非常流行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的连接线,这时开发板就会从串口输出下面的字符:

USB Suspend

USB Resume

从上面看到,从设备的USB一直不断地挂起和唤醒,直到插入PC的连接线。当插入连接线到PC时,就会收到主控器发来的信息。下面的数据,就是开发板与USB主控器交流的数据。

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

Setup m=0,n=0,val=37

80 06 00 01 00 00 40 00

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

REQUEST_STANDARD=0x6

USB_DEVICE_DESCRIPTOR_TYPE(0)

根据USB的协议,分析上面的数据,就知道它是获取设备描述符。为了实现即插即用,就需要对插入来的设备进行获取描述信息,才知道这个USB的设备是什么样的设备,是U盘,还是HID的键盘。因此,USB设备就返回下面的数据给主控器:

USB_DataInStage,cnt=18,EP0Data.Count=18

12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01

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

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

USB_EVT_OUT

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

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

Setup m=0,n=0,val=37

00 05 01 00 00 00 00 00

这条数据,根据USB的协议,就可以知道它是设置USB设备的地址配置包。它的作用,就是分配USB设备的地址,由于USB总线上可以有127个设备,那么每个设备都需要分配一个唯一的地址才通讯,这跟网卡的MAC地址的作用是一样的。其实,就像分配门牌号,让大家看到那个门牌就知道什么房了。

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

REQUEST_STANDARD=0x5

USB_DeviceAddress=129

USB_EVT_IN,USB_SetAddress(1)

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

Setup m=0,n=0,val=37

80 06 00 01 00 00 12 00

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

REQUEST_STANDARD=0x6

USB_DEVICE_DESCRIPTOR_TYPE(1)

USB_DataInStage,cnt=18,EP0Data.Count=18

12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01

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

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

4.         收到配置描述符包

Setup m=0,n=0,val=45

80 06 00 02 00 00 09 00

根据USB协议可以知道,这是一个配置描述符的包,也就是让USB设备发送本设备有多少个配置方式给主控器。由于USB的设备是多种多样,满足不同的用户需要的。比如鼠标和键盘,就是不同的设备了。还有MP3播放器,还有各种数码相机等等,都是不一样的设备了。就可以通过下面的方式来说明这个配置有多少种方式,主要是通讯的方式。

REQUEST_STANDARD=0x6

USB_CONFIGURATION_DESCRIPTOR_TYPE(2)(Offset=0x0)

USB_DataInStage,cnt=9,EP0Data.Count=9

09 02 22 00 01 01 00 01 32

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

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

5.         收到字符串描述符包

Setup m=0,n=0,val=45

80 06 00 03 00 00 FF 00

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

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(3)(Offset=0x0)

USB_DataInStage,cnt=4,EP0Data.Count=4

04 03 09 04

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

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

6.         收到字符串描述符包

Setup m=0,n=0,val=45

80 06 4A 03 09 04 FF 00

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

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(4)(Offset=0x4A)

USB_DataInStage,cnt=36,EP0Data.Count=36

24 03 43 00 41 00 49 00 32 00 30 00 30 00 37 00 30 00 33 00 32 00 35 00 20 00 31 00 2E 00 30 00 2E 00 30 00

USB设备返回0x4A的字符串给PC。这里是我放置的字符串:

CAI20070325 1.0.0

它作为产品的序列号。由于采用UNICODE编码,所有高位字节全是0。由于USB协议是使用小端格式来发送数据,所以都低位在前,高位在后。这样在PC那里就可以看到USB设备的产品序列号了。又前进了一步。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

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

Setup m=0,n=0,val=45

80 06 00 02 00 00 FF 00

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

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

REQUEST_STANDARD=0x6

USB_CONFIGURATION_DESCRIPTOR_TYPE(5)(Offset=0x0)

USB_DataInStage,cnt=34,EP0Data.Count=34

09 02 22 00 01 01 00 01 32 09 04 00 00 01 03 00 00 6E 09 21 00 01 00 01 22 24 00 07 05 81 03 40 00 20

在这里返回全部配置描述给PC,让PC知道USB设备所有的配置。在这里包括设备配置,接口配置,端点配置,还有设备特别配置信息。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

8.         收到字符串描述符包

Setup m=0,n=0,val=45

80 06 00 03 00 00 FF 00

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

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(6)(Offset=0x0)

USB_DataInStage,cnt=4,EP0Data.Count=4

04 03 09 04

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

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

9.         收到字符串描述符包

Setup m=0,n=0,val=45

80 06 2C 03 09 04 FF 00

收到PC需要产品字符串。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(7)(Offset=0x2C)

USB_DataInStage,cnt=30,EP0Data.Count=30

1E 03 42 00 69 00 67 00 53 00 6C 00 6F 00 70 00 65 00 33 00 44 00 20 00 48 00 49 00 44 00

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

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

10.     收到字符串描述符包

Setup m=0,n=0,val=45

80 06 00 03 00 00 FF 00

这里收到字符串描述符。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(8)(Offset=0x0)

USB_DataInStage,cnt=4,EP0Data.Count=4

04 03 09 04

返回语言标识。

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

11.     收到字符串描述符包

Setup m=0,n=0,val=45

80 06 2C 03 09 04 FF 00

收到PC需要产品字符串。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(9)(Offset=0x2C)

USB_DataInStage,cnt=30,EP0Data.Count=30

1E 03 42 00 69 00 67 00 53 00 6C 00 6F 00 70 00 65 00 33 00 44 00 20 00 48 00 49 00 44 00

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

USB_EVT_IN,USB_DataInStage

USB_DataInStage,cnt=0,EP0Data.Count=0

12.     收到字符串描述符包

USB_EVT_OUT

Setup m=0,n=0,val=37

80 06 00 03 00 00 FF 00

这里收到字符串描述符。

REQUEST_STANDARD=0x6

USB_STRING_DESCRIPTOR_TYPE(10)(Offset=0x0)

USB_DataInStage,cnt=4,EP0Data.Count=4

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/skiwnchh/p/10347097.html

时间: 2024-08-26 02:16:24

龙芯软件开发(32)-- USB协议深入分析的相关文章

让你提前认识软件开发(32):数据库索引

第2部分 数据库SQL语言 数据库索引 索引在数据库中占有非常重要的地位,它是对数据库表中一列或多列的值进行排序的一种结构.正确使用索引,可快速访问数据库表中的特定信息,进而提高数据库脚本的执行效率. 1. 索引分类 数据库表中经常有一列或几列的组合,其值唯一地标识表中的每一行,该列称为表的主键. 在数据库中,将索引分为三类:唯一索引.主键索引和聚集索引. 唯一索引是不允许其中任何两行具有相同索引值的索引,即索引列的值不允许重复. 主键索引是唯一索引的特定类型,该索引要求主键中的每个值都唯一.

网络编程 软件开发架构,互联网协议

网络开发架构 C/S架构: Client: 客户端 Server: 服务端 比如: 微信客户端.QQ客户端等... 优点: - 软件的使用稳定 - 节省网络资源 缺点: - 安装麻烦,用户体验差 - 软件的每一次更新,用户都需要重新下载或更新版本 B/S架构: Browser(本质上也是一个客户端): 浏览器 Server: 服务端 比如: 在浏览器上输入一个 网址 优点: - 软件的使用方便 - 无需跟着软件的更新去下载 缺点: - 如果网络不稳定,软件的使用就不稳定 # 比较流行: B/S架

寻求对MIPS架构(国产龙芯处理器)感兴趣的软件开发人员一起开发开源UEFI BIOS

大家好: 作为一位软件开发人员,相信大家都思考过这样一个问题:为什么国产龙芯处理器性能与Intel同时期的处理器性能差别如此之大?为什么国产开源的软件发展远远不及国外?------是我们软件开发人员自身素养不够?还是原本国产处理器的硬件性能就不行?本人毕业与中国科学院计算技术研究所龙芯实验室,在龙芯实验室研发的那几年,也看到了龙芯的开源论坛上有那么多一批批对龙芯软件开源的爱好者.一直很好寻找一些志同道合,对开源感兴趣的朋友一起从事基于MIPS架构国产龙芯处理器平台的UEFI BIOS开发. 声明

SylixOS龙芯1C适配总结

1.龙芯1C简介 1.1龙芯1C简介 龙芯 1C300(以下简称 1C)芯片是基于 LS232 处理器核的高性价比单芯片系统,可应用于指纹生物识别.物联传感等领域.1C 包含浮点处理单元,可以有效增强系统浮点数据处理能力.支持 8-bit SLC NAND 或 MLC NAND FLASH,提供高容量的存储扩展接口. 1C 为开发者提供了丰富的外设接口及片上模块,包括 Camera 控制器, USB OTG 2.0 及 USB HOST 2.0 接口, AC97/I2S 控制器, LCD 控制器

致龙芯15周年 胡伟武披露龙芯3号开发历程(非常精彩,巨多干货)

近日,龙芯中科宣布3A3000四核处理器芯片完成流片并通过系统测试.根据现有的测试结果,龙芯3A3000达到了预定的设计性能目标.其中,综合计算性能方面,在1.5GHz主频下,GCC编译的SPEC CPU 2006定点和浮点单核分值分别超过11分和10分:访存性能方面,Steam分值超过13GBps. 龙芯3A3000的流片成功,标志着我国自主研发的高性能微处理器芯片,可以超越目前引进的同类芯片性能.龙芯CPU首席科学家胡伟武撰文披露了龙芯3号开发的历程. 龙芯3A3000芯片 2016年是红军

龙讯2号 我用带有胡伟武签名的龙芯电脑

LSLSLSLSLSLSLSLSLSLSLSLSLSLSLSLS                                               === 龙讯 ===                 龙芯资讯周刊                   第2号 2007年1月7日发布          http://loongsoon.blog.sohu.com LSLSLSLSLSLSLSLSLSLSLSLSLSLSLSLS 新年好,欢迎您阅读<龙讯>! ++++++++++++++

龙芯GO!龙芯平台上构建Go语言环境指南

龙芯软件生态系列——龙芯GO!龙芯平台上构建Go语言环境指南2016-07-05 龙芯中科1初识Go语言Go语言是Google公司于2009年正式推出的一款开源的编程语言,是由Robert Griesemer.KenThompson和Rob Pike等世界顶尖计算科学家精心打造的系统编程语言.Go语言最显著的特点是编码简洁迅速.支持高效并发和自动内存管理等.此外,Go语言还面向网络服务器.存储系统和数据库等领域的编程进行了优化设计,并且简化了应用系统的安装和部署.因此,Go语言受到了广大程序员的

Android 软件开发与游戏开发1 至 32系列博文大合集

Android 软件开发与游戏开发1 至 32系列博文大合集Android 软件开发与游戏开发1 至 32系列博文大合集 http://www.qdmm.com/BookReader/17958,65822595.aspxhttp://www.qdmm.com/BookReader/17958,65822597.aspxhttp://www.qdmm.com/BookReader/17958,65822598.aspxhttp://www.qdmm.com/BookReader/17958,65

Windows下搭建PHP开发环境,整合Apache+PHP+MySQL(举例软件为32位)

原文来自:http://www.cnblogs.com/pharen/archive/2012/02/06/2340628.html 在原作者的基础上,只是做了详细的解释.避免走弯路.(注:红色字体为本人加的) 一.准备工作-下载所需软件 Apache  httpd-2.2.22-win32-x86-openssl-0.9.8t.msi PHP       php-5.3.10-Win32-VC9-x86.zip MySQL   mysql-5.5.20-win32.msi 二.安装软件 安装A