基于μC/OS-Ⅱ的嵌入式USB控制软件的实现_第1页
基于μC/OS-Ⅱ的嵌入式USB控制软件的实现_第2页
基于μC/OS-Ⅱ的嵌入式USB控制软件的实现_第3页
基于μC/OS-Ⅱ的嵌入式USB控制软件的实现_第4页
基于μC/OS-Ⅱ的嵌入式USB控制软件的实现_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于μC/OS-Ⅱ的嵌入式USB控制软件的实现

0引言

2010年USB3.0的正式推出象征USB传输极速时代的到来,但是嵌入式领域由于考虑成本等各方面因素很多仍采用USB1.1协议。同时USB协议的主体框架并没有改变,因此研究USB1.1协议在嵌入式系统上的实现对于USB3.0协议的应用也是很好的铺垫。本文在以杭州中天32位RISCCPUCK510为内核的摩托罗拉HM1521_B芯片上,基于μC/OS-Ⅱ操作系统,实现对USB设备的读写控制。由于HM1521_B芯片只支持USB1.1协议,所以本文实现的只是USB1.1协议。USB是一种主从结构:主机Host和从机Device。所有的数据传输都由Host主动发起,而Device只是被动的负责应答。在USBOTG中,一个设备可以在Device和Host之间切换,用以实现设备与设备之间的连接,大大增加了USB的使用范围。但USBOTG依然没有脱离主从关系,设备之间必然有一个作为Host,另一个作为Device。标准的USB使用4根线,分别是5V电源、差分数据线负(D-)、差分数据线正(D+)、地(GND)。USB的低速和全速模式采用电压传输,高速模式则采用电流传输。1USB控制软件的分层结构

按照USB协议规范,USB运行首先是USBHost通过D+数据线上的电平变化检测USBDevice的插入和拔出,Host和Device依据协议规定的顺序执行一系列信息交换,这称为枚举部分,也是所有USB主机都必须支持的功能。Host根据获得的Device信息判断该Device属于哪一类USB设备,并确定下一步选用哪个特定的程序加以支持。

USB协议规定了HID(人机接口设备)类、MassStorage(大容量存储设备,如U盘)类、音频类等各种设备类型。在嵌入式系统中,由于受系统性能和存储空间的限制,一般只能支持某几个类型。本文只支持MassStorage类。

图1是本文实现的USBHost控制软件的分层结构:应用层调用FAT32文件系统层的函数;文件系统层通过MassStorageUFI命令与存储设备建立联系,实现U盘上文件的建立和读写等一系列操作;最底层的是MassStorage驱动模块,实现对U盘数据的读写功能。其主要函数包括:

本文软件用C语言编程,并依赖μC/OS-Ⅱ操作系统提供的中断函数来调度各个函数的运行。

2FAT32文件系统的实现

文件系统的作用是对文件在介质上的存储进行管理,并为操作系统提供操作函数。若把U盘看成是以扇区为单位的逻辑盘(1扇区=512B),当一个U盘被格式化成FAT32格式的分区后,它的结构形式图如图2所示。

引导扇区(DOSBootRecord,DBR)存储了本分区的BPB(BiosParameterBlock)信息。主引导记录MBR(MasterBootRecord)是物理上第一个扇区,绝对扇区号是0,它独立于任何一个分区。MBR的前446B是系统引导程序,接着的64个字节是分区表DPT(DiskPartitionTable),最后两字节是扇区有效标志55AA。初始化一个U盘的文件系统,很重要的一步就是填写引导扇区的过程。对有些关键字节进行分析如下所示:

FAT32文件系统中,FAT表是一个数据表,以簇(cluster)的形式链式存放。当一个文件大于一簇(4个扇区)时,每簇中存放的数据便是文件存放的下一簇地址。直到遇到簇中的数据为“FFFF”时,才表示此文件已至尾簇。数据内容不连续地存放于数据区内。文件系统使用设备驱动提供的4个函数获取设备的状态信息以及实现对设备的读写。

3USB设备枚举的实现

枚举就是从Deveice读取信息,通过设备描述符设备告诉Host是什么设备、如何进行通信,Host根据这些信息来加载合适的驱动程序。

3.1枚举过程及实现

USB是一种主从的结构,所有传输由Host来发起。当Host发起一次传输时,通常包括3个包(Packets)的传输。Host首先是发送一个TokenPacket,包含本次传输的命令类型(Type)、方向(Direction)、设备的地址(DeviceAddress)以及端点号(Endpoint);紧接着发送数据包(Da-taPacket),包含要求Device返回描述符的命令数据;最后由Device返回握手信号包(handshakepacket),正确返回(ACK)命令。

USBHost检测到有Device插入后,进行总线复位。然后Host使用默认地址0读取设备描述符。获取设备描述符的USB设备请求命令结构体为:

第1次读取设备描述符时,Host首先发送setup包;之后进入主机读取数据阶段,Host发送in包,Device返回一个18B的设备描述符,可以用一个结构体将其读回。最后Host发送0B的数据包作为状态相应,设备返回ACK作为应答。用逻辑分析仪抓包,3个包如图3所示。

第1次读取设备描述符后,Host依次进行地址分配、第2次读取设备描述符、读取配置描述符、读取描述符集、设置配置、读取配置状态和读取接口状态,方法和第1次读取设备描述符的方法一样。

3.2U盘兼容性

在设备枚举阶段将会碰到很多关于U盘兼容性的问题。

(1)总线复位时间。不同型号的U盘对于总线复位时间的要求是不同的,比如金士顿1GB的U盘需要的复位时间至少280ms。在实现中为保险起见,给予400ms的复位时间。

(2)有些U盘的端点0是8Bpayload的,大多数是64B。对于8Bpayload的U盘,要严格从第1次获取设备描述符时返回的第8字节获取payload,否则尽管枚举过程仍然能通过,但是后面在分析32字节的配置描述符时候会出现问题,没有收到完整的配置描述符是分析不出端点1和端点2的地址以及端点payload的。

(3)在枚举阶段获取字符串描述符的时候,要进行判断。因为有些U盘不支持返回字符串描述符,用if语句判断,如果获取不到字符串描述符就跳过,不要返回失败。

4Bulk-only传输的实现

枚举结束后是对块设备的读写。Bulk-Only传输规范是USB组织针对大容量存储设备制定的一种块存储类协议,它仅仅使用Bulk端点来传送数据/命令/状态。

图4是数据/命令/状态在USB总线上的传输流程图。根据此图Bulk-only传输的状态可以定义为:空闲、CBW处理、数据输出(从Host向Device传输数据)、数据输入(从Device向Host传输数据)、CSW处理、管道阻塞等6种状态。在空闲状态下,接收到的数据包为CBW包;在数据输出状态下,接收到的数据包为Host期待写入Device的数据;在数据输入状态下,Host请求从Device读取数据,Device将向Host发送这些数据包;在CSW状态下,Device封装并发送CSW包以向Host返回状态信息。因此,任何Bulk-Only事务均是以Host向Device发送CBW包并试图建立相应的数据传输开始的;而Device接收到CBW包,进行检查并解释,试图满足Host的要求,并通过CSW向主机返回状态信息。以读一个逻辑块为例,填写一个CBW包的程序如下所示:

逻辑分析仪抓包结果如图5所示。从抓包结果可以清晰的看出CBW包由31个字节组成。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论