uC/FS调试笔记

最近调试了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,只能等等待了


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值