<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一、U盘实现过程分析
1、资源需求
(1)一个接口
指明接口类、子类、协议字段。使用批量端点输入、输出。
(2)端点描述符
两个:一个输入、一个输出。
(3)支持类特殊请求
两个请求:Get Max LUN 和 Bulk_Only Mass Storage Reset请求。
2、数据传输过程分析
(1)数据传输发生在批量端点
传输的过程跟控制传输差不多,先由主机发出命令、设备解析命令(如果主机输出,则准备接收数据;如果主机要获取数据,则要将数据准备好)、设备返回命令执行情况。
(2)命令数据包
头部15字节:说明数据方向、传输长度。
命令从15开始,最大长度可为16个字节。
(3)状态包
共13个字节:主要表明命令执行的状态。
3、UFI命令集
(1)查询命令
12个字节,操作代码0x12。
设备应该返回36字节,有了这个信息后,主机方可以确定该磁盘是否可移除。
(2)读格式化容量
12个字节,操作代码0x23。
应该返回12个字节,主要包括块数、每块字节数。
(3)读容量
12个字节,操作代码0x25。
返回8个字节,设备的实际容量。
(4)读命令
12个字节,操作代码0x28。代码中主要包括逻辑块地址、传输长度。
然后主机不停的发IN,直到读完所需数据。
再获取命令执行状态。
(5)写命令
12个字节,操作代码0x<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2A。
其它跟读差不多。
二、ST的“Mass Storage”结构分析
1、程序静态结构分析
(1)底层库文件
与鼠标例程一样,还是5个c源文件,8个头文件。
(2)上层协议实现文件
除了鼠标例程有的:hw_config.c、usb_pwr、usb_istr.c、usb_desc.c、usb_prop.c等5个文件之外,又加了usb_endp.c、usb_bot.c、usb_scsi.c、scsi_data.c、memory.c、msd.c等6个文件。
Hw_config.c实现硬件配置,主要由主程序调用。Usb_pwr.c实现usb电缆的连接与断开、挂起与唤醒的处理。Usb_istr.c主要实现中断类别和中断例程调用。Usb_desc.c主要是实现特定设备类所需要的描述符。Usb_prop.c主要实现特定设备类请求和控制传输过程的用户回调函数。
(3)新文件作用的简单认识
先把各个源文件粗略浏览一遍,了解它们的大概用途。
Usb_endp.c非常简单,就两个函数,分别处理端点1的IN和端点2的OUT。
Usb_bot.c是一个非常重要的源文件,可以说大容量设备类的主要工作是由它完成的。Bot的意思是Bulk-Only type,在近批量传输协议下,命令的传送也是由批量端点完成的。
实现了六个函数:处理输入、处理输出、解析命令、取消传输、准备传输、设置状态。
Usb_scsi.c主要是实现具体UFI命令的处理,像读扇区、写扇区、读容量等命令的处理过程都是在这里完成的。
Scsi.c主要是保存一些数据。向主机的读容量等命令,返回数据具有确定的格式,都放在这个文件里。
Memory.c主要实现三个函数:读存储区、写存储区和地址管理。
Msd.c主要实现SD卡的操作。
2、执行流程模拟
当然,这个执行流程的模拟是基于我对U盘实现过程的理解,有些地方不一定正确。
(1)初始化
这个初始化是指USB电缆接通之前,先要设置IO、设置时钟、设置中断,然后对USB接口模块和寄存器模块进行初始化,然后接通USB电缆。
(2)在复位中断中
根据鼠标例程的做法,在复位中断中,将会使能端点0。同时对需要使用的端点进行类型和描述符表的初始化。那么在U盘实现时,应该要使用两个端点寄存器,初始化为批量传输模式,且为双缓冲工作方式。
(3)进入枚举阶段
经过获取设备描述符、配置描述符、字符串描述符,主机知道了这是一个大容量设备以及它所采取的协议。
然后主机加载相应的驱动程序,给出类特殊请求,获取逻辑盘号,在PC上显示磁盘。让设备准备好接受UFI命令。
(4)进入信息获取阶段
在用户读取盘内文件之前,主机先要获得磁盘的容量、文件系统格式等信息。这个信息是在批量端点上获得的。
主机利用批量输出端点发出命令信息,设备再批量输出端点中断中得到命令,经过解码,然后根据主机的要求在批量输入端点缓冲区,准备号主机所需要的信息。
主机通过批量输入端点获得信息后,在数据传输的最后一次中断中,设备又准备好命令执行的状态信息。等到主机获取该状态信息后,一次命令执行就算是完成了。
文章评论(0条评论)
登录后参与讨论