UBOOT 之U盘枚举
简单的说下U盘的枚举过程,一下是我的U盘的枚举截图
在接口描述符,09 04 00 00 03 08 06 50 00,其后为三个端点描述符
03非0端点的数目 两个批量传输 一个interrupt
08 接口所使用的类为mass storage
06 子类为SCSI命令集
50 协议为批量传输
接着与U盘有关的就是从GET MAX LUN开始,返回长度为0001
a1 fe 00 00 00 00 01 00返回的00表示有1块逻辑块
接下来显示的是批量传输协议的数据流模型(封装UFI)
需要明白CBW和CSW结构,这里就不详细介绍,简单说明
0x43425355 为CBW和CSW的标志
0x85ca3cd8为主机分配的CBW签名,CSW返回也需要此值
0x00000024为请求的长度,36字节
80 D7表示传输数据方向 1为IN 0为OUT
00 低四位表示使用LUN
06 低五位表示返回的CBWCB长度 不足16字节补0
后面的16字节根据选择的子类(这里是SCSI命令集,实际上使用UFI)
CSW就不分析了,总体而言,就是UFI命令被CBW封装,解析UFI之后,返回对应数据,最后以CSW(最后一个字节00表示传输成功)结束一次批量数据传输。
UFI(USB Floppy Interface)命令集介绍
(1) INQUIRY 查询U盘信息
发送:
12 00 00 00 24 00 00 00 00 …
12为 UFI INQUIRY操作码
00 D7~D5 逻辑单元号,0
24 为返回的数据分配的存储空间长度 36字节(前面请求的最大长度也不能超过36字节)
返回的数据具体看文档
内容包括外设类型,存储介质是否可移除,厂商信息,产品信息,产品版本信息(1.00 信息均为ACSII)
(2) READ FORMAT CAPACITIES 读取可格式化容量
发送: 23 00 00 …00 fc 00…
23为 read format capacities 主机读取可能的格式化容量的列表
00fc 分配的缓冲区长度252
返回的数据:
00 00 00 08 00 1e bf fe 02 00 02 00
08 表示容量列表的长度
001ebffe 高字节在前 表示块数
02 描述符代码
000200 高字节在前 每块字节数512字节
容量=块数*每块字节数
(3) READ CAPACITY 读取可用的最大容量
发送:25 00 …
25为 操作码 读取可用容量
返回: 00 1e bf fe 00 00 02 00
001ebffe 最后逻辑块地址
(与可格式化容量一样表示没有其他块用作他用)
00000200 块大小 512字节
(4) READ(10)
28 00 …01.
28 为READ(10)操作码 逻辑块的地址为00000000 01为传输长度
就是读取以逻辑地址为起始地址,长度为1的块的内容
返回: 对应块的内容
(5) WRITE(10)
命令和(4)类似,略,操作码为0x2A
(6) REQUEST SENSE 用于探测上一个命令执行失败的原因
(7) TEST UNIT READY 用来检测设备的某个逻辑单元是否准备好
对于U盘的操作,就是基于这些UFI来进行的。