原创 U盘实现过程简单分析

2010-4-27 16:41 5105 18 18 分类: MCU/ 嵌入式

<?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个字节:主要表明命令执行的状态。


 


3UFI命令集


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)底层库文件


与鼠标例程一样,还是5c源文件,8个头文件。


 


2)上层协议实现文件


除了鼠标例程有的:hw_config.cusb_pwrusb_istr.cusb_desc.cusb_prop.c5个文件之外,又加了usb_endp.cusb_bot.cusb_scsi.cscsi_data.cmemory.cmsd.c6个文件。


Hw_config.c实现硬件配置,主要由主程序调用。Usb_pwr.c实现usb电缆的连接与断开、挂起与唤醒的处理。Usb_istr.c主要实现中断类别和中断例程调用。Usb_desc.c主要是实现特定设备类所需要的描述符。Usb_prop.c主要实现特定设备类请求和控制传输过程的用户回调函数。


 


3)新文件作用的简单认识


先把各个源文件粗略浏览一遍,了解它们的大概用途。


Usb_endp.c非常简单,就两个函数,分别处理端点1IN和端点2OUT


 


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条评论)

登录后参与讨论
我要评论
0
18
关闭 站长推荐上一条 /2 下一条