接下来对board/samsung/mini2440/lowlevel_init.s这个文件进行修改。
这个文件主要在start.S中被调用,在start.S中初始化时钟之后会判断是否uboot已经在ram中运行,如果没有,则跳转到cpu_init_crit初始化协处理器,然后跳转到lowlevel_init初始化存储器控制器。
这个文件主要设置ARM的存储器控制器,这几个控制器包括存储控制器,总线带宽控制器等。设置了这写东西后,ARM才能正常的对
nand nor ram等存储空间进行访问。
为了支持2440,需要修改BWSCON,mini2440 BANK0接NOR Flash,BANK4接DM9000,BANK6接RAM,对于mini2440,
只要修改B4_BWSCON即可,为了配合其他板,这里统一修改如下:
...
#define B1_BWSCON (DW16)
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16 + UBLB) /* cs8900 */
#define B4_BWSCON (DW16 + WAIT + UBLB) /* DM9000 */
#define B5_BWSCON (DW8)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
...
然后修改 REFRESH 的刷新周期:
参考http://zjbintsystem.blog.51cto.com/964211/211345
#define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
#define Trc 0x3 /* 7clk */
#define Tchr 0x2 /* 3clk */
#define Trp 0x2 /* 4clk */
#define REFCNT 1012
#else
#define Trp 0x0 /* 2clk */
#define REFCNT 0x0459
#endif
lowlevel_init.s 修改完成。
以下解释一下主要代码:
_TEXT_BASE:
.word TEXT_BASE
.globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1
ldr r1, =BWSCON /* Bus Width Status Controller */
add r2, r0, #13*4
/*其实明白了前三条语句这段程序就不难懂了,归根到底就是为什么将SMRDATA 的值减
去_TEXT_BASE的值?原因是这样的:我们使用的是从nandflash boot的方式,目前程序
仍然在4K-bytes ‘Steppingstone’(这里为什么突然冒出个Steppingstone’,这个就是我前面提到从nand flash 引导的方法,但不
知道名字,后来重新看s3c2440A datasheet的nand flash那一章的开头才知道)上面运行,在SMRDATA后面的的内容仍然在
Steppingstone里面。但是SMRDATA的值是相对于_TEXT_BASE 值的地址,而且_TEXT_BASE 是放置u-boot的开始地方,所以用SMRDATA
-_TEXT_BASE 就可以得到SMRDATA后面内容在Steppingstone里面相对于地址0x00000000的放置的所在地方(相对于0x00的地址值)。*/
/*从这三条语句可以看出前人为了实现从nand flash启动可谓费尽心思啊!*/
0:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne 0b
/* everything is fine now */
mov pc, lr
.ltorg
/* the literal pools origin */