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

接下来我们来看看对应的流接口驱动函数:
1.FMD_Init
FMD_Init进行了NAND控制器的初始化,复位Nand Flash(使用CMD_RESET命令),读FlashID看是否成功.具体参数命令见如下代码:
附上复位的时序图:

代码及注释如下:

2.FMD_EraseBlock
FMD_EraseBlock用来擦除单个Block块.使用CMD_ERASE,CMD_ERASE2命令,命令流程如下图:

时序图请参考datasheet.
代码及注释如下:
其中在原来SMDK2410BSP的fmd.cpp文件中,没有NF_CMD(CMD_STATUS);这句话,这将导致擦除操作无法成功.在CE6.0的DEVICEEMULATOR BSP中的fmd.cpp中已经有该命令,驱动可以直接使用.

3.FMD_ReadSector
FMD_ReadSector用来读取单个sector数据.CMD_READ命令用来读取sector512字节数据,CMD_READ2用来读取sector保留区数据(16字节)
READ流程图如下(READ2类型,Write 00h变为50h即可):

首先发送复位命令(CMD_RESET),然后根据pSectorBuff,pSectorInfoBuff是否有效来进行READ和READ2读取sector数据或sector保留区info数据.
如果读取sector数据,READ命令及sector地址发出后调用RdPage512Unalign或RdPage512(根据pSectorBuff是否字节对齐)来读调NAND数据.RdPage512Unalign和RdPage512用汇编来实现.
如果读取sector保留区数据,READ2命令及sector地址发出后,调用RdPageInfo来读保留区info数据,RdPageInfo同样由汇编来实现.
最后从NAND控制器读取相应的数据
整个读取过程在while循环下,根据要读取sector的个数dwNumSectors来读取指定数目sector的数据.
代码及注释如下:

4.FMD_WriteSector
FMD_WriteSector用来写数据到指定sector.使用CMD_READ,CMD_WRITE或CMD_READ2,CMD_WRITE来写数据区(512字节)或info区(16字节保留区),Write流程图如下:

同Read操作一样,Write操作也区分是写sector数据还是sectorinfo数据.
写sectorinfo数据时,使用命令CMD_READ2,CMD_WRITE,然后调用WrPageInfo进行写sectorinfo数据.
写sector数据时,使用命令CMD_READ2,,CMD_WRITE,然后根据缓冲区是否对齐调用相应的WrPage512或WrPage512Unalign进行写sector数据,最后移动读数据指针(通过写FF给sectorinfo数据区),最后调用CMD_WRITE2和WrPageInfo完成写操作.同样进行while循环写指定sectors数目的数据.
WrPageInfo,WrPage512,WrPage512Unalign同样是用汇编实现的.
代码及注释如下:

5.其他流接口函数
对应于流接口驱动的其他几个函数,如FMD_PowerUp,FMD_PowerDown,FMD_OEMIoControl,FMD_Deinit均未实现.

6.最后来看看汇编实现的几个函数
RdPage512,RdPage512Unalign,WrPage512,WrPage512Unalign,WrPageInfo
这里就不多介绍了,主要的还是load,set的操作,可以参考ARM指令集
汇编代码如下:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值