U盘枚举自己总结剖析.docx
- 文档编号:29495904
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:99
- 大小:519.53KB
U盘枚举自己总结剖析.docx
《U盘枚举自己总结剖析.docx》由会员分享,可在线阅读,更多相关《U盘枚举自己总结剖析.docx(99页珍藏版)》请在冰豆网上搜索。
U盘枚举自己总结剖析
插入U盘
直接拔出
安全拔出
A9列举
版本中定义了海量储存设施类(四个
独立的子类规范,即:
LinuxUSBgadget设施驱动分析
(2)---驱动调试
作者:
刘洪涛,华清远见嵌入式学院金牌讲课老师。
这一节主要把在实现“linuxU盘功能”过程中的一些调试过程记录下来,并加以分析。
一、背景知识
1、USBMassStorage类规范概括
USB组织在universalSerialBusMassStorageClassSpaceification1.1
MassStorageClass)的规范,这个类规范包含
1.USBMassStorageClassControl/Bulk/Interrupt(CBI)Transport2.USBMassStorageClassBulk-OnlyTransport
3.USBMassStorageClassATACommandBlock
4.USBMassStorageClassUFICommandSpecification
前两个子规范定义了数据/命令/状态在USB上的传输方法。
Bulk-Only规范不过使用Bulk端点传递数据/命令/状态,CBI传输规范则使用
传输
Control/Bulk/Interrupt三种种类的端点进行数据/命令/状态传递。
后两个子规范则定义了储存介质的操作命令。
ATA命令规范用于硬盘,UFI命令规范是针对USB挪动储存。
MicrosoftWindows中供给对MassStorage协议的支持,所以USB挪动设施只
需要依据MassStorage协议来组织数据和办理命令,即可实现与PC机互换数据。
而Flash的储存单元组织形式采纳FAT16文件系统,这样,便可以直接在Windows的阅读器中经过可挪动磁盘来互换数据了,Windows负责对FAT16文件系统的管理,USB设施不需要干涉FAT16文件系统操作的详细细节。
USB(Host)独一经过描绘符认识设施的有关信息,依据这些信息,成立起通信,在这些描绘符中,规定了设施所使用的协议、端点状况等。
所以,正确地供给描绘符,是USB设施正常工作的先决条件。
Linux-2.6.26内核中在利用USBgadget驱动实现模拟U盘时主要波及到file_storage.c、s3c2410_udc.c等驱动文件(这些文件的详细构造,将在下一篇文章中描绘)。
此时我们想先从这些代码中找到USB描绘描绘符,从中确立使用的储存类规范,进而确立协议。
确立通信协议是我们调试的基础。
储存类规范是由接口描绘符决定的。
接口描绘符各项的定义义以下:
此中,bInteaceClass、bInterfaceSubClass、bInterfaceProtocol判断出设施是不是储存类,以及属于哪一种储存子类和储存介质的操作命令。
在file_storage.c文件中,
能够
/*USBprotocolvalue=thetransportmethod*/
#defineUSB_PR_CBI0x00
Control/Bulk/Interrupt
#defineUSB_PR_CB0x01
interrupt
#defineUSB_PR_BULK0x50
Bulk-only
//
//Control/Bulkw/o
//
/*USBsubclassvalue=theprotocolencapsulation*/
#defineUSB_SC_RBC0x01//ReducedBlockCommands(flash)
#defineUSB_SC_8020
0x02
//SFF-8020i,MMC-2,
ATAPI(CD-ROM)
#defineUSB_SC_QIC
0x03
//QIC-157(tape)
#defineUSB_SC_UFI
0x04
//UFI(floppy)
#defineUSB_SC_80700x05
//SFF-8070i(removable)
#defineUSB_SC_SCSI
0x06
//TransparentSCSI
默的状况是:
mod_data=
{
//Defaultvalues
.transport_parm="BBB",
.protocol_parm="SCSI",
⋯⋯
默的以下:
bInterfaceClass=08表示:
存bInterfaceSubClass=0x06表示:
透明的SCSI指令
bInterfaceProtocol=0x50表示:
bulk-only
2、Bulk-Only
下边看看Bulk-Only:
(的范《UniversalSerial
BusMassStorageClassBulk-OnlyTransport》)
插入到USB后,USB即行搜寻,并要求供给相的描绘符。
在USBHost获得上述描绘符后,即达成了的配置,出Bulk-Only的MassStorage,而后即入Bulk-Only方式。
在此方式下,USB与
的所有数据均通Bulk-In和Bulk-Out来行,不再通控制端点任何数据。
在种方式下,有三种型的数据在USB和之送,CBW、CSW和
一般数据。
CBW(CommandBlockWrapper,即命令包)是从USBHost送到的命令,命令格式遵照接口中的bInterfaceSubClass所指定的命令,里SCSI命令集。
USB需要将SCSI命令从CBW中提拿出来,行相的命令,达成此后,向Host出反应目前命令行状的CSW(CommandStatusWrapper),Host依据CSW来决定能否送下一个CBW或是数据。
Host要求USB行的命令可能送数据,此需要将特定数据送出去,完后出CSW,以使Host行下一步的操作。
USB所行的操
作可用下描绘:
CBW的格式以下:
dCBWSignature:
CBW的表记,固定值:
43425355h(littleendian)。
dCBWTag:
主机发送的一个命令块表记,设施需要原样作为dCSWTag(CSW中的一部分)再发送给Host;主要用于关系CSW到对应的CBW。
dCBWDataTransferLength:
本次CBW命令要求在命令与回应之间传输的字节数。
假如为0,则不传输数据。
bmCBWFlags:
反应数据传输的方向,0表示来自Host,1表示发至Host;bCBWLUN:
对于有多个LUN逻辑单元的设施,用来选择详细目标。
假如没有多个LUN,则写
0。
bCBWCBLength:
命令的长度,范围在0~16.
CBWCB:
传输的详细命令,切合bInterfaceSubClass.中定义的命令规范,此处是SCSICSW命令格式以下:
dCSWSignature:
CSW的表记,固定值:
53425355h(littleendian)
dCSWTag:
设置这个表记和CBW中的dCBWTag一致,参照上边对于dCBWTag的解说dCSWDataResidue:
还需要传递的数据,此数据依据dCBWDataTransferLength-本次已经传递的数据获得
bCSWStatus:
指示命令的履行状态。
假如命令正确履行,bCSWStatus返回0即可。
3、SCSI指令集
Bulk-Only的CBW中的CBWCB中的内容即为以下格式的命令块描绘符(CommandBlockDescriptor)。
SCSI-2有三种字长的命令,6字节、10字节和12字节,MicrosoftWindows环境下支持12字节长的命令。
OperationCode:
操作代码,表示特定的命令。
高3位为GroupCode,共有8种组合,
即8个组,低5五位为CommandCode,能够有32种命令。
LogicolunitNumber
:
为了兼容SCSI-1而设的,此处能够不用关怀。
Logicalblockaddress
:
为高位在前,低位在后的逻辑块地点,即扇区地点。
第2
位为高位,第3、4、5
挨次为低位。
Transferlength
:
为需要从逻辑块地点处开始传输的扇区数(比方在Write
命令中)。
Parameterlistlength
:
为需要传输的数据长度(比方在ModeSense命令中);
Allocationlength
:
为初始程序为返回数据所分派的最大字节数,此值能够为零,表示不需要传递数据。
SCSI指令集的DirectAccesss种类储存介质的传输命令有很多,MassStorage协议只用到了此中的一些。
更多的SCSI指令拜见:
指令代码
指令名称
说明
04h
FormatUnit
格式化储存单元
12h
Inquiry
讨取器件信息
1Bh
Start/Stop
load/unload
55h
Modeselect
同意Host对外面设施设置参
数。
5Ah
ModeSense
向host传输参数
EhPrevent/AllowMediumRemoval
写保护
>28h
Read(10)
Host读储存介质中的
二进制数据
A8h
Read(12)
同上,可是比较详尽一
点
25h
ReadCapacity
要求设施返回目前容量
23h
ReadFormatCapacity
查问目前容量及可用空
间
03h
RequestSense
恳求设施向主机返
回履行结果,及状态数据
01h
RexeroUnit
返回零轨道
2Bh
Seek(10)
为设施分派到特定地点
1Dh
Send
Diagnostic
履行固件复位并履行
诊疗
00h
TestUnitReady
恳求设施报告能否处于
Ready状态
2Fh
Verify
在储存中考证数
据
2Ah
Write
(10)
从主机向介质写二进
制数据
AAh
Write
(12)
同上,可是比较详
细
2Eh
WriteandVerify
写二进制数据并考证
对于不同的命令,其命令块描绘符略有不同,其要求的返回内容也有所不同,依据相应的文档,能够对每种恳求作出合适的回应。
比方,下边是INQUIRY恳求的命令块描绘符和其返回内容的数据格式:
如:
INQUIRY命令描绘符:
返回数据格式
Host会挨次发出INQUIRY、ReadCapacity、UFIModeSense恳求,假如上述恳求的返回结果都正确,则Host会发出READ命令,读取文件系统0簇0扇区的MBR数据,进入文件系统辨别阶段。
4、利用USBView观察结果
可经过USBView软件查察到USB设置阶段获得到的信息。
二、出现的主要问题
在调试过程中碰到了一个问题。
现象是:
在目标板加载完驱动后,即履行完:
#insmodg_file_storage.kofile="/dev/mtdblock2"stall="0"removable="1"
后,接好USB线。
此时在windows端设施出有usbstorage设施加入,但出现不了盘符。
下边记录下调试过程。
三、调试过程
依据规范,当达成SCSI指令集中Inquiry命令时,能够出现盘符。
所以能够通
过bushound软件查察通信过程,找出原由。
下边是利用bushound工具在出现问题时收集到的数据。
DevPhaseData
InfoTimeCmd.Pha
se.Ofs
--------------------------------------------------------
-----------
26
CTL
80060001-000012
00
GET
DESCRIPTR
0us
26
DI
12011001-00000010-2505a5a4-12
030102........%.......
4.8ms
03
01..
26
CTL
80060002-000009
00
GETDESCRIPTR
14us
26
DI
09022000-010104c0-
01
........
3.9ms
26
CTL
80060002-000020
00
GET
DESCRIPTR
16us
26
DI
09022000-010104c0-01090400-00
020806
...............
4.9ms
50050705-81024000-00070502-02400000
P.....@......@..
26
CTL
80060003-000002
00
DESCRIPTR
GET
60us
26
DI
09022000-010104c0-
01
........
3.9ms
26
DI
04
03
..
3.9ms
26
CTL
80060003-000004
00
DESCRIPTR
GET
15us
26
DI
040309
04
....
3.9ms
26
CTL
80060303-090402
00
GET
DESCRIPTR
10us
26
DI
1a
03
....
4.0ms
26
CTL
80060303-09041a
00
DESCRIPTR
GET
18us
26
DI
1a033300-37003200-30003400-3100
3700..3.7.2.0.4.1.7.4.9ms
35003600-37003700-35
00
5.6
26
CTL
00090100-000000
00
SET
CONFIG
16us
26
CTL
010b0000-000000
00
SET
INTERFACE
60ms
26
CTL
a1fe0000-000001
00
CLASS
62ms
26
DI
00.
3.9ms
26
DO
55534243-0860e086-24000000-80
000612USBC.`..$.......985us
00000024-00000000-00000000-0000
00
...$...........
26
DI
00800202-1f000000-4c696e75-7820
2020
........Linux1.0ms
46696c65-2d53746f-72204761-646765
74
File-StorGadget
303331
32
0312
26
CTL
80060002-000020
00
GET
DESCRIPTR
893ms
26
DI
09022000-010104c0-0109
0400-00020806...............4.1ms
50050705-81024000-00070502-02400000
P.....@......@..
26
CTL
80060002-000020
00
GET
DESCRIPTR
2.7sc
26
DI
09022000-010104c0-01090400-0002
0806...............
4.4ms
50050705-81024000-00070502-02400000
P.....@......@..
26
USTS050000
c0
no
response
2.8sc
注意上边红色部分的代码,DO发出了55534243开始的CBW命令块,命令码
是12,即Inquiry命令。
要求目标返回Inquiry命令要求的数据,长度是0x24。
接下来设施端经过DI返回了设施信息。
依据规范,在返回完了数据后,设施端还应当经过DI向系统返回CSW的值。
但实质的捕捉内容并无。
所以致使不可以
正确出现盘符。
在file_storage.c中,发送数据时都会调用到start_transfer()函数。
在此函数中加入printk调试语句,观察现象。
发现只需加入的调试语句,windows
端便可以正常设别设施了。
于是,能够猜想是因为需要在连续两次发送之间加
上一些延时。
在函数中加入udelay(800)后,windows系统能够正常发现设施了。
详细的代码架构,将在下一遍文章中分析。
下边是程序正常后,用bushound捕捉到的数据。
红色部分,能够看出设施正确的依据规范在发送完数据后,返回CSW信息。
四、总结做好USBgadget驱动、或许USBhost驱动调试需要:
·掌握必定的知识基础
包含:
USB协议、详细的类设施规范、USB驱动程序架构、USB设施端控制器操
作等。
·合理利用调试工具。
包含:
USBview、bushound、及一些硬件USB信号剖析仪。
一、追踪USB大容量设施的实现流程
1、从main.c开始
(1)main函数的履行流程
Set_System();//设置时钟、端口等。
Set_USBClock();//设置usb的时钟
USB_Interrupts_Config();//设置中止
Led_Config();//设置所使用的到的灯。
MSD_Init();//SD卡初始化
Get_Medium_Characteristics();//获得SD块总数、每块字节数。
USB_Init();//USB_init.c供给的初始化函数。
从这里开始USB设施被
主机检测到。
while
(1)
{//USB的工作都是在中止中达成的,主履行流程什么也没做。
}
(2)与鼠标例程不同的地方
在中止配置中,使能了USB高优先级中止。
NVIC_InitStructure.NVIC_IRQChannel=USB_HP_CAN_TX_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);
用到了几个灯指示,这个我的开发板上用不到,就不详尽看了。
MSD_Init(),是对SD卡进行初始化。
该函数在msd.c中,我看了一下它的SD卡实现的代码,比我的SD函数代码整齐多了。
此后有时间要把我的USB驱动好好的整理一下。
可是此刻就先不论了。
接下来这个函数获得SD卡的容量
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 枚举 自己 总结 剖析