使用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
今天先记录这些,后面有时间再写哦。。。