通过大家的讲解,我也稍微明白了一些。<br />看U-Boot中start.S,还有几处不太明白,可能还是没有理解好吧……<br />#include <config.h><br />#include <version.h><br /><br />#define PINSEL0 0xe002c000<br />#define PINSEL2 0xe002c014<br />#define BCFG0 0xffe00000<br />#define BCFG1 0xffe00004<br />#define MEMMAP 0xe01fc040<br />#define PLLCON 0xe01fc080<br />#define PLLCFG 0xe01fc084<br />#define PLLSTAT 0xe01fc088<br />#define PLLFEED 0xe01fc08c<br />#define VPBDIV 0xe01fc100<br />#define RAM_SIZE 0x20000 + 1024 * 128<br />#define RAM_BASE 0x81000000<br />.globl _start<br />_start:<br /> ldr pc,reset<br /> add pc,pc,#0x01000000 疑问1<br /> add pc,pc,#0x01000000 <br /> add pc,pc,#0x01000000 <br /> add pc,pc,#0x01000000 <br /> add pc,pc,#0x01000000 <br /> add pc,pc,#0x01000000 <br /> add pc,pc,#0x01000000 <br /><br /> .balignl 16,0xdeadbeef<br /><br /><br />_TEXT_BASE:<br /> .word TEXT_BASE<br /><br />.globl _armboot_start<br />_armboot_start:<br /> .word _start<br /><br />.globl _bss_start<br />_bss_start:<br /> .word __bss_start<br /><br />.globl _bss_end<br />_bss_end:<br /> .word _end<br /><br />reset:<br />/*<br />**first set cpu to svc32 mode<br />*/<br /> mrs r0,cpsr<br /> bic r0,r0,#0x1f<br /> orr r0,r0,#0x13<br /> msr cpsr,r0<br />/*<br /> ok the cpu is setted to svc32 mode<br /> then we should first close the watch dog<br /> and the others Interrupt<br />*/<br /><br />Init_cpu:<br /> <br /> ldr r1,=PINSEL0<br /> ldr r2,=0x0//common io<br /> str r2,[r1]<br /> <br /> ldr r1,=PINSEL2<br /> ldr r2,=0x0f814914<br /> str r2,[r1]<br /><br /> ldr r1,=BCFG0<br /> ldr r2,=0x1000ffef<br /> str r2,[r1]<br /> <br /> ldr r1,=BCFG1<br /> ldr r2,=0x1000ffef<br /> str r2,[r1]<br /><br />//////////////////////////////////////////////////////////////////////////////// <br />PLL_CON:<br /> .word 0xaa<br /> .word 0x55<br /><br />#define Fosc 11059200<br />#define Fcclk (Fosc*4)<br />#define Fcco (Fcclk*4)<br />#define Fpclk (Fcclk/4)*1<br /><br />Init_target:<br /> ldr r1,=MEMMAP<br /> mov r2,#3<br /> str r2,[r1]<br /><br /> ldr r1,=VPBDIV<br /> mov r2,#0<br /> str r2,[r1]<br /> <br /> ldr r1,=PLLCFG<br /> mov r2,#0x23 <br /> str r2,[r1]<br /> <br /> ldr r1,=PLLCON<br /> mov r2,#01<br /> str r2,[r1]<br /> <br /> ldr r1,=PLLFEED<br /> mov r2,#0xaa<br /> str r2,[r1]<br /><br /> mov r2,#0x55<br /> str r2,[r1]<br />wait_lock:<br /> ldr r1,=PLLSTAT<br /> ldr r2,[r1]<br /> tst r2,#0x400<br /> beq wait_lock<br /><br /> ldr r1,=PLLCON<br /> mov r2,#0x03<br /> str r2,[r1]<br /> <br /> ldr r1,=PLLFEED<br /> mov r2,#0xaa<br /> str r2,[r1]<br /> mov r2,#0x55<br /> str r2,[r1]<br /><br />/*<br /> relocate the mem<br />*/<br />relocate:<br /> adr r0,_start 疑问2<br /> ldr r1,_TEXT_BASE<br /> <br />//compare how many mem we should copy<br /> ldr r2,_armboot_start<br /> ldr r3,_bss_start<br /> sub r2,r3,r2//r3-r2->r2<br /> add r2,r0,r2//from start to _bss_start<br />copy_loop:<br /> ldmia r0!,{r3-r10}<br /> stmia r1!,{r3-r10}<br /> cmp r0,r2<br /> ble copy_loop<br />//ok ,finish copyed<br />///////////////////////////////////////////// <br />//now setup the stack and ready to jump to C code<br /> adr r0,real_vectors<br /> add r2,r0,#1024<br /> ldr r1,=0x81000000//this is the base of first ram<br />////////////////////////////////////////////////////////<br />//new added<br /> add r1,r1,#0x08<br />////////////////////////////////////////////////////////<br />v_copy_loop:<br /> ldmia r0!,{r3-r10}<br /> stmia r1!,{r3-r10}<br /> cmp r0,r2<br /> ble v_copy_loop<br />stack_setup:<br /><br /> ldr r0,_TEXT_BASE<br /> sub r0,r0,#CFG_MALLOC_LEN<br /> sub r0,r0,#CFG_GBL_DATA_SIZE<br />#ifdef CONFIG_USE_IRQ<br /> sub r0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)<br />#endif<br /> sub r0,r0,#12<br /> mov fp,#0 疑问3<br /> mov a2,#0<br />/////////////////////////////////////////////<br /> ldr pc,_start_armboot<br />_start_armboot:<br /> .word start_armboot<br /><br /><br />real_vectors: 疑问4<br /> b reset<br /> b undefined<br /> b software<br /> b preabort<br /> b dataabort<br /> b not_use<br /> b irq<br /> b fiq<br /><br />undefined:<br /> mov r6,#3<br /> b reset<br />software:<br /> mov r6,#4 <br /> b reset <br />preabort:<br /> mov r6,#5<br /> b reset<br />dataabort:<br /> mov r6,#6<br /> b reset<br />not_use:<br /> mov r6,#7<br /> b reset<br />irq: <br /> mov r6,#8<br /> b reset<br />fiq:<br /> mov r6,#9<br /> b reset<br />上边这段代码把MEMMAP设定为0x3,就是说中断向量从外部存储器重新映射,代码已经把中断向量表拷贝到RAM的基地址处0x81000000,那么我在疑问一的地方,是否可以添加add pc,pc,#0x01000000 这样的指令,发生请求时先到flash去指令(pc指针是0x8@@@@@@@吧?),然后将pc指针相加,指到外部的RAM空间0x81000000中,那里有中断向量表的一份拷贝。<br />疑问2的地方,为什么要用adr呢?那adr r0,_start, 当程序在flash中运行时和程序在ram运行时r0值是否相同,还是r0值根本不变,是由uboot.lds中指定呢?程序里有一个_start,lds文件也有一个?到底曲哪个呢?<br />疑问3的地方一直不明白在干什么...<br />疑问4的地方使用的跳转指令,执行到这的时候,一定在ram里了,那它跳转的时候是到了flash中的代码,还是到了ram中的代码呢<br />这些问题困扰了我很久了。。。。。<br />
|