一、MCB1700的USB库文件详细分析:
MCB1700的USB文件较多,但只要弄清楚一下几个即可:
1. mscuser.c 大容量存储设备相关的文件,比如设计到存储设备的读写,以及使用的协议。例如,SD卡,BOT协议(CBW,CSW解析,SCSI命令解析)。
2. usbdesc.c USB的设备描述符,配置描述符,接口描述符,端点描述符(Bulk-In 端点 和 Bulk-Out 端点)
3. usbhw.c USB的一些硬件寄存器等获取信息。
主要函数void USB_IRQHandler (void) {},在USB中断中查看USB的状态并负责调用各个端点处理函数,来处理相应的数据包。
4. usbcore.c USB的软件核心部分,包括USB的状态,请求获得各个描述符等函数。主要参看函数void USB_EndPoint0 (U32 event){},在枚举阶段使用默认端点0通信,因此一般USB设备必备。
5. usbuser.c USB开发人员定义的函数,主要是除了端点0函数外的其它端点函数,以供3中的中断函数调用。
二、SETUP包数据分析(打印数据见后文)
其中:
1)sup: 80 6 0 1 0 0 40 0 表示第一个Setup包中收到的数据。40表示返回的数据最大长度为40H字节。将总共发送16个字节的设备描述符(8+8)。
2)sup: 0 5 1 0 0 0 0 0 表示第二个Setup包中收到的数据
3)sup: 80 6 0 1 0 0 12 0 第三个
4)sup: 80 6 0 2 0 0 9 0
5)sup: 80 6 0 3 0 0 ff 0
......
n)sup: 0 9 1 0 0 0 0 0
详细解释:
1)表示第一个Setup包中收到的数据。40表示返回的数据最大长度为40H字节。将总共发送16个字节的设备描述符(8+8)。
2)表示第二个Setup包中收到的数据。1表示主机为设备分配的地址为0x02
3)第三个。12H表示要求得到全部18字节的设备描述符。
4)要求得到设备的配置描述符,9个字节。
5)得到设备的配置描述符、接口描述符、端点描述符的集合。
......
n)调用Set_Configuration函数
三、其它说明
1. 0.1 端点0的USB_EVT_SETUP包
2. 0.2 端点0的USB_EVT_OUT包
3. 0.3 端点0的USB_EVT_IN包
4. w n: 表示即将向某一端口写数据n个
5. 0.1.1.1 特殊信息,USB_MSC设置请求完成
6. 2 3 端点2的USB_EVT_OUT包
7. 2 2 端点2的USB_EVT_IN包
四、注意事项
我觉得USB中断里面的数据不能打印太多,否则USB识别的过程可能会出现问题。
调试的时候只要发现USB->USBDevIntSt寄存器的值为0x5即可。
通常的打印顺序如下:
19 39 239 239 239 239 9 39 5 (大多数情况下)
一定要等到这个5出现为止。
五、数据
USB识别的全过程打印如下:
1)仅SETUP,以及描述
sup: 80 6 0 1 0 0 40 0 0.1 GET_DESCRIPTOR: DEVICE_DESCRIPTOR 0.3 0.2
sup: 0 5 1 0 0 0 0 0 0.1 SET_ADDRESS: 0.3
sup: 80 6 0 1 0 0 12 0 0.1 GET_DESCRIPTOR: DEVICE_DESCRIPTOR 0.3 0.3 0.3
sup: 80 6 0 2 0 0 9 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR 0.3 0.3 0.2
sup: 80 6 0 3 0 0 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR 0.3 0.2
sup: 80 6 3 3 9 4 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR 0.3 0.3 0.3 0.3
sup: 80 6 0 2 0 0 ff 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR 0.3 0.3 0.3 0.3 0.3
sup: 80 6 0 6 0 0 a 0 0.1 GET_DESCRIPTOR:
sup: 80 6 0 3 0 0 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR 0.3 0.2
sup: 80 6 2 3 9 4 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR 0.3 0.3 0.3 0.3 0.3 0.3 0.2
sup: 80 6 0 3 0 0 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR 0.3
sup: 80 6 2 3 9 4 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR 0.3 0.3 0.3 0.3 0.3 0.3 0.2
sup: 80 6 0 1 0 0 12 0 0.1 GET_DESCRIPTOR: DEVICE_DESCRIPTOR 0.3 0.3 0.3
sup: 80 6 0 2 0 0 9 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR 0.3 0.3 0.2
sup: 80 6 0 2 0 0 20 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR 0.3 0.3 0.3 0.3 0.2
sup: 80 6 0 3 0 0 2 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR 0.3 0.2
sup: 80 6 0 3 0 0 4 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR 0.3 0.2
sup: 80 6 3 3 9 4 2 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR 0.3 0.2
sup: 80 6 3 3 9 4 1a 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR 0.3 0.3 0.3 0.3
sup: 0 9 1 0 0 0 0 0 0.1 SET_CONFIGURATION: 0.3
sup: a1 fe 0 0 0 0 1 0 0.1
0.1.1.1 0.2 0.3
sup: 2 1 0 0 82 0 0 0 0.1 CLEAR_FEATURE: 0.3
sup: 2 1 0 0 82 0 0 0 0.1 CLEAR_FEATURE: 0.3
sup: 2 1 0 0 82 0 0 0 0.1 CLEAR_FEATURE: 0.3
sup: 2 1 0 0 82 0 0 0 0.1 CLEAR_FEATURE: 0.3
sup: 2 1 0 0 82 0 0 0 0.1 CLEAR_FEATURE: 0.3
2)1的基础上加写标志
USB test!
sup: 80 6 0 1 0 0 40 0 0.1 GET_DESCRIPTOR: DEVICE_DESCRIPTOR w 8: 0.3 w 8: 0.2
sup: 0 5 1 0 0 0 0 0 0.1 SET_ADDRESS: w 0: 0.3
sup: 80 6 0 1 0 0 12 0 0.1 GET_DESCRIPTOR: DEVICE_DESCRIPTOR w 8: 0.3 w 8: 0.3 w 2: 0.3 w 0:
sup: 80 6 0 2 0 0 9 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR w 8: 0.3 w 1: 0.3 w 0: 0.2
sup: 80 6 0 3 0 0 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 4: 0.3 w 0: 0.2
sup: 80 6 3 3 9 4 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 8: 0.3 w 8: 0.3 w 8: 0.3 w 2: 0.3 w 0: 0.2
sup: 80 6 0 2 0 0 ff 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR w 8: 0.3 w 8: 0.3 w 8: 0.3 w 8: 0.3 w 0: 0.3 w 0:
sup: 80 6 0 6 0 0 a 0 0.1 GET_DESCRIPTOR:
sup: 80 6 0 3 0 0 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 4: 0.3 w 0:
sup: 80 6 2 3 9 4 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 8: 0.3 w 8: 0.3 w 8: 0.3 w 8: 0.3 w 8: 0.3 w 0: 0.3 w 0:
sup: 80 6 0 3 0 0 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 4: 0.3 w 0:
sup: 80 6 2 3 9 4 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 8: 0.3 w 8: 0.3 w 8: 0.3 w 8: 0.3 w 8: 0.3 w 0: 0.3 w 0: 0.2
sup: 80 6 0 1 0 0 12 0 0.1 GET_DESCRIPTOR: DEVICE_DESCRIPTOR w 8: 0.3 w 8: 0.3 w 2: 0.3 w 0: 0.2
sup: 80 6 0 2 0 0 9 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR w 8: 0.3 w 1: 0.3 w 0:
sup: 80 6 0 2 0 0 20 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR w 8: 0.3 w 8: 0.3 w 8: 0.3 w 8: 0.3 w 0:
sup: 80 6 0 3 0 0 2 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 2: 0.3 w 0:
sup: 80 6 0 3 0 0 4 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 4: 0.3 w 0:
sup: 80 6 3 3 9 4 2 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 2: 0.3 w 0:
sup: 80 6 3 3 9 4 1a 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 8: 0.3 w 8: 0.3 w 8: 0.3 w 2: 0.3 w 0:
sup: 0 9 1 0 0 0 0 0 0.1 SET_CONFIGURATION: w 0: 0.3
sup: a1 fe 0 0 0 0 1 0 0.1 w 1:
0.1.1.1 0.2 0.3 w 0: 2 2 w 36: 2 3 w 13: 2 3 2 2 w 12: 2 3 w 13:
sup: 2 1 0 0 82 0 0 0 0.1 CLEAR_FEATURE: w 13: w 0: 0.3 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 13: 2 3 2 2 w 4: 2 3 w 13:
sup: 2 1 0 0 82 0 0 0 0.1 CLEAR_FEATURE: w 13: w 0: 0.3 2 3 2 2 w 4: 2 3 w 13:
sup: 2 1 0 0 82 0 0 0 0.1 CLEAR_FEATURE: w 13: w 0: 0.3 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 13: 2 3 2 2 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 13: 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 18: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 18: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 18: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 18: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 18: 2 3 w 13: 2 3 2 2 w 4: 2 3 w 13:
sup: 2 1 0 0 82 0 0 0 0.1 CLEAR_FEATURE: w 13: w 0: 0.3 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 18: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 18: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 18: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 18: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 18: 2 3 w 13: 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 13: 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 13: 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 8: 2 3 w 13: 2 3 2 2 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 13: 2 3 2 2 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 64: 2 3 w 13: 2 3 2 2 w 4: 2 3 w 13:
sup: 2 1 0 0 82 0 0 0 0.1 CLEAR_FEATURE: w 13: w 0: 0.3 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3 2 2 w 13: 2 3
3)2基础上加打印写的数据
sup: 80 6 0 1 0 0 40 0 0.1 GET_DESCRIPTOR: DEVICE_DESCRIPTOR w 8: 2000112 8000000 0.3 w 8: 2203c251 2010100
sup: 0 5 1 0 0 0 0 0 0.1 SET_ADDRESS: w 0: 0.3
sup: 80 6 0 1 0 0 12 0 0.1 GET_DESCRIPTOR: DEVICE_DESCRIPTOR w 8: 2000112 8000000 0.3 w 8: 2203c251 2010100 0.3 w 2: 103 0.3 w 0:
sup: 80 6 0 2 0 0 9 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR w 8: 200209 80000101 0.3 w 1: 40932 0.3 w 0:
sup: 80 6 0 3 0 0 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 4: 4090304 0.3 w 0:
sup: 80 6 3 3 9 4 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 8: 30031a 300030 0.3 w 8: 410031 300030 0.3 w 8: 300030 300030 0.3 w 2: 30e0030 0.3 w 0:
sup: 80 6 0 2 0 0 ff 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR w 8: 200209 80000101 0.3 w 8: 40932 6080200 0.3 w 8: 5070450 400282 0.3 w 8: 2050700 4002 0.3 w 0: 0.3 w 0:
sup: 80 6 0 6 0 0 a 0 0.1 GET_DESCRIPTOR:
sup: 80 6 0 3 0 0 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 4: 4090304 0.3 w 0:
sup: 80 6 2 3 9 4 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 8: 4b0328 690065 0.3 w 8: 20006c 43004d 0.3 w 8: 310042 300037 0.3 w 8: 200030 65004d 0.3 w 8: 6f006d 790072 0.3 w 0: 0.3 w 0: 0.2
sup: 80 6 0 3 0 0 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 4: 4090304 0.3 w 0:
sup: 80 6 2 3 9 4 ff 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 8: 4b0328 690065 0.3 w 8: 20006c 43004d 0.3 w 8: 310042 300037 0.3 w 8: 200030 65004d 0.3 w 8: 6f006d 790072 0.3 w 0: 0.3 w 0: 0.2
sup: 80 6 0 1 0 0 12 0 0.1 GET_DESCRIPTOR: DEVICE_DESCRIPTOR w 8: 2000112 8000000 0.3 w 8: 2203c251 2010100 0.3 w 2: 103 0.3 w 0:
sup: 80 6 0 2 0 0 9 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR w 8: 200209 80000101 0.3 w 1: 40932 0.3 w 0:
sup: 80 6 0 2 0 0 20 0 0.1 GET_DESCRIPTOR: CONFIGURATION_DESCRIPTOR w 8: 200209 80000101 0.3 w 8: 40932 6080200 0.3 w 8: 5070450 400282 0.3 w 8: 2050700 4002 0.3 w 0:
sup: 80 6 0 3 0 0 2 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 2: 4090304 0.3 w 0:
sup: 80 6 0 3 0 0 4 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 4: 4090304 0.3 w 0: 0.2
sup: 80 6 3 3 9 4 2 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 2: 30031a 0.3 w 0:
sup: 80 6 3 3 9 4 1a 0 0.1 GET_DESCRIPTOR: STRING_DESCRIPTOR w 8: 30031a 300030 0.3 w 8: 410031 300030 0.3 w 8: 300030 300030 0.3 w 2: 30e0030 0.3 w 0:
sup: 0 9 1 0 0 0 0 0 0.1 SET_CONFIGURATION: w 0: 0.3
sup: a1 fe 0 0 0 0 1 0 0.1 w 1: 3030600
0.1.1.1 0.2 0.3 w 0: 2 2 w 36: 1008000 ......
说明:
1)为方便浏览起见,以上文档请以UltraEdit工具打开。
2)如果有问题,可电邮mary0515#gmail.com,共同探讨。