实现NAND FLASH的扩展(64M->128M)

这是之前在CE上做的NAND Flash的扩展,在mobile上也实现了。方法是相同的,我们所做的是实现64M到128M的扩展。

     对于这样的问题,很明显就是要改底层的寄存器,首先需要修改nand controller中的寄存器,根据datasheet来扩大nand flash的地址映射空间,nand controller必须有支持多个bank的能力,我们是有两块nand flash来实现128M的,所以支持两个bank。其次在修改控制器的之前,我们需要了解外部总线接口,即EBICON,通过设置EBICON来选择支持的卡的类型,我们这里支持的就是NAND。

 

     如果不想改动原来的代码的话,我建议可以写一些环境变量以示区分,比如我们这里就可以用“NANDFLASH128M”这个宏定义来区分,原来的代码就包含在“ELSE”部分。

     先来修改汇编里的EBICON,在BSP下的Src/inc 目录下有个inc文件,其中记录了很多有底层硬件寄存器相关的设置,inc文件其实就是include file,类似于C/C++里的.h/.hpp文件。需要在inc文件里找到EBI的信息,如下:

 GBLA    EBICON_VAL
EBICON_VAL SETA ((0<<10)+(0<<9)+(1<<8)+(1<<2)+(0<<1)+(0<<0)) 

                                                                                                 ; BANK[7:2]=SDRAM/SDRAM/RAM/CF/NAND/SRAM
 GBLA    NANDFLASH128M_S
 IF :DEF: NANDFLASH128M
NANDFLASH128M_S SETA 1 

 ELSE
NANDFLASH128M_S SETA 0
 ENDIF

 其中GBLA和SETA都是ARM汇编里的指令,GBLA 指令声明一个全局算术变量,并将其值初始化为 0。SETA指令来设置变量的值。上面的分号后面的语句表示注释。在这里我们主要用环境变量“NANDFLASH128M”来设置一个全局变量“NANDFLASH128M_S”,这个变量,之后我们会在startup.s里用到它,startup.s文件会在很多目录里出现,比如stepldr,eboot,oal层,但是我们只需要在eboot和oal层里对EBICON进行处理。找到相应的目录,修改如下:

;    ldr r0, =EBICON  ; EBI
;    ldr r1, =EBICON_VAL   

;    str r1,[r0]
    [ NANDFLASH128M_S=1 ;
    ldr       r0, = EBICON
    ldr r1, [r0]
    orr      r1,r1,#0x100
    str r1,[r0]
    ]

    这就是在汇编里添加宏定义的方法,我们这里当"NANDFLASH128M_S"等于"1"时,执行这段代码,反之不执行。这样就修改完了EBICON寄存器。

 

   下面需要修改NAND Flash控制寄存器,这一部分我们主要修改NAND Flash驱动,因为即使Eboot和Oal层都会用的NAND驱动,它们也是链接NAND的lib。这部分的修改会比较繁琐,所以要仔细。

   这里主要就是驱动里一些接口函数,一定要修改正确,不然驱动无法正常工作。这里由于我们是两块Flash,所以我就尝试去读第二块Flash的信息来判断是否存在。在读之前要使能片选信号。查看datasheet上NFCONT来使能第二块Flash的片选信号,这样才能操作Flash。函数FMD_GetInfo里我们需要根据实际情况返回Flash的容量,Sector和Block的大小。

    Flash的驱动主要以Sector为单位进行处理,所以需要根据sector的地址大小来判断当前的sector属于哪块Flash,在不同Flash上,需要使能片选信号才能操作当前有效的Flash。这部分内容就是比较繁琐,比较容易实现。

   标准的或者一般的sector大小都是512B,但是现在有很多large Flash,它的一个sector大小可以达到2048B(2K),这样的话就需要在处理驱动的一些接口的时候要很小心。如果系统用的是mobile的话,我们还需要修改BSP/File目录下的Memory.cfg.xml文件,如下:

       IF NANDFLASH128M
        <NAND SECTORSIZE="0x200" BLOCKSIZE="0x4000" LENGTH="0x8000000" ID="FLASH" />
 
        ELSE
        <NAND SECTORSIZE="0x200" BLOCKSIZE="0x20000" LENGTH="0x4000000" ID="FLASH" /> 
        ENDIF NANDFLASH128M

这部分时间也在搞mobile,对mobile也在学习。

 对于定义宏开关,可以这样设置,在BSP下的bat文件里添加你想设置的开关如:

set NANDFLASH128M=1

然后再在相应的目录里的sources文件里添加:

!IF "$(NANDFLASH128M)" == "1"
CDEFINES=$(CDEFINES) -DNANDFLASH128M
ADEFINES=$(ADEFINES) -pd "NANDFLASH128M SETS /"1/""
!ENDIF

如果不想在每个用到该变量的sources里添加上述文字的话,可以在BSP下的sources.cmn里添加上面的语句。效果是一样的。

以上就是自己在处理Wince和mobile的NAND Flash的一些见解,如果有什么不到之处,还希望路过的大牛给予指点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值