U-Boot-2009-03移植笔记(点亮第一展灯)
在U-Boot-2009-03移植笔记的最后,我们找到了U-boot的启动代码在cpu/arm920t/start.S中,这是一段汇编代码,我们的移植工作从这里开始。
我们定位到reset标签
1 reset: 2 /* 3 * set the cpu to SVC32 mode 4 */ 5 mrs r0,cpsr 6 bic r0,r0,#0x1f 7 orr r0,r0,#0xd3 8 msr cpsr,r0
上面的注释很明白,设置CPU工作模式,不需要修改。
接下来,我们关掉看门狗,并关闭中断
1 ldr r0, =pWTCON 2 mov r1, #0x0 3 str r1, [r0] 4 5 /* 6 * mask all IRQs by setting all bits in the INTMR - default 7 */ 8 mov r1, #0xffffffff 9 ldr r0, =INTMSK 10 str r1, [r0] 11 12 13 /*modify by xinna*/ 14 ldr r1, =0x7fff 15 ldr r0, =INTSUBMSK 16 str r1, [r0]
我这里直接略过了原有U-boot的宏定义,因为我们只需要支持一款芯片即可,注意第14行,这是因为S3C2440于S3C2410中断控制器不同而修改的,具体原理请参见S3C2440的datasheet。在上面的代码里,我们完成了两件事情,关看门狗,关中断,接下来我们继续看代码,到了这里:
1 /* 2 * we do sys-critical inits only at reboot, 3 * not when booting from ram! 4 */ 5 #ifndef CONFIG_SKIP_LOWLEVEL_INIT 6 bl cpu_init_crit 7 #endif
子过程cpu_init_crit主要工作就是关闭Cache,并且调用lowlevel_init,我们要注意的是lowlevel_init,这里放了初始化SDRAM的代码。
这个low_levelinit位于board/xinna2440/lowlevel_init.S文件中,这里会初始化好你的内存(xinna2440用的是两片16位的SDRAM并联组成32位的SDRAM),我们需要针对不同的芯片,连接方式修改以下这个文件中的寄存器配置。
然后还有很重要的一点,你需要修改board/xinna2440/u-boot.lds文件,将lowlevel_init这段代码放在整个u-boot.bin的前4k代码中,所以我们需要这样修改
1 . = 0x00000000; 2 3 . = ALIGN(4); 4 .text : 5 { 6 cpu/arm920t/start.o (.text) 7 board/xinna2440/lowlevel_init.o (.text) 8 *(.text) 9 }
然后我们在start.S的 bl cpu_init_crit后面增加以下代码,点亮第一盏灯。
1 ldr r4,=0x56000010 2 ldr r5,=( 1 << 10) 3 str r5,[r4] 4 5 ldr r4,=0x56000014 6 ldr r5,=~( 1 << 5) 7 str r5,[r4] 8 loo: 9 b loo
通过openjtag烧到nandflash上,第一盏LED灯被点亮。
80岁也要写程序