在单片机上实现USB移动存储
2012-06-02
dragon
标签:

1.3固件程序设计

USB主机系统固件的编写比较繁琐,主要涉及到USB控制传输、USB批量传输、海量存储类协议、UFI磁盘操作命令和FAT文件系统的编写,全部都是最底层的程序操作,没有现成的类库支持,故程序整体框架的搭建和具体协议的数据结构的组织是非常关键的。基于以上因素,构建了系统的总体逻辑设计,见图1.6。

这些协议或者命令层层相扣,每一层开发的优劣不仅直接影响功能的实现,更会直接影响数据传输的稳定性和速度。该系统设计的主要难点在于软件程序的编写,由于牵涉的协议多,在编写程序时要重视模块化的思想,每一个具体的协议尽量都编写在一个源文件里,数据结构和常量、变量最好定义在每个模块的头文件中。在调试USB 底层的控制传输时,可以充分利用Bus Hound工具抓取USB移动存储刚插入计算机时与计算机通信的数据来分析、对比和参考开发,加深对USB整个底层信息交互的理解。

1.3.1 USB总线枚举协议的实现

任何USB设备连上USB主机后,都必须经过USB主机的枚举配置后才能正确使用。USB总线枚举的步骤和方法,对于所有USB设备来说都是一样的,必须遵守标准的USB协议过程,通过控制传输的“一问一答”来实现主机和从机必要的几个数据交流:获取设备描述符、分配设备地址和配置设备。控制传输的核心是SETUP包,其结构见表1.2。

  • bmRequestType:共一个字节,每一位代表一定的意义。第7位D7代表数据传输方向:D7=“0”,代表主机到设备(OUT),D7=“1”,代表设备到主机(IN);D6和D5表示命令类型:D6D5=“00”表示标准请求,D6D5=“01”表示类请求,D6D5=“10”表示用户定义的请求,D6D5=“11”保留值;D4-D0表示命令的接受者类型:D4D3D2D1D0=“00000”表示接受者为设备,D4D3D2D1D0=“00001”表示接受者为接口,D4D3D2D1D0=“00011”表示为其它接受者,D4D3D2D1D0 的其它值保留。
  • bRequest:请求命令代码,在标准的请求命令中USB为每一个命令编了一个代号,见表3.3。
  • wValue:共2个字节,用户自定义。
  • wIndex:共2个字节,用户自定义。

总线枚举的所有命令都是通过SETUP包发送出去的,在SL811HS中就是通过启动DATA0把命令包发送出去。如果命令要求有数据传输,那么SETUP包后接着还有IN包或者OUT包可选数据发送,此时由于前面SETUP包已经启动了DATA0,这里就必须开启DATA1,如果数据大于端点的最大数据载荷,那么就用DATA1/DATA0的方式交替来发送。主机和设备在接收到USB包时,首先就要根据包标识域(PID)进行解码,进而区分出是什么包。USB控制传输主要是SETUP包,同时还有相应的IN包或OUT包;在控制传输完成之后接着是批量传输(BULK),这就是纯粹的IN包或OUT包的传输了。这些包在主机固件里具体如何区分、实现呢?根据表2.1可以知道检验PID的值可以区分出SETUP、IN和OUT包。那么IN和OUT包到底是控制传输中的呢?还是批量传输中的呢?此时要明白,控制传输是所有USB主机或者设备开发中的必要传输,并且只能由默认端点0来完成,所以可以在固件中判断当前信息交互的端点号就可以区分出IN和OUT包到底归属于哪一种传输。如果是批量传输中的IN包或者OUT包,那么可以直接启动DATA0/DATA1来发送数据。USB枚举程序底层数据包传输设计结构见图1.7。

形象点讲USB主机枚举的过程就是:首先获取设备属性,设备会返回18个数值(值中对固件有用的是最大包端点长度),然后为设备分配一个操作地址,地址范围可以根据实际情况而定,并且配置设备,最后列举设备端点,获取设备的每一个端点号(地址)。枚举的实质目的就是想获取设备的端点地址,靠它来完成数据包的收发。获取设备属性、分配地址等枚举请求命令都有标准说明(见表1.3)。

SL811HS 芯片必须初始化、复位后才能对设备进行枚举操作,实践表明对SL811HS寄存器初始化的顺序和延迟时间非常关键,会影响到整个系统的稳定性和速度。经测试比较好的初始代码如下:

void S811Init(void)

{

SL811Write(cDATASet,0xe0); //设定SOF计数器低8位

SL811Write(cSOFcnt,0xae);//设定主机工作模式

SL811Write(CtrlReg,0x5);//开SOF

Delay(150);//延时

SL811Write(EP0Counter,0);

SL811Write(IntEna,0x20);// 写中断寄存器

SL811Write(IntStatus,INT_CLEAR);//清楚中断

}

1.3.2 USB批量传输和海量存储类协议的实现

USB主机系统实现目的是使用USB移动存储,涉及到大量文件数据的传输,所以应该选择USB批量传输(BULK)。批量传输用BULK端点进行命令、数据和状态的传输[4],其流程结构见图1.8。CBW是命令块封装包,CSW是命令状态封状包,都是一系列包的集合。

(1)CBW

CBW的长度为31字节,包含了海量存储类协议的磁盘操作命令,其结构见图1.9。

dCBWSignature:是CBW的标志,固定值为0x43425355,所有CBW的值在USB总线上传输的时候都是按照LSB顺发送的,即最先发送低位,然后发送高位。

  • dCBWTag:由主机产生的并发送给设备,设备会将此值填入CSW的dCSWTag,以此返回给主机。
  • dCBWDataTransferLength:主机希望在批量端点上传输数据的大小。
  • bmCBWFlag:一个字节的位图,D7=“0”时表示主机输出数据,反之主机接受数据,D6没有用到,D5-D0保留位。
  • bCBWLUN:接受命令的设备逻辑单元号。
  • bCBWCBLength:表示了CBWCB的长度,也就是磁盘操作命令的长度。
  • CBWCB:填入磁盘操作命令。

CBW是以二进制位发送的,每个包必须是精确的31个字节,不满足的要补0。

(2) CSW

CSW的长度为13字节,其结构见图1.10。

  • dCSWSignature:是CSW的标志,固定值为0x53425355,CSW的值也都是按LSB顺序发送。
  • dCSWTag:命令状态标签,该值与CBW中的dCBWTag值相同。
  • dCSWDataResidue:该字段表示dCBWDataTransferLength字段中主机希望的数据长度与实际发送的数据长度之间的差额。
  • bCSWStatus:表示命令执行情况,见表1.4

(3)UFI

UFI是Mass Storage 类的子类,支持海量存储类的USB主机应该实现这些子类命令。UFI子类命令是基于SFF-8070I和SCSI-2的,每个命令块的长度均为12字节,UFI的各种命令及操作码如表3.5。对USB移动存储的所有操作都是经过这些命令来完成的,UFI命令封装于CBW中的CBWCB块中,靠CBW传输出去,命令结果的状态保存于CSW中,通过读CSW相关结构中的数值,就可以了解命令的最终执行情况。UFI命令是标准的12字节,命令结构见图1.11。

其中操作码与表1.5中每一种命令相对应。Lgical Unit Number(LUN),每一个设备上可能有很多个逻辑单元共享着该设备功能特性,设备上的逻辑单元都被连续从0X0-0XFF 进行编号;Logical Block Address (LBA), LBA的值从逻辑块0连续递增到最后一个逻辑块,系统中LBA代表的就是移动存储介质的绝对扇区。注意LUN和LBA的字节发送顺序都是MSB,在8位单片机里保持正常顺序即可,CBW结构定义如下:

typedef struct _COMMAND_BLOCK_WRAPPER{

DWORDdCBW_Signature;

DWORDdCBW_Tag;

DWORDdCBW_DataXferLen;

BYTEbCBW_Flag;

BYTEbCBW_LUN;BYTEbCBW_CDBLen;

CBWCBCBWCommand;

BYTEResverd[4];

} CBW, *PCBW;

CBWCB是具体的磁盘操作命令,大小为12字节,用联合体定义如下:

typedef union _CBWCB{

READUfi_Read;

READ_CAPACITYUfi_ReadCapacity;

WRITEUfi_Write;

INQUIRYUfi_Inquiry;

REQUEST_SENSEUfi_RequestSense;

TEST_UNITUfi_TestUnit;

} CBWCB, *PCBWCB;

CSW状态返回值填充在各个字段域里面,定义如下:

typedef struct _COMMAND_STATUS_WRAPPER{

DWORDdCSW_Signature;

DWORDdCSW_Tag;

DWORDdCSW_DataResidue;

BYTEbCSW_Status;

} CSW, *PCSW;

为了节约存储空间和提高效率再把CBW和CSW定义在一个联合体里面,如下:

typedef union _Block{

CBWCbwBlock;

CSWCswBlock;

} BLOCK,*pBlock;

在程序中定义BLOCKidata BlockCommand,就可以访问CBW和CSW了。

共 2 页   上一页12
可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号