1.nandflash初始化
包含两部分:1.位宽等、延时与cpu无关的参数设置;2.与cpu有关的引脚初始化。(可直接参考例程)
2.文件系统格式化
1.首先分为两个区,用户区和系统区。 0:用户区; 1:系统区
2.坏块管理:擦除块,并建立逻辑块到物理块的转换表 vtable,逻辑分区小于物理分区,因为可能存在坏块。
3.将转换表保存在数据区
4.挂载用户区 f_mount(0, &usrfs); -> FatFs[vol] = fs;
5.创建用户区文件系统 f_mkfs(0, 0, 4096); ->disk_write -> nand_flash_write(nand_usr, sector, temp, count);根据分区选择不同资源,进而操作不同分区。
void nand_flash_create_fs(void)
{
int i;
int block = 1;
unsigned char ret = 0;
unsigned char buff[2048] = {'F','O','R','M','A','T',};
ret = NF_EraseBlock(0); //擦除第一个块
if (ret&0x1)
{
printf("Block 0 is error\r\n");
return;
}
vtable[0] = 0; //转换表
for (i=1; i<BLOCK_NUM_TOTAL; i++)
{
ret = NF_EraseBlock(i<<6);
if (ret&0x1)
{
continue; //坏块就跳过
}
vtable[block] = i; //块转换表,逻辑块block对应物理块i(好块)
block++;
if (block > BLOCK_NUM_SYS+BLOCK_NUM_USR+1)
{
break;
}
}
block = 0;
for (; i<BLOCK_NUM_TOTAL; i++)
{
ret = NF_EraseBlock(i<<6);
if (ret&0x1)
{
continue;
}
goodblock[block] = i; //系统空间和用户空间外的剩余好块
block++;
}
//以下都存放在系统区,未被格式化文件系统。读取和写入都不经过文件系统而直接读写。
NF_WritePage(0, buff); //格式化后标记
NF_WritePage(1, (unsigned char*)vtable); //保存转换表
NF_WritePage(2, (unsigned char*)(vtable+1024));
NF_WritePage(3, (unsigned char*)goodblock);
printf("Write block system ok\r\n");
/*
分区:0表示用户区,1表示系统区
*/
ret = f_mount(0, &usrfs); //挂载文件系统,用户区
if (ret)
{
printf("Error: mount user fs!(%d)\r\n", ret);
ret = 0;
}
/*创建文件系统,0:逻辑驱动器号(用户区);0:格式化方式; 4096:簇大小,最小存储空间
*/
ret = f_mkfs(0, 0, 4096);
if (ret)
{
printf("Error: make user file system!(%d)\r\n", ret);
ret = 0;
}
printf("after make fs\r\n");
}