优快云仅用于增加百度收录权重,排版未优化,日常不维护。请访问:www.hceng.cn 查看、评论。
本博文对应地址: https://hceng.cn/2017/04/13/自己写bootloader/#more
参考写了个bootloader。
0.编写bootloader步骤
- 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH;
- 因为bootloader比较大(大于4K),需要重定位到SDRAM;
- 把内核从NAND FLASH读到SDRAM;
- 设置“要传给内核的参数”;
- 跳转启动内核;
1.初始化硬件
1.1 关看门狗
{% codeblock lang:asm [start.S] %}
.text
.global _start
_start:
/* 1. 关看门狗 :向寄存器WTCON(0x53000000)写0即可;P462;*/
ldr r0, =0x53000000 //将0x53000000放入r0;
mov r1, #0 //将0放入r1中;
str r1, [r0] //将r1中的0放入r0所指的存储器中;
{% endcodeblock %}
1.2 设置时钟
{% codeblock lang:asm [start.S] %}
/* 2. 设置时钟:配置寄存器CLKDIVN(0x4C000014)设置分频;P260; /
ldr r0, =0x4c000014
mov r1, #0x05; //FCLK:HCLK:PCLK=1:4:8
str r1, [r0]
/ 如果HDIVN非0,CPU的总线模式应设置为“asynchronous bus mode”;P244 /
mrc p15, 0, r1, c1, c0, 0 //读出控制寄存器;
orr r1, r1, #0xc0000000 //设置为“asynchronous bus mode”;
mcr p15, 0, r1, c1, c0, 0 //写入控制寄存器;
/ 设置MPLLCON = S3C2440_MPLL_400MHZ; P256 */
ldr r0, =0x4c000004
ldr r1, =(0x5c<<12)|(0x01<<4)|(0x01)
str r1, [r0]
/*优化速度: 启动ICACHE */
mrc p15, 0, r0, c1, c0, 0 @ read control reg
orr r0, r0, #(1<<12)
mcr p15, 0, r0, c1, c0, 0 @ write it back
{% endcodeblock %}
1.3 初始化SDRAM
{% codeblock lang:asm [start.S] %}
/初始化SDRAM:依次向SDRAM寄存器 写入sdram_config中的值/
ldr r0, = 0x48000000 //将SDRAM寄存器基地址写入r0;
adr r1, sdram_config //将sdram_config的当前地址写入r1;
add r3, r0, #(134) //r3=r0+134,即为SDRAM寄存器结尾地址;
1:
ldr r2, [r1], #4 //将r1寄存器的值放入r2,并将r1的地址+4;
str r2, [r0], #4 //将r2的值写入r0,并将r0的地址+4;
cmp r0, r3 //比较r0和r3,判断是否设置到了最后一个寄存器;
bne 1b //不相等即没有设置完,跳到前面(b)的1处;
… …
… …
sdram_config: //把要设置的值,存在这里;P