最近调试了uC/FS FAT16的文件系统,发现uC/FS在网上的基本上只有1.34版本的可以用,
调试时发现几个问题,
(1)定义接口函数
const FS__device_type FS__flashdevice_driver = {
"FLASH device",
_FS_FLASH_DevStatus,
_FS_FLASH_DevRead,
_FS_FLASH_DevWrite,
_FS_FLASH_DevIoCtl
};
其实也就read , write两个有用,其它return ok就好了
(2)flash_x_hw.c
int FS__FLASH_Init(FS_u32 Unit){
return Nand_init();
}
int FS__FLASH_ReadSector(FS_u32 Unit,unsigned long Sector,unsigned char *pBuffer){
return Nand_io(Sector,(unsigned int *)pBuffer,1);
}
int FS__FLASH_WriteSector(FS_u32 Unit,unsigned long Sector,unsigned char *pBuffer){
return Nand_io(Sector,(unsigned int *)pBuffer,0);
}
(3)最重要的是,heap区应足够大,要大于16K,因为分区交换时要用
int NandReadBlock(unsigned int buffer,unsigned int block)
{
int i;
unsigned int buffer_ptr,status,page;
page = block*32;
buffer_ptr = buffer;
for(i=0; i<32; i++)
{
status = NFReadPage(page, (unsigned char *)buffer_ptr);
if(status != 0) return -1;
page ++;
buffer_ptr += 512;
}
return 0;
}
int NandWriteBlock(unsigned int* buffer,unsigned int block)
{
int i;
unsigned int buffer_ptr,status,page;
page = block*32;
buffer_ptr = (unsigned int)buffer;
for(i=0; i<32; i++)
{
status = NFWritePage(page, (unsigned char *)buffer_ptr);
if(status!= 0) return -1;
page ++;
buffer_ptr += 512;
}
return 0;
}
int NandBlockToTemp(unsigned int *buffer,unsigned int block)
{
int i;
unsigned int status,page,buffer_ptr;
page = block*32;
buffer_ptr = (unsigned int)buffer;
for(i=0;i<32;i++)
{
status = NFReadPage(page, (unsigned char *)buffer_ptr);
if(status!= 0) return -1;
page++;
buffer_ptr += 512;
}
return 0;
}
int Nand_io(unsigned int page, unsigned int *buffer, int reading)
{
unsigned int i,pageoffset,blocknum;
unsigned int *swap_block,*swap_ptr;
if(reading == 1)
NFReadPage(page, (unsigned char *)buffer);
else if(reading == 0)
{
swap_block = (unsigned int *)malloc(512*32);
blocknum = page/32;
pageoffset = page %32;
swap_ptr = swap_block + 0x200*pageoffset/4;
NandBlockToTemp(swap_block,blocknum); //保存该页所在块到交换块
memcpy(swap_ptr,buffer,512); //写页数据到交换块相应的位置
NFEraseBlock(page);
for(i = 0;i < 3000; i++);
NandWriteBlock(swap_block,blocknum);
free(swap_block);
}
else return 1;
return 0;
}
(4)格式化一次就可以了,
FS_IoCtl("flash:",FS_CMD_FORMAT_MEDIA,FS_MEDIA_SMC_16MB,0);
因为我的NAND只有16M,而FS_MEDIA_NAND_xxMB只有64M的,所以就借用了一个SMC的,
(5)主要的是从网上下载下来的代码,很经典的,因为uC/FS(FAT)对于坏块的管理并没有做,所以出了坏块就要加入坏块处理代码,这部分现在还没有做好,可恶的是现在居然找不到一个带坏块的NAND,只能等等待了