想移植uboot1.4到板子上,搞了半天没成功,决计弄理解uboot原理,大约流程,所以决议写个简略的bootloader来理顺一下应该做些什么,怎么做~~~~
首要应该描绘一下该bootloader的根本功用:板子上电后能进行LED流水灯(全能的流水灯啊)。完成该功用分两步:第一步,真实的bootloader功用,即完成硬件的初始化以及将内核程序(LED流水灯)从ROM(flash)搬移到RAM(sdram);第二步,内核程序的完成
第一步也可分两段:1,板子硬件初始化;2,内核程序的搬移。代码文件:boot.s
板子硬件初始化:1. 反常向量初始化
2. 初始化CPSR,包含封闭间断及设定svc形式等
3. 封闭看门狗定时器
4. 初始化体系时钟
5. 初始化CPU Cache(这步能够不做,可是体系功率会显着下降许多)
内核履行流程:1,内核反常向量初始化
2,初始化仓库
3,跳转到C程序中履行全能的流水灯~~~~
代码如下: equ SYSCFG, 0x01c00000 .equ BWSCON, 0x01c80000 .equ WTCON, 0x01d30000 .equ PLLCON, 0x01d80000 .equ CLKCON, 0x01d80004 .equ KERNEL_START, 0x0c000100 @ 内核履行的开始方位(RAM) .equ KERNEL_VECTOR, 0x0c000000 @ 内核的反常向量进口(RAM) .equ KERNEL_DATA, 0x00000100 @ 内核数据在ROM中的开始方位 .equ KERNEL_CPLMT, 0x00001000 @ 仿制边界(内核数据在ROM中的停止方位,4KB).equ REFEN, 0x01.equ TREFMD, 0x0.equ Trp, 0x1.equ Trc, 0x1.equ Tchr, 0x2.equ REFCNT, 1550vectors: b reset ldr pc, = KERNEL_VECTOR @ 未定义协处理器指令 ldr pc, = KERNEL_VECTOR + 4 @ SWI(软间断) ldr pc, = KERNEL_VECTOR + 8 @ 预取指令间断 ldr pc, = KERNEL_VECTOR + 12 @ 数据间断 b . ldr pc, = KERNEL_VECTOR + 16 @ IRQ(一般间断请求) ldr pc, = KERNEL_VECTOR + 20 @ FIQ(快速间断请求)reset: mov r0,0xd3 ;制止IRQ,FIQ,SVC形式 msr cpsr_c,r0 ldr r0,=WTCON ;关看门狗 mov r1,#0 str r1,[r0] ldr r0,=PLLCON ;初始化PLLCON mov r1,#0x48032 ;Fin=10M Fpllo=40M Mdiv=0x48 Pdiv=0x3 Sdiv=0x2 str r1,[r0] ldr r0,=CLKCON ldr r1,=0x7f88 ;提供给一切外设时钟 str r1,[r0] ldr r0,=SYSCFG ;初始化cpu cach mov r1,#0x0e ;8K cache 写缓冲使能 str r1,[r0] ldr r0,=SMRDATA ;初始化存储器 ldmia r0,{r1-r13} ldr r0,=BWSCON stmia r0,{r1-r13};将内核程序(LED流水灯)从0x00000100(flash)仿制到0x0c000000(sdram) ldr fp,=KERNEL_DATA ldr ip,=KERNEL_VECTOR ldr sp,=KERNEL_CPLMT1: ldmia fp!,{r0-r7} stmia ip!,{r0-r7} cmp fp,ip bcc 1b ldr pc,=KERNEL_STARTsmrdata : .word 0x11110090.word 0x00000600.word 0x00000700 @ BANKCON1: 默许 .word 0x00000700 @ BANKCON2: 默许 .word 0x00000700 @ BANKCON3: 默许 .word 0x00000700 @ BANKCON4: 默许 .word 0x00000700 @ BANKCON5: 默许 .word 0x00018000 @ BANKCON6: SDRAM,SCAN=8位,Trcd=2个时钟 .word 0x00000700 @ BANKCON7: 默许 .word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT) ;refresh register .word 0x00000016 @ BANKSIZE: SLCKEN=1, BK76MAP=8M .word 0x00000020 @ MRSRB6: CL=2个时钟 .word 0x20 @MRSRB7第二步:内核程序的完成,代码文件 head.s内核程序大致三步:1,内核反常向量初始化;2,内核仓库初始化;3,履行LED程序;代码如下:.equ KERNEL_STACK, 0x0c002000.equ KERNEL_LIMIT, 0x0c001000vectors: b undef_handler @ 内核反常向量0 b swi_handler @ 内核反常向量1 b pabort_handler @ 内核反常向量2 b dabort_handler @ 内核反常向量3 b irq_handler @ 内核反常向量4 b fiq_handler @ 内核反常向量5.space 0x100-6*4 @字节填充至地址:0x0c000100start: ldr sp,=KERNEL_STACK ldr sl,=KERNEL_LIMIT bl entryundef_handler: swi_handler: pabort_handler: dabort_handler: irq_handler: fiq_handler: b . @ 现在什么都不做
以上两个文本程序根本完成了一个bootloader的功用,至少契合我的板子,只需再加上上一篇LED篇中的LED程序,便是一个完好的bootloader程序了。当然,仍是需求几番调试的。而大debug之前仍是有许多作业要做滴。下一篇再说吧,这儿太长了~~~~