Chinaunix首页 | 论坛 | 博客
  • 博客访问: 277830
  • 博文数量: 11
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 330
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-05 20:59
文章分类
文章存档

2010年(1)

2008年(10)

我的朋友

分类:

2008-03-05 17:29:15

    之前我花了1个星期的时间来做U盘,基于sbc2410开发板,没做完,以后有空再做。
    要想实现一个U盘,必须了解USB设备协议、Mass Storage Class的UFI协议、FAT文件系统相关知识,这样PC端就会认出一个U盘,和普通的盘无异。大致分3步:
 
1、USB设备的枚举。涉及到基本的枚举命令,可以发现新硬件和类型,是Bulk-Only传输方式的Mass Storage设备,此过程是基于控制断点EP0。
 
2、UFI命令的答复。有三种数据包格式,分别是CBW(OUT)、CSW(IN)、普通数据Data。其中,设备需从CBW包中解析出相关的UFI命令,并做相应处理,可能涉及相关Data,然后发回CSW包作为一个命令应答的结束。此过程是基于传输端点Bulk-Out和Bulk-In。
    在我的程序里出现了以下命令:INQUIRY(0x12)、READ_FORMAT_CAPACITY(0x23)、READ_CAPACITY(0x25)、READ_10(0x28)、MODE_SENSE(0x1a)、TEST_UNIT_READY(0x00)、REQUEST_SENSE(0x03)、WRITE_10(0x2a)、VERIFY(0x2f),可能还会有其他,我还没最终调试完成。
 
3、FAT文件系统结构。我的程序用的是FAT16(因为盘的容量小)。做出的U盘的逻辑空间必须按照FAT文件系统的要求依次存放MBR(DBR)区、FAT区(两张FAT表)、Directory区、Data区,具体空间分配如下:
 LBA  Block/Page  Length  Content
 0  0,0  512Bytes  MBR=BPB + Excutable Code + 55aaH
 1 - 2H  0,1 - 0,2  1024Bytes  FAT table
 3 - 4H  0,3 - 0,4  1024Bytes  FAT table(backup)
 5 - 39H      Directory
 40H -      DATA
我设置的每个扇区大小和Nand flash的page是一样,512Bytes。

PS:
    匆忙总结。程序已经调到TEST_UNIT_READY,用Bus Hound查看始终是RSET,调了一天没通过,可能是Nand flash读写有问题,或是UFI应答的个别数据配置错了,等等,还望大家赐教,欢迎交流。郁闷,以后有空再调。。。

阅读(2812) | 评论(2) | 转发(0) |
0

上一篇:没有了

下一篇:基于SPI总线的SD卡驱动总结

给主人留下些什么吧!~~

chaojisaiche2008-06-08 17:18:03

我刚好有一些问题,想请教您一下。我在做U盘存储控制器的开发,采用的arm9+linux开发Usb主控器,在应用程序层面,我将数据使用write+fsync写入U盘(sandisk),但是经过测试发现,一般来说每次存200字节的数据只需几ms,但是有时会出现将近200ms的问题,检测USB总线的信号 发现主要是由于这段时间,U盘没有准备好接受(发送)数据因此一直会nak,而我这边的hc在一直重发所致。 因此,我判断是当每次写入200字节并且是强制写入U盘的时候,U盘写入速度不稳定(测试:每次存200字节共存储1亿字节会出现300多次超过150ms的现象),但是当我以每次写入1024字节时,U盘写入速度会相对稳定许多(测试:每次存1024字节共存储1亿字节会出现2-3次超过150ms的现象)。后发现凡是不是以1024倍数写入的话都会有此问题。 请问这是为什么,nandflsh会出现写入速度不稳定的情况吗,那近200ms的时间究竟是怎么出现的呢,请您不吝赐教。

chinaunix网友2008-04-29 10:24:04

兄弟,我也是调试到TEST_UNIT_READY,然后回复了CSW后,就一直没有中断过来.现在有没有新的进展,能否赐教,谢谢!(QQ:41428579)