原创 USB Mass Storage 学习笔记(4)

2008-7-1 07:50 9733 14 11 分类: 通信

本文PDF文档下载


接着上节的SCSI 命令。


<!--[if !supportLists]-->     <!--[endif]-->READ10)(Opcode 28h


READ(10)命令定义了设备服务器读指定的逻辑块(Logical blocks)并且将数据发送到Data-In 缓冲区。READ(10)命令是在第18和第19字节定义了TRANSFER LENGTH10字节的CBWCB。(参考:“SCSI Command and Data Format”)。TRANSFER LENGTH定义了数据的连续逻辑块的数量。


<!--[if !supportLists]-->     <!--[endif]-->WRITE10)(Opcode 2Ah


<!--[if !supportLists]-->     <!--[endif]-->REQUEST SENSE6)(Opcode 03h<?xml:namespace prefix = o />


<!--[if !supportLists]-->     <!--[endif]-->MODE SENSE6)(Opcode 1Ah


<!--[if !supportLists]-->     <!--[endif]-->PREVENT ALLOW MEDIUM REMOVALOpcode 1Eh


<!--[if !supportLists]-->     <!--[endif]-->TEST UNIT READYOpcode 00h


<!--[if !supportLists]-->     <!--[endif]-->VERIFY10)(Opcode 2Fh


<!--[if !supportLists]-->     <!--[endif]-->START/STOPOpcode 1Bh


不支持的命令


如果CBWCB中的命令操作码是不支持的,SENSE KEY被设为无效请求,表示CDB中有无效的参数。


MASS STORAGE 设备(MSD)固件


本固件实现了一个支持SD卡的USB Mass Storage 设备。当插入USB口后,固件将SD卡枚举为可移动磁盘而且允许用户执行磁盘驱动的所有功能。用户可以像操作任何可移动磁盘一样的写,读,编辑和删除 MSD上的文件。本应用也允许用户将SD卡格式化为下列的FAT文件格式:FAT16FAT32NTFS。固件通过读取SD卡的CSD 寄存器(Card Specific Data)计算SD卡的容量。这些信息通过响应READ CAPACITY命令将SD卡容量信息返回给PC 主机。磁盘的准确容量可以通过观察PC上的磁盘属性获得。


FW目录结构


(frm注:全部的Firmware可以从Microchip的网站下载。)


http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en024394




6显示了MSD应用的FW的目录结构。


90edadfd-fa04-4906-be50-3bc305a98105.JPG



函数功能描述


1和表2msd.csdcard.c文件中的函数进行了描述。


点击看大图


点击看大图


内存管理


数据内存的Data Bank 47被映射到特定的双口RAM(见例程2)。当USB模块被禁用时,这些Bank中的通用功能寄存器(General Purpose Registers GPRs)也可像数据内存空间中的其它BankGPRs一样使用。当USB模块有效后,内存中的这些Bank被分配为USB操作的缓冲RAM。这些区域由MCU的核与SIE共享,用于两者之间的数据交换。注意,链接器的脚本已经将MSD定义为512字节的单数据Bank512字节 msd_buffer已经在MSD数据Bank中定义了(见例程1)。

3f6987a5-c8dd-42f8-8f34-a2abac813ba3.JPG


7显示了包括端点缓冲的完整的内存映射。

48ba3ca3-af5b-4522-b713-5c63faa395f3.JPG


FW描述


8显示了FW中各文件间的相互关系。USB框架文件的更详细描述可以通过PICDEM FS USB演示板的用户指南获得。本AN仅注重USB Mass Storage应用和SD 卡通信。

点击看大图


USB请求可以分为标准请求或类相关请求。USB标准请求由USBCheckStdRequest()函数处理。它负责处理USB2.0规范的第9章描述的标准请求。Msd.c中的固件负责处理USB Mass Storage类规定的请求。如果有USBCheckStdRequest()不能处理的请求,它会调用USBCheckMSDRequest()函数。USBCheckMSDRequest()函数判断请求是否是一个类相关请求。(SetupPkt.RequestType==CLASS)而且SetupPkt.bRequest==FFhBulk-Only Mass Storage Reset)或FEhGet Max LUN)。如果收到了Bulk-Only Mass Storage Reset请求,FW清除STALL状态并且开始初始化Endpoint1Get Max LUN请求的响应是包含设备支持的最大LUN数的一个字节。例如,如果设备支持3LUN,那么LUN的序号为0~2,而且返回‘<?xml:namespace prefix = st1 />2。本应用中,LUN1,所以返回值为‘0


Usb9.c主要处理USB枚举过程。USBStdSetCfgHandler()函数处理SET_CONFIGURATION请求。这个函数调用函数MSDInitEP()。函数MSDInitEP()配置并初试化一个Bulk-In和一个Bulk-Out端点。


Main.c文件中的main()函数实现一个无限循环来执行两个不同的任务-USBMass Storage应用任务。USB任务由USBDriverService()函数来处理。它负责处理全部的USB硬件中断。Mass Storage任务由ProcessIO()函数处理。


frm注:main()函数的代码及说明)


void main(void)


{


    InitializeSystem();


    while(1)


    {


          USBTasks();         // USB Tasks—此处调用了USBDriverService()函数


        ProcessIO();        // See msd.c & msd.h


    } //end while


}//end main


 


ProcessIO()函数是mass storage 与端点1通信的核心。图9显示了ProcessIO()函数的流程。

点击看大图


当端点1被初始化后,MSD_State被设置为MSD_WAITFW基本上是在等待Endpoint1接收CBW。如果接收到一个有意义的CBW,就要将CSW的数据准备好。基本上是将CBW中的dCBWTag拷贝到CSWdCSWTag中,并将dCSWSignature设置为“53425355h”。读取Direction位来判断数据传输的方向(例如,从主机到设备或相反)并将MSD_State设置为MSD_DATA_OUTMSD_DATA_IN(详见图10)。

点击看大图

这篇够长,争取下一篇将这个AN学完。就要进入实际的USB Mass Storage开发的实验了。
待续...................
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户137871 2009-5-31 15:30

您好,现在正在学USB,“SCSI Command and Data Format”文档一直没有找到,能否麻烦发一份到邮箱里,先谢了。EMAIL:longji_sd@163.com
相关推荐阅读
用户1316725 2010-11-18 08:35
轻松绑定工控主板的隐盾系列DOM电子盘
       经过2年多的研发,我公司正式推出隐盾系列DOM电子盘,并成功取得专利。隐盾系列DOM盘,除了支持从128MB~8G的容量外。它的最大特点是能够使DOM盘与工控主板1对1的绑定。目前,很多...
用户1316725 2010-07-01 07:39
《电子技术专业基础与实务》中级 复习资料
职称考试资料不好找呀,共享给大家!个人经验,多看晶体管部分和传感器原理部分,惠更斯电桥,JK/RS触发器,卡诺图等。希望大家都能顺利通过,看资料通过了的XDJM可要记得把本贴顶起来呀! 《电子技术专业...
用户1316725 2009-12-17 11:21
民间统计S3C2410/S3C2440出货情况 强贴大家顶起来吧。
p>今天在测试中发现,LPC2300的RTC时钟断电后,再重新加电,时间不走。网上有很多评论,也有类似的问题。不过,我把程序改了一下就可以了。程序如下(错误的程序):void RTC_Init(...
用户1316725 2009-12-14 09:09
SDIO卡初始化不过的调试笔记
前一段时间去了趟上海. 说是在客户平台上SDIO接口不正常,卡初始化不过.到了现场,先用示波器对各路电源和复位时序进行了检查.都没啥问题.然后,单步跟到发送SD CMD0(Reset)命令,发现卡的状...
用户1316725 2009-10-11 16:43
STM32上应用uCOSII学习笔记(2)
STM32上应用uCOSII学习笔记(2) 本文全文下载 2009.10.814611.pdf STM32F103xx用户手册学习STM32F103xx系列芯片能够做到Pin to Pin,软件和特性...
用户1316725 2009-10-07 09:56
LM3S3748的评估及开发过程之感触
LM3S3748的评估及开发过程之感触 注:本文仅代表本人的评估观点!类似“无责任书评”吧。本文全文下载 最近,有几个设计项目需求都是要求在嵌入式项目中实现USB Device或USB Host功能的...
我要评论
1
14
关闭 站长推荐上一条 /3 下一条