加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 17:59:38 所属栏目:百科 来源:网络整理
导读:欢迎加入Wince技术讨论群QQ#326444254 实现 NAND?FLASH 的扩展( 64M-128M ) 这是之前在 CE 上做的 NAND?Flash 的扩展,在 mobile 上也实现了。方法是相同的,我们所做的是实现 64M 到 128M 的扩展。 ?????对于这样的问题,很明显就是要改底层的寄存器,首

欢迎加入Wince技术讨论群QQ#326444254

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

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

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

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

?????先来修改汇编里的EBICON,在BSP下的Srcinc?目录下有个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

?其中GBLASETA都是ARM汇编里的指令,GBLA?指令声明一个全局算术变量,并将其值初始化为?0SETA指令来设置变量的值。上面的分号后面的语句表示注释。在这里我们主要用环境变量“NANDFLASH128M”来设置一个全局变量“NANDFLASH128M_S”,这个变量,之后我们会在startup.s里用到它,startup.s文件会在很多目录里出现,比如stepldrebootoal层,但是我们只需要在ebootoal层里对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驱动,因为即使EbootOal层都会用的NAND驱动,它们也是链接NANDlib。这部分的修改会比较繁琐,所以要仔细。

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

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

???标准的或者一般的sector大小都是512B,但是现在有很多large?Flash,它的一个sector大小可以达到2048B2K,这样的话就需要在处理驱动的一些接口的时候要很小心。如果系统用的是mobile的话,我们还需要修改BSPFile目录下的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里添加上面的语句。效果是一样的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读