博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现NAND FLASH的扩展(64M->128M)
阅读量:2352 次
发布时间:2019-05-10

本文共 2295 字,大约阅读时间需要 7 分钟。

这是之前在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的一些见解,如果有什么不到之处,还希望路过的大牛给予指点。

转载地址:http://hprvb.baihongyu.com/

你可能感兴趣的文章
简单字符设备驱动程序的操作步骤
查看>>
视频压缩:I帧、P帧、B帧
查看>>
视频编解码基础一
查看>>
视频编码学习二
查看>>
视频处理
查看>>
Python的安装教程
查看>>
谈谈码率、帧率、分辨率和清晰度
查看>>
OSI参考模型通信举例
查看>>
Vue.js 入门学习(一)
查看>>
Vue.js入门学习(二)实例、数据绑定、计算属性
查看>>
Vue.js入门学习(三) Class与Style绑定
查看>>
Vue.js入门学习(五)方法与事件处理器、表单控件绑定
查看>>
项目:Vue.js高仿饿了吗外卖APP(一)
查看>>
javascript中一些相对位置
查看>>
vue高仿饿了么课程项目--布局篇学习笔记
查看>>
es6 javascript的Iterator 和 for...of 循环
查看>>
Javascript中的shift() 、unshift() 和 pop()、push()区别
查看>>
将嵌套的数组扁平化
查看>>
vue-router的两种模式及区别
查看>>
c中嵌入python
查看>>