引言
USB是英文Universal Serial Bus的缩写,中文含义是“通用串行总线”。它不是一种新的总线标准,而是应用在PC领域的新型接口技术,具有使用方便、速度较快、连接灵活、独立供电等特点。1998年后,随着微软在Windows 98中内置了对USB接口的支持模块,加上USB设备的日渐增多,USB逐步走进了实用阶段,USB协议已经发展到2.0版本,最高速度可达480Mb/s。目前,广泛使用的1.1版本也可达12Mb/s。
USB协议中,对USB设备按类型进行分类。同类型的设备拥有一些共同的行为特征和工作协议,这样可以屏蔽不同硬件之间的差别,以便于主机(PC)对设备进行方便、统一的管理。对USB大容量存储设备(mass storage device)的设计,国际有关机构定义了两种基本传输方式:CBI和BULK ONLY,并对各自开发过程中应注意的问题进行了规定,开发者必须遵循其中至少一种。
一、CBI结构要点
在CBI(Control/Bulk/Interrupt)结构中,要用到USB协议中说到的控制(Control)、批量输入/输出(Bulk in/out)、中断(Interrupt)四种端点(Endpoint)。控制端点用来在主机和设备间传送USB标准命令和对硬盘的控制命令集;批量输入/输出端点用来传输数据;可选用的中断端点用来通知命令的完成。
1.数据传输的说明
主机和CBI存储设备间的通讯通过命令/数据/状态的传输来实现,就是说,协议从主机向设备传送命令,在主机和设备间相互传送数据,从设备向主机传送命令执行状态,并允许主机对设备进行重启。USB大容量存储设备应可接收2类重启命令和3类命令块(command block)。2类重启命令是:USB端口重启和命令重启;3类命令块是:非数据(nondata)、数据输入(data-in)和数据输出(data- out)。本文只对各类命令中和CBI存储设备设计相关的加以说明,其余属于普通USB总线传输的内容可参考USB协议。
(1)USB端口重启
通常用在设备死机等情况。通过主机USB端口强制设备重启,详细情况可参见USB协议。
(2)命令重启
在使用端口重启之前,主机也可以通过发送重启命令来使设备重启。在接收到该命令后,设备将依次执行如下动作:
a.尝试从正在执行的命令或数据传输中退出;
b.清除等待执行的其它命令;
c.清除设备缓冲区的数据;
d.按照设备所使用的子类相应协议执行重启,例如执行自检测、对设备进行初始化并恢复到缺省状态。
(3)非数据命令传输的总线管理和与之相关的设备初始化等功能,详细情况可参见USB协议。
b.类相关命令。采用CBI结构的存储设备应该在控制端点上支持的USB类相关命令为:Accept Device-Specific Command(ADSC)。由ADSC从主机向设备传送命令块。ADSC命令的起始包由表1所示8个字节组成。
表1 ADSC起始包结构
字 节 | 命 名 | 大 小 | 值 | 说 明 |
0 | bmRequestType | Byte | 21h | 指明为USB类相关命令 |
1 | bRequest | Byte | 00h | 指明为ADSC命令 |
2 | (LSB) wValue (MSB) |
Word | 00h | 保留 |
3 | 00h | |||
4 | (LSB) wIndex (MSB) |
Word | ??h | bInterfaceNumber指明设备用哪个端口接收命令 |
5 | 00h | 保留 | ||
6 | (LSB) wLength (MSB) |
Word | ????h | 指明每次传送命令时的数据大小 |
7 |
需要注意的是,wLength的值由所设计的存储设备所属的子类决定,这可以在接口描述字中的bInterfaceSubClass域设置。WLength 设置好之后,每次传输命令数据时就必须严格按照这个值进行。如果不等,设备就将认为此次传输失败并向主机发回相应提示,而且CBI结构的大容量存储设备每次只能接收1个命令块。在主机端,应该把将要传输的命令以队列形式排好便于传送。下面是个ADSC命令的举例:
1 SOF(xA5)
2 SETUP(xB4) ADDR(x7F) ENDP(x0)
3 DATA0(xC3)DATA(x21 00 00:00 00:00 0C:00)
4 ACK(x4B)
5 SOF(xA5)
6 OUT(x87)ADDR(x7F)ENDP(x0)
7 DATA1(xD2) DATA(x 2A 00 00:01:23:45 00 00:)
8 NAK(x5A)
9 SOF(xA5)
10 OUT(x87) ADDR(x7F) ENDP(x0)
11 DATA1(xD2) DATA(x 2A 00 00:01:23:45 00 00:)
12 ACK(x4B)
13 SOF(xA5)
14 DATA0(xC3) DATA(x 00 00 00:00)
15 NAK(x5A)
16 SOF(xA5)
17 OUT(x87) ADDR(x7F) ENDP(x0)
18 DATA0(xC3) DATA(x 00 00 00:00)
19 ACK(x4B)
20 SOF(xA5)
21 IN(x96) ADDR(x7F) ENDP(x0)
22 NAK(x5A)
23 SOF(xA5)
24 IN(x96) ADDR(x7F) ENDP(x0)
25 DATA1(xD2) DATA ( )
26 ACK(x4B)
(4)数据输入和数据输出
主机和存储设备之间交换数据时所用。当主机通过控制端点发出数据输入或数据输出命令并向设备批量输入端点或发出IN PID或OUT PID后,设备开始向主机输出数据或从主机输入数据直至达到主机要求的量为止。
2.CBI存储设备相关描述字设置
按照USB协议,每一个USB设备都有一个或多个配置,每个配置对应相应设备的一项功能。配置是口的集合,通过接口指定设备如何进行USB总线互联,而接口又是一系列端点的集合。从设备到端口都有相应的描述字进行设备,对它们的一般信息进行说明。
CBI结构存储设备应该支持下列USB描述字:
a.设备描述字(device descriptor)。
b.配置描述字(configuration descriptor)。
c.接口描述字(interface descriptor)。CBI存储设备至少应支持一个数据接口。
d.端点描述字(endpoint descriptor)。除用作初始化和命令传输的控制端口Endpoint 0外、CBI存储设备还应该支持批量输入、批量输出、中断三种端点。
(1)设备描述字和配置描述字
有关这两类描述字的结构和含义在USB协议有关这两类描述字的结构和含义在USB协议有详细介绍,本文不再作更多说明,设计时根据实际情况加以设置即可。
(2)接口描述字
CBI存储设备至少应支持1个数据接口。此数据口包括最多4个端点,即前面提到的:控制、批量输入/输出、中断。其中中断端点可设置为用或不用。
接口描述字的结构和含义在USB协议中也有介绍。这里需要说明的有3点:第一是描述字中的bInterfaceClass域,必须设成08h,用来说明该设备为大容量存储系统。第二是bInterfaceSubClass域,用来指明设计时所使用的对设备进行控制的标准命令集。如01h指明是Reduced Block Commands,06h指明是SCSI transparent command set,设计时可根据需要选用。这些在USB Mass Storage Class Specification Overview中有详细说明。第三是bInterfaceProtocol域,指明存储设备的设计使用体积结构。00h和01h说明使用CBI结构。不同的是前者说明设备需使用中断端口告知系统命令的完成与否。
(3)端点描述字
接口所用的每一个除控制端口之外的端口都有自己的描述字。这些端口描述字总是作为配置信息的一部分在回应GetDescriptor命令时由设备发给主机的。
CBI存储设备所支持的批量输入/输出和中断端点描述字结构相同。不同的是具体设置,如表2所列。
表2 端点描述字结构
字 节 | 命 名 | 大 小 | 值 | 说 明 |
0 | bLength | Byte | 07h | 指明该描述字长度 |
1 | bDescriptorType | Byte | 05h | 指明该描述字为端点描述字 |
2 | bEndpointAddress | Byte | 8?h或0?h | 指明该描述字在设备上的端号,必须在1-15之间 Bit0..3 指明端口号 Bit4..6 保留,须设为0 Bit 7 0说明为输出端口,1说明为输入端口 |
3 | bmAttributes | Byte | ??h | 指明是什么端点描述字(批量端点为02h,中断端点为03h) |
4 | wMaxPacketSize | Word | 00??h | 最大数据传输长度 |
5 | ||||
6 | bInterval | Byte | ??h | 数据传输间隔(对批量端点,设成00h) |
表3 中断端口状态信息结构
字 节 | 命 名 | 大 小 | 值 | 说 明 |
0 | bType | Byte | ??h | 00h:指明为命令完成情况中断 01h-FFh:保留 |
1 | bValue | Byte | ??h | 当bType为00hjf , Bit7..4:由设计者指定 Bit3..2:保留,需设成0 Bit1..0:命令完成状态 00=通过 01=失败 10=相位错误 11=永久失败 |
中断端点可由接口描述字的bInterfaceProtocol域的设置决定用否。如果设成00h,就需用中断端点来提示命令的完成情况。当设备需要产生中断时,CBI设备应该在中断端点返回2个字节的状态信息,主机系统使用接口描述字的bInterfaceSubClass域的值来判别这2个字节的含义,并做出相应的处理,这2个字节定义如表3所列。
二、CBI结构的USB存储设备开发实例
这里介绍我们在开发数字化家庭信息系统中的USB硬盘接口时一些简单过程和经验。
1.T33510控制器
开发时采用的T33510是台湾创品公司生产的以89C51为内核,集成有USB和IDE存储设备接口的控制芯片。由于集成度较高,因此在成本和开发难度上较低。它拥有很灵活的体系结构,能够满足设计需要,具体说明如下:
*内嵌有和89C51兼容的8位单片机;
*32K×8片内ROM;
*768×8片内RAM;
*可用作DMA通道的两个528×8片内RAM;
*拥有和89C51相似的P0、P1、P2和P3口,支持存储器的外部扩展;
*具有省电模式;
*拥有5个中断源,其中复用有USB中断源;
*支持全速(12Mb/s)和低速(1.5Mb/s)的USB数据传输速率;
*拥有Control endpoint、Bulk in/out endpoint、Interrupt endpoint等USB通讯端口。
*和Compact Flash Specificeation Rev.1.3兼容的IDE设备接口;
*内置有ECC(Error Correction Code)功能;
*使用3.3V工作电压。
2.T33510中有关USB寄存器设置
为方便设备的开发,对一些常用的USB参数,T33510已经设置好,开发时只要对其它一些比较灵活的部分在相应寄存器中加以设置即可。这里结合本文前面讨论的CBI部分加以说明。
对控制端点,T33510提供了1个8位控制寄存器USBICX和4个字节的控制端点数据寄存器USBICMD。对中断端点,T33510提供8位的控制寄存器USBICR和最少2个字节最多8个字节的数据寄存器(USBICRD1~USBICRD8)。对批量输入/输出端点,也有控制寄存器 USBIBULK和64个字节的FIFO提供使用。
T33510的通用控制寄存器USBIGEN对接口描述字中bInterfaceProtocol等域进行设置,其结构如表4所列。
表4 通用控制寄存器结构
- | - | - | SYS_OK | B_INTF_P | I_INTF_SC | B_INTF_C | SUSP_n |
- | - | - | R/W | R/W | R/W | R/W | R |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
SYS_OK 用来通知主机所需各种描述字已准备好,可以进行访问。B_INTF_P用来设置bInterfaceProtocol域,当为1时,设该域为00h;当为 0时,设该域为01h。我们在设计时设为1,指明使用中断端口来说明命令完成情况。I_INTF_SC用来设定iInterfaceSubClass域,当为1时,设该域为FFh;当为0时,设该域为01h。我们在设计时设为0,指明使用RBC命令集。B_INTF_C用来设定 bInterfaceClass域,当为1时,设该域为FFh;当为0时,设该域为08h,指明为容量存储系统。我们在设计时将该位置0。SUSP_n为系统挂起标记。
T33510支持CBI结构所需的4种端点,按控制端点、批量输入、批量输出、中断端点的顺序依次分配端点号为0、1、2、3。在中断端点速率寄存器USBIINTR中,可对速度进行设置。开发时我们设为FFh。端点寄存器其它域已由T33510预先设置好。
3.系统结构和软硬件设计
基于T33510的USB硬盘结构如图1所示。系统可分为两部分:主机端和单片机端。USB设计分硬件和软件两部分。硬件包括电路设计和固件程序的编写,通常用汇编或C语言;软件分USB设备驱动程序和USB客户软件。固件的编写可采用分块的方法,比如Main模块、Interrupt模块、Vector模块、Timer模块、Declare模块等。通过编译连接以.hex文件的格式写到芯片里面去。固件主要解决以下几个问题:一是描述符的确定与建立;二是中断请求的功能实现;三是命令请求的解析;四是初始化的设置。设备驱动程序和客户软件位于主机端。
T3351 所支持的RBC命令集包括INQUIRY、READ FORMAT CAPASCITIES、READ、WTITE等等,有关RBC命令可从相应协议中得到。系统通过READ命令读取硬盘的启动扇区,并分析其文件系统结构,然后读取其它扇区进行文件的操作。T33510的IDE接口设计有对硬盘操作所需的各个寄存器,符合Compact Flash Specification Rev.1.3协议,给程序编制带来了很大方便。由于所有的文件系统和数据的分析都交由PC端来执行,因此在IDE接口上,只需提供基本的 “Sectors Read”和“Sectors Write”等命令就可以了。主程序流程如图2所示。
下面给出对硬盘一个扇区进行读写的C语言程序段。
读扇区:void ReadOneSecoter (Dword LBA)
{IDE_WRITE_1F6(0xE0); Master & LBA模式
IDE_WRITE_1F2(1); //扇区数
IDE_WRITE_1F3(LBA%0x100);//LBA_7_0位
IDE_WRITE_1F4((LBA/0x100)%0x100);//LBA_15_8位
IDE_WRITE_1F5((LBA/0x10000)%0x100);
// LBA_23_16位
IDE_WRITE_1F7(0x20); //命令:读扇区
While(IdeRead1F7()!=0x58);
IdeReadData();
while(!cf_sfr_ready);
while(IdeRead1F7()!=0x50);}
//--------------------------------------------------------------------
写扇区:void WriteOneSecoter(Dword LBA)
{IDE_WRITE_1F6(0xE0); //Master & LBA模式
IDE_WRITE_1F2(1); //扇区数
IDE_WRITE_1F3(LBA%0x100); //LBA_7_0位
IDE_WRITE_1F4((LBA/0x100)%0x100);
//LBA_15_8位
IDE_WRITE_1F5((LBA/0x10000)%0x100);
//LBA_23_16位
IDE_WRITE_1F7(0x30); //命令:写扇区
while (IdeRead1F7()!0x58);
IdeWriteData( );
while (!cf_sfr_ready); //等待结束
while (IdeRead1F7() !=0x50);}
结束语
CBI结构只是USB存储设备设计时可供选择的一种,此外还有BULK-ONLY结构。应该说,USB硬盘的开发除结构的选择,还涉及许多其它东西,比如RBC命令集的合作、ISE接口的协议、主机端驱动程序等很多因素。本文在此不能一一详述。
USB硬盘驱动器为小型办公、家庭办公、个为及网络,提供了一种快速方便地解决存储问题的途径。
由于USB技术连接方式和速度上相对传统的并口、串口等方式的优势,必将极大改变计算机外设的设计方式。新出台的USB的速度可达480Mb/s,可以改善以前版本速度不是很快的缺憾,将进一步扩展USB应用的范围。