ARM Linux bootloader笔记

.text   ;指定了后续编译出来的内容放在代码段【可执行】
.global  ;告诉编译器后续跟的是一个全局可见的名字【可能是变量,也可以是函数名】
_start   ;函数的其实地址,也是编译、链接够程序的起始地址。由于程序是通过加载器来加载的,必须找到_start名字的函数,因此_start必须定义成全局的,以便存在于编译后的全局符合表中,供其他程序【如加载器】寻找到。
_start:
/*1.关看门狗*/
ldr r0,=53000000
/*2.设置时钟*/

/*3.初始化SDRAM*/
ldr r0,=MEM_CTL_BASE
adr r1,sdram_config //得到当前地址
ldr r2,[r1],#4
add r3,r0,#(13*4)

1:  
ldr r2,[r1],#4
ltr r2,[r0],#4
cmp r0,r3
bne  1b  //不相等,调回前面的1标号
/*4.重定位*/ 
ldr sp,=34000000  //设置函数栈,执行最高内存
bl copy_code_to_sdram

/*5.执行main函数*/ 
ldr lr,=halt //main函数返回地址
ldr pc,=main
halt:
    b halt
sdram_config:
.long 0x22011110   //BWSCON
.long 0x00000700   //BANKCON0
.long 0x00000700   //BANKCON1
.long 0x00000700   //BANKCON2
.long 0x00000700   //BANKCON3
.long 0x00000700   //BANKCON4
.long 0x00000700   //BANKCON5
.long 0x00018005   //BANKCON6
.long 0x00018005   //BANKCON7
.long 0x008C04F4   //REFRESH
.long 0x000000B1   //BANKSIZE
.long 0x00000030   //MRSRB6
.long 0x00000030   //MRSRB7

版权声明:本文为u011976080原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。