/*下面不厌其烦地解析一下
lowlevel_init.S这个原文件
*/
#define BWSCON 0x48000000
……
#define Tchr 0x2 /* 3clk */
#define REFCNT 0x0459
/**************************************/
/*1.要知道上面这些配置的最终会被用到下面SMRDATA 这个数据池里面,所以必须要明白SMRDATA 这个数据池是用
来干什么的,SMRDATA 后面每一个.word 后面防止的数据都是将要写入BWSCON 开始的寄存器的,总共有13个.work ,它们后面放置的值将会分别别写入0x48000000、0x48000004、0x48000008…一直到0x48000030共13个寄存器。
*/
/*2.上面那些配置的值是怎样决定的呢,详细请参考s3c2440A和你所用SDRAM的datasheet。细心找总是能找到的。
*/
/*3.而上面的那些配置值最终是通过下面lowlevel_init后面的这段函数写到寄存器里面的,下面对该段函数逐一分析:
*/
_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 /*
其实明白了前三条语句这段程序就不难懂了,归根到底就是为什么将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启动可谓费尽心思啊!
*/
ldr r1, =BWSCON /* Bus Width Status Controller */
add r2, r0, #13*4 /*
总共13个寄存器
*/
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 */
SMRDATA:
……
.word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
.word 0xb2
.word 0x30 /*需要注意的是CAS Latency的值在这里直接配置
*/
.word 0x30