wince实现NAND FLASH的扩展(64M->128M)
欢迎加入Wince技术讨论群QQ#326444254 实现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下的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 ?其中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的话,我们还需要修改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里添加上面的语句。效果是一样的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |