uboot之u盘枚举

来源:互联网 发布:class反编译成java 编辑:程序博客网 时间:2024/05/01 00:59

              UBOOT U盘枚举

简单的说下U盘的枚举过程,一下是我的U盘的枚举截图

 

 

在接口描述符,09 04 00 00 03 08 06 50 00,其后为三个端点描述符

030端点的数目 两个批量传输 一个interrupt

08 接口所使用的类为mass storage

06 子类为SCSI命令集

50 协议为批量传输

接着与U盘有关的就是从GET MAX LUN开始,返回长度为0001

a1 fe 00 00 00 00 01 00返回的00表示有1块逻辑块

接下来显示的是批量传输协议的数据流模型(封装UFI

需要明白CBWCSW结构,这里就不详细介绍,简单说明

0x43425355 CBWCSW的标志

0x85ca3cd8为主机分配的CBW签名,CSW返回也需要此值

0x00000024为请求的长度,36字节

80 D7表示传输数据方向 1IN 0OUT

00 低四位表示使用LUN

06 低五位表示返回的CBWCB长度 不足16字节补0

后面的16字节根据选择的子类(这里是SCSI命令集,实际上使用UFI

CSW就不分析了,总体而言,就是UFI命令被CBW封装,解析UFI之后,返回对应数据,最后以CSW(最后一个字节00表示传输成功)结束一次批量数据传输。

UFIUSB 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来进行的。

 

原创粉丝点击