微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > UBOOT和bootloader的关系

UBOOT和bootloader的关系

时间:11-21 来源:互联网 点击:

RTC, 0xc000024

.equ HandleUTXD1, 0xc000028

.equ HandleUTXD0, 0xc00002c

.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]

//

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 enable

str r1,[r0]

4) 初始化内存控制器

内存控制器,主要通过设置13 个从1c80000 开始的寄存器来设置,包括总线宽度,

8 个内存bank,bank 大小,sclk,以及两个bank mode。

//

memsetup:

adr r0,SMRDATA

ldmia r0,{r1-r13}

ldr r0,=0x01c80000 //BWSCON Address

stmia r0,{r1-r13}

5) 将rom 中的程序复制到RAM 中

首先利用PC 取得bootloader 在flash 的起始地址,再通过标号之差计算出这个程序代

码的大小。这些标号,编译器会在连接(link)的时候生成正确的分布的值。取得正

确信息后,通过寄存器(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:

//Dont 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

bic r0,r0,#0XDF //MODEMASK|NOINT//

orr r1,r0,#0X13

msr cpsr,r1 //SVCMode//

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 部分

flash 作为内存的一部分,读肯定没有问题,关键是flash 的写部分。

Flash 的写必须先擦除,然后再写。

unsigned long flash_init (void)

{

int i;

u16 manId,devId;

//first we init it as unknown,even if you forget assign it below,its not a problem

for (i=0; i < CFG_MAX_FLASH_BANKS; ++i){

flash_info[i].flash_id = FLASH_UNKNOWN;

flash_info[i].sector_count=CFG_MAX_FLASH_SECT;

}

//check manId,devId//

_

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top