了解了USB Mass Storage BOT的规范。接下来学习一下Microchip 单片机实现USB Mass Storage设备的经典Application Notes。
MICROCHIP AN1003 :USB Mass storage Device Using a PIC
MCU

本文描述了使用SD卡来设计实现USB Mass storage设备(MSD)。本文对USB Mass storage方案的开发人员会有很大的帮助。这个应用可以作为独立的MSD或一个SD卡读写器。
本设计有下列组件构成:
● PIC18F4550 MCU
● PICDEM FS USB Demo板
● PICtail 板(SD和MMC卡)
● Windows操作系统
枚举过程
下面总结了USB设备的枚举步骤而且说明了在枚举过程中设备如何从Powered到Default,Address和Configured状态。
1.
用户将USB设备插入USB口。Hub给端口供电,设备处于Powered状态。
2.
Hub识别设备。
3.
Hub通过一个终端PIPE去向Host报告event。
4.
Host 发送 Get_Port_Status 请求获得关于设备更详细的信息。
5.
Hub识别设备是LowSpeed或FullSpeed。并且将Get_Port_Status的响应信息发送给主机。
6.
主机发送Set_Port_Feature请求,要求Hub去复位端口port。
7.
Hub复位设备。
8.
主机获悉Full-Speed 设备是否支持High-Speed操作(使用Chirp K信号)。
9.
主机利用Get_Port_Status判断设备是否已经推出Reset状态。
10.
此时,设备处于Default状态(设备已经准备好通过缺省Pipe的Endpoint0响应控制传输,缺省地址是00h。而且设备可以从总线获得最大100mA)。
11.
主机发送Get_Descriptor 来获得最大封包大小(注意:设备描述符的第八个字节是bMaxPacketSize)
12.
主机通过发送Set_Address 请求为设备分配地址。设备现在处于Address状态。
13.
主机发送Get_Descriptor来获得设备的更多的信息。
14.
主机分配并调用一个设备驱动。
15.
主机的设备驱动通过发送一个Set_Configuration请求来选择一个配置。现在设备处于Configured状态。
16.
主机为复合设备的接口分配驱动。
17.
如果hub检测到过流状态,或主机响应hub关闭电源。设备将从USB总线上下电。这时,设备和主机不能通讯而且设备处于Attached状态。
18.
如果设备在总线上有3ms没有动作。它将进入Suspend状态。此时,设备消耗总线上最小的功耗。
注:这篇AN里,这部分枚举过程的描述比较经典呀!
控制传输
控制传输允许主机和设备交换关于设备配置和其它控制消息的信息。控制传输是由Setup Stage,可选的Data Stage和Status Stage组成。
“Standard USB
Device Requests”总共有11个USB 标志控制传输请求。所有的USB设备都必须响应这些请求(即使仅响应了STALL)。处理标志的请求,每个USB类也会定义本类的设备请求。例如:Mass Storage设备要实现Get_Max_LUN请求来使主机能够知道设备支持的逻辑单元数。
Mass Storage类
Mass Storage类支持两个传输协议:
● Bulk-Only 传输(BOT)
● Control/Bulk/Interrupt传输(CBI)
Mass Storage类规范定义了两个类规定的请求:Get_Max_LUN和Mass Storage Reset,所有的Mass Storage类设备都必须支持这两个请求。
Bulk-Only Mass Storage Reset(bmRequestType=00100001b and
bRequest= 11111111b)用来复位Mass Storage设备及其相关接口。
Get_Max_LUN(bmRequestType= 10100001b and bRequest= 11111110b)用来确认设备支持的逻辑单元数。Max LUN的值必须是0~15。注意:LUN是从0开始的。主机不能向不存在的LUN发送CBW。
支持BOT传输的Mass Storage设备接口描述符要求如下:
bInterfaceClass=08h,表示为Mass Storage设备;
bInterfaceSubClass=06h,表示设备支持SCSI Primary Command-2(SPC-2);
bInterfaceProtocol=