USB Mass Storage类设备的设计与实现

1  引言
    目前嵌入式设备往往采用sd卡等大容量存储设备,用于存储媒体、图片、历史数据等文件,因此对pc主机与嵌入式设备之间的数据传输速度提出了更高的要求。本文采用freescale公司的32位微控制器mcf52233和maxim公司的usb外设/主机控制器max3421来实现usb mass storage类设备,以实现数据的高速传输。
    max3421是maxim公司推出的usb外设/主机控制器,包含了所有必要的数字逻辑和模拟电路,可以用来实现符合usb2.0规范的全速usb外设或全速/低速主机。内置的全速收发器具有±15kv的esd保护,并提供可编程的usb连接和断开功能。内部sie (串行接口引擎)处理底层usb协议的细节,例如差错检验和总线重试。max3421e利用一组寄存器展开工作,通过一个最高工作速率达26mhz的spitm接口可以访问这些寄存器。利用简单的3线或4线spi接口,该器件可以给任何spi主控制器(微处理器、dsp等)增加usb外设或主机功能。max 3421最多支持四个usb端点,分别为ep0:控制端点(control engpoint) (64字节)。ep1:输出端点(out endpoint),bulk或interrupt,2 x 64字节(双缓冲)。ep2:输入端点(in endpoint),bulk或interrupt,2 x 64字节(双缓冲)。ep3:输入端点(in endpoint),bulk或interrupt (64字节)。各个端点是如何工作的仅仅取决与max3421在usb通讯的枚举阶段返回给usb主机的端点描述符的配置情况。

2  硬件电路设计
2.1 max3421硬件电路设计
    usb传输协议采用四线连接方式,5v电源线(vbus),差分数据线负(d-),差分数据线正(d+)和地(gnd)。其中,电源线和地用以给usb设备供电,两根数据线d+和d-来传递usb通信的差分信号。max 3421的硬件连接方式如图1所示。其中24、25号引脚为max3421的晶振输入输出引脚,并联谐振频率为12mhz±0.25%的晶振,通过22pf的晶振匹配电容接地。2、23引脚接3.3v的正电源。3、19号引脚接地。12号引脚为max3421的芯片复位信号,低电平有效,拉底该引脚即会使芯片复位。13、14、15、16号引脚分别为spi通讯的串行时钟输入、从器件选择输入、串行数据输出和串行数据输入引脚,连接到mcf52233 spi模块的对应引脚。18号引脚为中断引脚,配置max3421的控制位,可以使max3421在接收到usb数据包时改变该引脚电压,产生中断。20、21号引脚为usb数据传输的差分信号引脚,通过阻值为27欧姆的电阻连接到usb总线中。其余引脚为max3421的io扩展引脚,可以用于io扩展用。

图1  max3421硬件电路连接图

2.2 sd卡硬件电路设计
    本系统选用sd卡为存储介质,sd卡是高度集成闪存,具备串行和随机存取能力,可以通过专用优化速度的串行接口访问,数据传输可靠。图2为sd卡内部结构示意图。sd卡的接口可以支持两种操作模式:sd模式和spi模式。主控制器可以选择以上任一模式。sd卡模式允许4线的高速数据传输。 spi模式允许简单通用的spi通道接口。本系统采用spi模式与sd卡通信。硬件电路连接方式如图3所示。max3421和sd卡共用一个mcf52233的spi接口,两者的通讯通过各自的从器件选择位控制。


图2  sd卡结构示意图


图3  sd卡硬件电路链接图

3  软件实现
    usb海量存储器所涉及到的协议包括usb2.0 specification和usb mass storage class specification(usb海量存储类协议)。所有usb设备必须遵循usb协议,usb mass storage class specification是由usb mass storage class working group(usb海量存储类工作组)所推动,涵盖若干文档:usb mass storage class specification overview,usb mass storage class control/bulk/interrupt(cbi) transport,usb mass storage class bulk-only transport,usb mass storage class ufi command specification。其中specification overview和bulk-only transport 几乎与所有海量存储设备相关,两外两个文档仅与一些软盘设备相关。海量存储设备必须支持一种以上的标准指令集,才能与主机进行数据交换。
3.1 usb mass storage class类设备的枚举过程
    在usb集线器的每个下游端口的d+和d-上,分别接了一个15k欧姆的下拉电阻。这样,在集线器的端口悬空时,就被这两个下拉电阻拉到了低电平。而在usb设备端,在d+或者d-上接了1.5k欧姆上拉电阻。对于全速和高速设备,上拉电阻是接在d+上;而低速设备则是上拉电阻接在d-上。这样,当设备插入到集线器时,由1.5k的上拉电阻和15k的下拉电阻分压,结果就将差分数据线中的一条拉高。集线器检测到这个状态后,它就报告给usb主控制器(或者通过它上一层的集线器报告给usb主控制器),这样就检测到设备的插入了。usb主机在检测到usb设备插入后,就要对设备进行枚举。枚举就是从设备读取一些信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。
usb标准命令共有11种,对于usb mass storage类设备来讲,主机并没有发出全部的标准命令,所以设备只要支持usb mass storage类设备需要的标准请求即可实现枚举过程。usb标准命令为8个字节长度,主要功能是完成usb设备的配置操作。usb mass storage类设备主要用到以下3种标准命令:get descriptor,用于获取设备描述符、配置描述符、语言id、产品序列号、厂商字符串、设备序列号;set address,用于设置usb mass storage类设备的地址;set configuration,用于设置usb设备的配置值。主机为了获取设备信息,对某些命令可能发多次请求,图4为通过串口打印的usb枚举阶段的标准请求信息。如果枚举成功,主机将给usb设备分配一个配置值,配置值设置完毕后枚举结束,主机将发现新设备。随后usb主机根据枚举的数据,发送usb设备特定的功能代码,例如本例中,就是发送get_max_lun请求。

图4  usb设备枚举过程

    对于usb mass storage类设备的设备描述符,配置描述符和接口描述符是有特定要求的。本系统定义的描述符如下:
    //定义设备描述符
    char device_descriptor[]= 
    {
    0x12, // 描述符长度
    0x01, // 描述符类型
    0x00,0x02, //usb版本号
    0x00, //类代码
    0x00, //子类代码
    0x00, //协议代码
    0x40, //端点0支持的最大数据长度
    0x6a,0x0b, //供应商id
    0x46,0x53, //产品id
    0x34,0x12, // 设备版本好
    0x01, //供应商字符串描述符的索引值
    0x02, //产品字符串描述符的索引值
    0x03, // 设备序列号字符串的索引值
    1 //所支持的配置数
    };
    //定义配置描述符
    char configuration_dscriptor[] = 
    {
    0x09, //配置描述符的长度
    0x02,  //配置描述符类型
    0x20,0x00 //配置信息长度
    0x01, //只包含一个接口                                                
    0x01, //该配置的编号                                                           
    0x00, //配置字符串描述符的索引值                                                          
    0x80, //配置属性
    0x01 //所需最大电流
    };
    //定义接口描述符
    char interface_descriptor[] =
    {
    0x09, //接口描述符的长度
    0x04, //描述符类型
    0x00, //接口编号为0
    0x00, //该接口描述符的备用编号
    0x02, //端点数量为2
    0x08, //所使用的类
    0x06, //使用的子类
    0x50, //使用的协议
    0x00 //接口描述符字符串索引
    };
    在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。因此configuration_dscriptor中的wtotallength字段设置为0x20,0x00,包括配置描述符、接口描述符和两个端点描述符(分别用于bulk-in和bulk-out)的总长度,而不是只表示配置描述符长度的0x09,0x00。
3.2 bulk-only传输
    usb协议中,端点是usb设备传输数据的接收点和发送点。usb mass storage class bulk-only transport规定使用bulk端点传输命令、数据和状态,只有在清除bulk端点上一个stall状态以及传输类请求时才使用默认端点。本文设计采用如下三个端点:
    端点0:control endpoint
    端点1:bulk out endpoint
    端点3:bulk in endpoint
    bulk-only协议传输流程如图5所示。usb主机通过bulk-out端点发送含有命令块的cbw(command block wrapper)数据包,设备接收到cbw数据包后,如果检测到cbw非法,就会设置bulk-in端点为stall状态,否则执行数据传输命令。如果主机在命令传输过程中检测到bulk-in端点的stall状态,就会采取复位措施。cbw数据包长度为31比特。


图5  命令/数据/状态传输流程

    数据传输完毕以后,设备通过bulk-in端点返回csw(command status wrapper)数据包,报告cbw命令的执行情况。csw数据包长度为13比特。主机接收到对应于cbw的csw数据包后,可启动下一次传输。如果主机没有收到csw数据包,就不会向设备发送下一个cbw数据包。
    本例中,在端点1的中断处理函数中,先判断收到的数据包是否是cbw数据包,如果是,判断该命令包具体是哪条命令,并调用相应的处理函数;如果不是,则是写数据命令,调用write_10处理函数,把接收到的数据写入sd卡相应扇区。判断cbw命令的方法如图6所示。

图6  cbw数据包判断程序

3.3 sd卡的读写
    scsi命令包括inquiry,mode_sense_10,
    request_sense, read_f0rmat_capacitu, read_10,      
    test_unit_ready,read_capacity,write_10等。
    scsi命令包装在cwb数据包中,设备解析scsi命令并执行相应的操作。
    以read_10为例描述从sd卡读出数据的过程。首先usb主机向设备的bulk out端点发送cbw数据包,设备在接收到后解析该数据包,判断其为read_10命令,并从cbw的dw-    logicalblockaddress字段获得要读取数据的起始扇区号,从dwtransfer -length字段中获得要读取数据的长度,然后通过spi接口从sd卡指定扇区开始,读取指定长度的数据,并通过bulk in端点发送向主机。在成功发送完数据后,usb mass storage类设备向usb主机发送csw命令字,指示数据已传送完毕,主机在收到csw后,可以进行下一次的传输。
    值得说明的一点是,由于max-3421端点1和端点3一次最大只能传输64字节的数据,而sd卡中一个扇区的数据就有512个字节,因此传输一个扇区的数据就要分8次。

4  实验结果
    usb mass storage类设备第一次插入电脑以后会出现如图7(a)- 7(d)的提示,枚举结束后,电脑根据设备返回的枚举信息,安装usb mass storage类设备的驱动,驱动安装完毕以后设备就能正常使用了,设备工作状态如图7(e)所示。

图7  自定义的usb mass storage类设备

    max3421工作在usb全速模式下,最大传输速度为12mbyte/s,扣除总线状态,控制和错误检测等的数据传输,最大的有效数据理论传输速度仍达1.2mbyte/s,但在实际中由于受多种因素制约,无法达到理想状况。bulk-in和bulk-out传输中,由于一次最大只能传输64个字节的数据,因此需要的数据传输次数增多,每个数据包的同步、标志、校验等信息将不可避免的占用带宽资源。usb主机向设备发送读写命令、usb设备解析命令并做出反应,控制max3421等,也会占用带宽。同时,sd卡自身读写速度的限制,也会使带宽受到限制。另外,由于本文采用spi模式与sd卡通讯,spi的时钟频率将直接影响sd卡的读写速度。本文中mcf52233工作在60mhz时钟频率下,spi最大时钟频率为15mhz,不计向sd卡发送命令,读取状态等操作占用的spi时钟,最大读写速度也仅仅是1.875mbyte/s。如果采用sd模式与sd卡通讯,通讯速度将大幅提升,但需要专用的sd控制器才能实现。
    usb mass storage类设备的实现,使的嵌入式设备与主机的数据交换速度大大提高。经过测试,读写速度满足嵌入式大容量存储设备对数据传输速度的要求,性能可靠稳定。

作者简介
    韩 杰(1985-)男  硕士研究生,研究方向:现代物流系统视觉机器人货物识别与拣选方法研究。

参考文献
[1]  maxim. max3421e usb外设/主机控制器编程手册[eb/ol],2007,2
[2]  sd group. sd memory card specification [eb/ol],2000,3
[3]  禇晓滨,陆铁军,宗宁. usb接口海量存储指令分析[j]. 机电产品开发与创新,2008,21(3):103-105
[4]  王成儒,李英伟. usb2.0原理与工程开发[m]. 北京:国防工业出版社,2004:108-115
[5]  莫北健. usb设备的bulk模式驱动程序设计[j]. 计算机与信息技术,2004,12
[6]  usb mass storage class working group. universal serial bus mass storage class bulk-only transport ,1999


你可能感兴趣的:(USB Mass Storage类设备的设计与实现)