当前位置:首页 > Uboot移植步骤详解
ldr pc,=HandleUERR01 /*mGB*/ b . b .
ldr pc,=HandleTIMER0 /*mGC*/ ldr pc,=HandleTIMER1 ldr pc,=HandleTIMER2 ldr pc,=HandleTIMER3 ldr pc,=HandleTIMER4
ldr pc,=HandleTIMER5 /*mGC*/ b . b .
ldr pc,=HandleURXD0 /*mGD*/ ldr pc,=HandleURXD1 ldr pc,=HandleIIC ldr pc,=HandleSIO ldr pc,=HandleUTXD0
ldr pc,=HandleUTXD1 /*mGD*/ b . b .
ldr pc,=HandleRTC /*mGKA*/ b . b . b . b .
b . /*mGKA*/ b .
b .
ldr pc,=HandleADC /*mGKB*/ b . b . b . b .
b . /*mGKB*/ b . b .
ldr pc,=EnterPWDN
作为对照:请看以上标记的值: .equ HandleReset, 0xc000000 .equ HandleUndef,0xc000004 .equ HandleSWI, 0xc000008 .equ HandlePabort, 0xc00000c .equ HandleDabort, 0xc000010 .equ HandleReserved, 0xc000014 .equ HandleIRQ, 0xc000018 .equ HandleFIQ, 0xc00001c /*the value is different with an address you think it may be. *IntVectorTable */ .equ HandleADC, 0xc000020 .equ HandleRTC, 0xc000024 .equ HandleUTXD1, 0xc000028 .equ HandleUTXD0, 0xc00002c
13
.equ HandleSIO, 0xc000030 .equ HandleIIC, 0xc000034 .equ HandleURXD1, 0xc000038 .equ HandleURXD0, 0xc00003c .equ HandleTIMER5, 0xc000040 .equ HandleTIMER4, 0xc000044 .equ HandleTIMER3, 0xc000048 .equ HandleTIMER2, 0xc00004c .equ HandleTIMER1, 0xc000050 .equ HandleTIMER0, 0xc000054 .equ HandleUERR01, 0xc000058 .equ HandleWDT, 0xc00005c .equ HandleBDMA1, 0xc000060 .equ HandleBDMA0, 0xc000064 .equ HandleZDMA1, 0xc000068 .equ HandleZDMA0, 0xc00006c .equ HandleTICK, 0xc000070 .equ HandleEINT4567, 0xc000074 .equ HandleEINT3, 0xc000078 .equ HandleEINT2, 0xc00007c .equ HandleEINT1, 0xc000080 .equ HandleEINT0, 0xc000084 3) 初始化CPU 相关的pll,clock,中断控制寄存器
依次为关闭watch dog timer,关闭中断,设置LockTime,PLL(phase lock
loop),以及时钟。
这些值(除了LOCKTIME)都可从Samsung 44b0 的手册中查到。 ldr r0,WTCON //watch dog disable ldr r1,=0x0 str r1,[r0] ldr r0,INTMSK
ldr r1,MASKALL //all interrupt disable str r1,[r0]
/*****************************************************
* Set clock control registers * *****************************************************/ ldr r0,LOCKTIME
ldr r1,=800 // count = t_lock * Fin (t_lock=200us, Fin=4MHz) = 800 str r1,[r0]
ldr r0,PLLCON /*temporary setting of PLL*/
ldr r1,PLLCON_DAT
/*Fin=10MHz,Fout=40MHz or 60MHz*/ str r1,[r0] ldr r0,CLKCON
ldr r1,=0x7ff8 //All unit block CLK
14
enable str r1,[r0]
4) 初始化内存控制器
内存控制器,主要通过设置13 个从1c80000 开始的寄存器来设置,包括总线宽度,
8 个内存bank,bank 大小,sclk,以及两个bank mode。
/*****************************************************
* Set memory control registers * *****************************************************/ memsetup: adr r0,SMRDATA ldmia r0,{r1-r13}
ldr r0,=0x01c80000 //BWSCON Address
stmia r0,{r1-r13}
5) 将rom 中的程序复制到RAM 中 首先利用PC 取得bootloader 在flash 的起始地址,再通过标号之差计算出这个程序代
码的大小。这些标号,编译器会在连接(link)的时候生成正确的分布的值。取得正
15
确信息后,通过寄存器(r3 到r10)做为复制的中间媒介,将代码复制到RAM 中。 relocate: /*
* relocate armboot to RAM */
adr r0, _start /* r0 <- current position of code */ ldr r2, _armboot_start ldr r3, _armboot_end
sub r2, r3, r2 /* r2 <- size of armboot */
ldr r1, _TEXT_BASE /* r1 <- destination address */
add r2, r0, r2 /* r2 <- source end address */ /*
* r0 = source address * r1 = target address * r2 = source end address */
copy_loop:
ldmia r0!, {r3-r10} stmia r1!, {r3-r10} cmp r0, r2
ble copy_loop 6) 初始化堆栈
进入各种模式设置相应模式的堆栈。 InitStacks:
/*Don't use DRAM,such as stmfd,ldmfd......
SVCstack is initialized before*/ mrs r0,cpsr bic r0,r0,#0X1F orr r1,r0,#0xDB /*UNDEFMODE|NOINT*/ msr cpsr,r1 /*UndefMode*/ ldr sp,UndefStack orr r1,r0,#0XD7 /*ABORTMODE|NOINT*/ msr cpsr,r1 /*AbortMode*/ ldr sp,AbortStack
orr r1,r0,#0XD2 /*IRQMODE|NOINT*/ msr cpsr,r1 /*IRQMode*/ ldr sp,IRQStack
orr r1,r0,#0XD1 /*FIQMODE|NOINT*/ msr cpsr,r1 /*FIQMode*/ ldr sp,FIQStack
ldr sp,SVCStack 7) 转到RAM 中执行
使用指令ldr,pc,RAM 中C 函数地址就可以转到RAM 中去执行。 5. 系统初始化部分 1. 串口部分
串口的设置主要包括初始化串口部分,值得注意的串口的Baudrate 与时钟MCLK 有很大关系,是通过:rUBRDIV0=( (int)(MCLK/16./(gd ->baudrate) + 0.5) -1 )计算得出。这可以在手册中查到。其他的函数包括发送,接收。这个时候没有中断,是通过循环等待来判断是否动作完成。 例如,接收函数:
while(!(rUTRSTAT0 & 0x1)); //Receive data read return RdURXH0(); 2. 时钟部分
实现了延时函数udelay。
这里的get_timer 由于没有使用中断,是使用全局变量来累加的。 3. flash 部分
bic r0,r0,#0XDF /*MODEMASK|NOINT*/ flash 作为内存的一部分,读肯定没有orr r1,r0,#0X13
msr cpsr,r1 /*SVCMode*/
16
问题,关键是flash 的写部分。
共分享92篇相关文档