bootloader第一天

来源:互联网 发布:淘宝代购被投诉 编辑:程序博客网 时间:2024/06/16 01:40

bootloader  

目标:启动内核(内核又在那里 ?flash上)

1.从flash上把内核读入到内存(a能读flash  b.能初始化内存,如关闭看门狗、时钟等。。)

2 启动(1设置参数2跳转执行)

最简单的bootloader编写步骤 

1. 初始化硬件  如:关闭看门狗   、设置时钟   、设置SDRAM FLASH

2. 把内核从NAND FLASH 读到SDRAM(如果bootloader比较大则要重定位到SDRAM

3. 设置“要传递的参数”

4. 跳转执行内核

start.s

/*1.关闭看门狗*/

/*2.设置时钟*/

/*3.初始化SDRAM*/

/*4.重定位*/

/*5.执行main*/



.test

.global  _start

_start

    /*1.关闭看门狗*/

ldr r0 ,=0x53000000  |

mov r1,#0|==>>r0 = 0

str r1 ,[r0] |

/*2.设置时钟*/

ldr r0 ,=0x4c00014\
mov r1,#0x30;\ ===>CLKDIVN=0x30
str r1 ,[r0]\
//FCLK:HCLK:PCLK = 1:2:4
//如果HDIVN非0 cpu的总线模式应该冲“fast bus mod”变为“asynchronous”
mrc p15, 0,r1,c1,c0,0//读出控制寄存器
orr r1,r,#0xc0000000//设置为“asynchronous bus mode
mcr p15 ,0 ,r1,c1,c0,0//写入控制寄存器
/* MPLLCON =s3c2440_MPLL_200MHZ*/
ldr r0 , =0x4c0004
ldr r1 , =s3c2440_MPLL_200MHZ
str r1 , [r0]

/*3.初始化SDRAM*/

//用c先设置栈

ldr r0 , MEM_CTL_BASE

adr r1 , sdram_config//得到当前的sdram_config

add r3, r0, #(13*4)


1:ldr r2 ,[r1] , #4//从r1所指的地方取一个值给r2,然后让r1+4

str r2 , [r0], #4//把r2的值存到r0的地方,让r0+4

cmp r0,r3

bne1b//比较r0 r3的值不相等跳回去


/*4.重定位*/::把bootloader本身的代码从flash复制到他的链接地址去

ldr sp ,= 0x34000000//设置栈:sp指向一块内存64M基地址是0x340000

b1 copy_code_to_sdram


/*5.执行main*/

ldr 1r , =halt

ldr pc, =main

halt:如果main有返回值则死循环

b halt











}









0 0