WinCE5.0 SMDK2410 BSP在GEC2410开发板上的移植(18)-Nand Flash驱动(FMD)及其简析(1)

CE下的Nand Flash使用了很多,eboot存储及其配置信息到Nand,CE Image存储到Nand, Nand上实现BINFS和FAT分区.这些都离不开Nand驱动的支持.在SMDK2410的BSP提供了FMD,编译成库和dll供eboot和OS调用.在直接移植到GEC2410开发板时,并不能正常使用,特别是erase的时候.经检查后发现需要增加了一些Nand命令才能正常完成操作.也许原来针对的Nand Flash命令或运行模式有所区别.GEC2410上用的K9F1208(64MB)的Nand Flash.之前的文章一直没有提及,接下来就对FMD库,Nand操作,以及针对K9F1208的修改作下详细介绍.

该驱动位于/SRC/COMMON/SMARTMEDIA, 文件夹FMD里的是Nand驱动代码,编译为Lib;DLL目录里只有source文件和def文件,source文件使用前面的lib库编译成dll,def文件定义了导出函数.在eboot里面使用的就是库smflash_lib.lib,而在CE下使用的就是smflash.dll.

2410的NAND控制器有6个寄存器,分别是NFCONF(配置寄存器),NFCMD(命令寄存器),NFADDR(地址寄存器),NFDATA(数据寄存器),NFSTAT(状态寄存器),NFECC(错误校准寄存器),寄存器详细定义可参考2410的datasheet.
K9F1208的命令如下图:

在nand.h我们定义为:

其中CMD_STATUS和VALIDADDR原来的文件中没有定义,而实际上我们是需要用这两个命令的,后面可以看到.
以下是K9F1208的配置信息, 1个Block有32个Page,每个Page512字节.


我们的FMD的NAND驱动是个标准的流接口驱动,我们来看看具体实现:
1.寄存器操作函数
这里定义了如何读写NAND寄存器,如命令,地址,数据,状态,复位等.

2.读写数据
这几个函数是在nand.s中汇编实现,进行了读写Page数据和PageInfo的操作,之后在详细分析.

3.ReadFlashID
ReadFlashID在eboot里会被调用来检测Nand是否初始化成功.
具体时序如datasheet所述.


4.IsBlockBad
IsBlockBad用来判断指定的Block是否是坏块.坏块信息存储在每个Block第一第二个Sector(Page)的16个字节的保留区,其中坏块状态就在第6个字节,通过READ2命令读取,如果为FF则为坏块.该函数被FMD_GetBlockStatus调用.
判断过程流程图如下:

具体实现代码:

5.MarkBlockBad
MarkBlockBad用来标记坏块,在erase一个block失败后,用来标记该块为坏块,这样下次用IsBlockBad判断时就能指定该块是否是坏块了.就是通过标记保留区第6个字节为0,这样IsBlockBad就通过该字节判断块的好坏了.该函数被FMD_SetBlockStatus调用.
对应的写操作流程图,之后写数据的流程也是一样的:

MarkBlockBad:

6.FMD_GetInfo
FMD_GetInfo用来获得该Nand的信息,如类型,Sector大小,Block大小等,直接赋值给PFlashInfo即可.

7.FMD_GetBlockStatus
FMD_GetBlockStatus用来获取Block的状态,看是否是Bad Block,读取sectorInfo获得其他状态信息,如是否只读等代码,用到的FMD_ReadSector后面在介绍,代码如下:

8.FMD_SetBlockStatus
FMD_SetBlockStatus用来设置Block状态,如在Erase Block失败后调用,用来标记坏块.还可以设置sectorInfor信息,用到的FMD_WriteSector同样在后面介绍.代码如下:

下一篇就来介绍dll的导出函数,也就是对应的流接口函数.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值