使用ARM-LPC3131上的nandflash实现U盘模式心得(一)
项目是基于NXP的LPC3131的,之前实现了NANAFLASH启动的BOOTLOADER,使用的KEIL,话说NANDFLASH的自启动让我头疼了许久,不过最总还是实现了,感觉这个CODing的过程真是令人烦躁。言归正传,现在想继续实现通过USB传输来读写NANDFLASH,也就实现U盘模式。
实现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区,具体空间分配如下:
sector | Block/Page | Length | Content |
0 | 0,0 | 512Bytes | DBR=BPB + Excutable Code + 55AAH |
1-32 | 1,0-1,31 | 16k | FAT table |
33-64 | 2,0-2,31 | 16k | FAT table(backup) |
65-96 | 3,0-3,31 | 16k | Directory |
97-MAX | 4,0-MAX |
| DATA |
今天先记录这些,后面有时间再写哦。。。