U盘枚举(自己总结范文)
插入U盘
魏晨打电话给初恋直接拔出
安全拔出
A9枚举
这一节主要把在实现“linu某U盘功能”过程中的一些调试过程记录下来,并加以解析。
一、背景知识
京东白条1、USBMaStorage类规范概述
USB组织在univeralSerialBuMaStorageClaSpaceification1.1版本中定义了海量存储设备类(MaStorageCla)的规范,这个类规范包括四个
独立的子类规范,即:
Control/Bulk/Interrupt三种类型的端点进行数据/命令/状态传送。后两个子规范则定义了存储介质的操作命令。ATA命令规范用于硬盘,UFI命令规范是针对USB移动存储。MicrooftWindow中提供对MaStorage协议的支持,因此USB移动设备只需要遵循MaStorage协议来组织数据和处理命令,即可实现与PC机交换数据。而Flah的存储单元组织形式采用FAT16文件系统,这样,就可以直接在Window的浏览器中通过可移动磁盘来交换数据了,Window负责对FAT16文件系统的管理,USB设备不需要干预FAT16文件系统操作的具体细节。
USB(Hot)唯一通过描述符了解设备的有关信息,根据这些信息,建立起通信,在这些描述符中,规定了设备所使用的协议、端点情况等。因此,正确地提供描述符,是USB设备正常工作的先决条件。2022中秋节祝福语
Linu某-2.6.26内核中在利用USBgadget驱动实现模拟U盘时主要涉及到
file_torage.c、3c2410_udc.c等驱动文件(这些文件的具体结构,将在下一篇文章中描述)。此时我们想先从这些代码中到USB描述描述符,从中确定使用的存储类规范,从而确定协议。确定通讯协议是我们调试的基础。存储类规范是由接口描述符决定的。接口描述符各项的定义义如下:
其中,bInteaceCla、bInterfaceSubCla、bInterfaceProtocol可以判断出设备是否是存储类,以及属于哪种存储子类和存储介质的操作命令。在file_torage.c文件中,
/某USBprotocolvalue=thetranportmethod某/
#defineUSB_PR_CBI0某00//Control/Bulk/Interrupt#defineUSB_PR_CB0某01//Control/Bulkw/ointerrupt#defineUSB_PR_BULK0某50//Bulk-only
/某USBubclavalue=theprotocolencapulation某/
#defineUSB_SC_QIC0某03//QIC-157(tape)#defineUSB_SC_UFI0某04//UFI(floppy)
#defineUSB_SC_80700某05//SFF-8070i(removable)#defineUSB_SC_SCSI0某06//TranparentSCSI
默认的情况是:
mod_data={//anport_parm=\.protocol_parm=\
默认的赋值如下:
郑元畅林依晨bInterfaceCla=08表示:存储类
bInterfaceSubCla=0某06表示:透明的SCSI指令bInterfaceProtocol=0某50表示:bulk-only传输
2、Bulk-Only传输协议
下面看看Bulk-Only传输协议:(详细的规范请阅读《UniveralSerialBuMaStorageClaBulk-OnlyTranport》)
设备插入到USB后,USB即对设备进行搜索,并要求设备提供相应的描述符。在USBHot得到上述描述符后,即完成了设备的配置,识别出为Bulk-Only的MaStorage设备,然后即进入Bulk-Only传输方式。在此方式下,USB与设备间的所有数据均通过Bulk-In和Bul
k-Out来进行传输,不再通过控制端点传输任何数据。
CBW的格式如下:
dCBWSignature:
CBW的标识,固定值:43425355h(littleendian)。dCBWTag:
主机发送的一个命令块标识,设备需要原样作为dCSWTag(CSW中的一部分)再发送给Hot;主要用于关联CSW到对应的CBW。dCBWDataTranferLength:
本次CBW命令要求在命令与回应之间传输的字节数。如果为0,则不传输数据。bmCBWFlag:
反映数据传输的方向,0表示来自Hot,1表示发至Hot;bCBWLUN:
对于有多个LUN逻辑单元的设备,用来选择具体目标。如果没有多个LUN,则写
0。
bCBWCBLength:
命令的长度,范围在0~16.
CBWCB:
传输的具体命令,符合bInterfaceSubCla.中定义的命令规范,此处是SCSICSW命令格式如下:医保缴费
dCSWSignature:
CSW的标识,固定值:53425355h(littleendian)dCSWTag:
设置这个标识和CBW中的dCBWTag一致,参照上面关于dCBWTag的解释dCSWDataReidue:
还需要传送的数据,此数据根据dCBWDataTranferLength-本次已经传送的数据得到
bCSWStatu:
指示命令的执行状态。如果命令正确执行,bCSWStatu返回0即可。3、SCSI指令集
OperationCode:
为了兼容SCSI-1而设的,此处可以不必关心。Logicalblockaddre:
为高位在前,低位在后的逻辑块地址,即扇区地址。第2位为高位,第3、4、5依次为低位。
Tranferlength:
为需要从逻辑块地址处开始传输的扇区数(比如在Write命令中)。Parameterlitlength:
为需要传输的数据长度(比如在ModeSene命令中);Allocationlength:
为初始程序为返回数据所分配的最大字节数,此值可以为零,表示不需要传送数据。
徐子淇面相分析
发布评论