walnutcy

STM32/D12 U盘是如何枚举成功的? (原创)

0
阅读(3433)

这里给出的两个设备枚举过程,

差别在于STM32已经实现完善,BOT和SCSI协议均实现,且可以当一个读卡器使用;而基本D12的U盘仅仅是实现的枚举相关部分,BOT和SCSI协议未实现;先看下SETUP数据包的格式吧,都为8个字节长,具体定义如下诸表:

 

Table 9-3. Standard Device Requests

没有废话,下面就分析下在枚举的过程中PC机发给Device的数据,

=======================================

STM32 USB Data

//  这里的数据都是PC机发送给Device器件的

80 06 0001 0000 0040  => GET_DESCRIPTOR,

// 因为设备描述符的长度不等,这里取一包用以更具体地判断,

00 05 0100 0000 0000  => SET_ADDRESS, Device的地址设置为0010

80 06 0001 0000 0012  => GET_DESCRIPTOR, 取Device描述,

// 注意,这里的18字节长,是第一次取设备描述时Device告诉PC的。

80 06 0002 0000 0009  => GET_ DESCRIPTOR , 取Configuration 的Initial描述,

// 注意,这里的主要目的在于得到Device的配置信息的确切长度,便于后边应用。// 在建立过程中,有多处都是有两次取设备相关描述信息的,两处都只是长度不同,详加注意就会发现,后面的那个长度才是我们写的Device固件中的实际长度.

80 06 0003 0000 00FF  => GET_ DESCRIPTOR , 取String描述,

80 06 0303 0904 00FF  => GET_ DESCRIPTOR , 取String的第3个描述,

// 注意,0904是language ID, PC是在上一次取String描述时得到的,后边的同。

80 06 0002 0000 00FF  => GET_ DESCRIPTOR , 取Configuration 的完整描述,

80 06 0006 0000 000A

80 06 0003 0000 00FF

80 06 0203 0904 00FF

80 06 0003 0000 00FF

80 06 0203 0904 00FF

80 06 0001 0000 0012

80 06 0002 0000 0009

80 06 0002 0000 0020

80 06 0003 0000 0002

80 06 0003 0000 0004

80 06 0303 0904 0002

80 06 0303 0904 001A

00 09 0100 0000 0000  => SET_CONFIGURATION 为第1个

A1 FE 0000 0000 0001
D12 USB Data //  这里的数据都是PC机发送给Device器件的

//=======================================

Serial Baud rate is 57600

Build date : Oct 22 2008 - 09:41:09

type ? for help

\>Find Pdiusbd12, chip id = 0x1210

80060001-00004000

00050100-00000000

80060001-00001200

80060002-00000900

80060002-0000FF00

80060001-00001200

80060002-00000900

80060002-00002000

00090100-00000000

A1FE0000-00000100

A1FE0000-00000100

A1FE0000-00000100

80060001-00004000

00050200-00000000

80060001-00001200

80060002-00000900

00090100-00000000

80060001-00004000

00050100-00000000

80060001-00001200

80060002-00000900

00090100-00000000

80060001-00004000

00050200-00000000

80060001-00001200

80060002-00000900

00090100-00000000