没有合适的资源?快使用搜索试试~ 我知道了~
Uboot源码阅读笔记.pdf
4星 · 超过85%的资源 需积分: 18 43 下载量 102 浏览量
2011-04-26
14:24:08
上传
评论
收藏 151KB PDF 举报
温馨提示
试读
25页
Uboot源码阅读笔记.pdfUboot源码阅读笔记.pdfUboot源码阅读笔记.pdf
资源推荐
资源详情
资源评论
uboot 源码阅读笔记 1
cpu/arm920t/start.S
在开始处首先定义了一个全局的标签,
.globl _start
这个是整个 uboot 程序的入口,可在链接脚本 board/s3c2410/u-boot.lds 中找到。
这个标签所指的地址处就是一跳转指令
_start: b reset
开始复位。
reset:
/*
* set the cpu to SVC32 mode
*/
mrs r0,cpsr
bic r0,r0,#0x1f
/* disable IRQ and FIQ, ARM instruct set, supervisor mode. added by BoySKung*/
orr r0,r0,#0xd3
msr cpsr,r0
首先将 cpu 设置为 supervisor 模式 。 通过设置 cpsr 的低 5 位为 10011 实现 , 并禁止 IRQ 、 FIQ
。
即 cpsr 的第七第六位设置为 11.
接着关闭看门狗定时器
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
将看门狗定时器控制寄存器置 0 。
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
设置 FCLK:HCLK:PCLK 为 1:2:4, 通过设置 CLKDIVN 控制寄存器的 HDIVN 、 PDIVN 值实现不同的
比例
00(1:1:1)
01(1:1:2)
10(1:2:2)
11(1:2:4)
这些然后开初始化 cpu
cpu_init_crit:
/*
* flush v4 I/D caches
*/
mov r0, #0
mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */
mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */
首先关闭 ICache 和 DCache.
/*
* disable MMU stuff and caches
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
mcr p15, 0, r0, c1, c0, 0
关闭 MMU ,数据存储格式为小端。开启数据地址对齐错误检测,使能 ICACHE 。
/*
* before relocating, we have to setup RAM timing
* because memory timing is board-dependend, you will
* find a memsetup.S in your board directory.
*/
mov ip, lr
bl memsetup
mov
lr,
ip
mov pc, lr
还要对内存时序进行设置,因为内存时序是依赖于开发板的。
Cpu 初始化结束后,开始初始化串口 uart
@ Initialize UART
@
@ r0 = number of UART port
InitUART:
ldr r1, =0x50000000
mov r2, #0x0
str r2, [r1, #0x8]
str r2, [r1, #0xc]
mov r2, #0x3
str r2, [r1, #0x0]
ldr r2, =0x245
str r2, [r1, #0x4]
/* 50700000 = PCLK = 202.8 / 4 = 50.7 when FCLK at 202.8 */
#define UART_BRD ((50700000 / (115200 * 16)) - 1)
mov r2, #UART_BRD
str r2, [r1, #0x28]
这里主要对 uart 的一些控制寄存器进行了设置,并设置了串口的波特率
mov r3, #100
mov r2, #0x0
1: sub r3, r3, #0x1
tst r2, r3
bne 1b
mov pc, lr
这里是一段延时,具体起什么作用还不清楚。
这些初始化都结束后开始代码重定位
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
重定位时,首先检查当前是不是在 ram 中运行,若是则不需重定位
紧接着设置堆栈
stack_setup:
@ldr r1, =0x48000004
@ldr r0, [r1]
@bl PrintHexWord
/* enter ansynchronous, when cpu at 202.8MHZ, it must into asynchronous mode*/
mrc p15, 0, r1, c1, c0, 0 @ read ctrl register
orr r1, r1, #0xc0000000 @ Asynchronous
mcr p15, 0, r1, c1, c0, 0 @ write ctrl register
ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
sub r0, r0, #CFG_MALLOC_LEN /* malloc area */
sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */
#ifdef CONFIG_USE_IRQ
sub r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */
清除 bss 段
clear_bss:
ldr r0, _bss_start /* find start of bss segment */
add r0, r0, #4 /* start at first byte of bss */
ldr r1, _bss_end /* stop here */
mov r2, #0x00000000 /* clear */
clbss_l:str r2, [r0] /* clear loop... */
add r0, r0, #4
cmp r0, r1
bne clbss_l
就是将 bss 段全部置 0
最后
ldr pc, _start_armboot
开始进入 c 的世界, uboot 启动的 stage 2
Lib_arm/board.c
当第一阶段的汇编部分执行完,跳到 stage2 时,开始执行 c 函数 start_armboot
开头首先声明一个全局指针变量 DECLARE_GLOBAL_DATA_PTR; 这个宏定义在头文 件
include/asm-arm/global_data.h 中
#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")
typedef struct global_data {
bd_t *bd;
unsigned long flags;
unsigned long baudrate;
unsigned long have_console; /* serial_init() was called */
unsigned long reloc_off; /* Relocation Offset */
unsigned long env_addr; /* Address of Environment struct */
unsigned long env_valid; /* Checksum of Environment valid? */
unsigned long fb_base; /* base address of frame buffer */
#ifdef CONFIG_VFD
unsigned char vfd_type; /* display type */
#endif
#if 0
unsigned long cpu_clk; /* CPU clock in Hz! */
unsigned long bus_clk;
unsigned long ram_size; /* RAM size */
unsigned long reset_status; /* reset status register at boot */
#endif
void **jt; /* jump table */
} gd_t;
在这个结构中存放一些全局数据。
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t));
这行是对指针的初始化。
接下来通过一个循环,执行初始化序列中的一些函数
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
初始化序列的定义如下:
init_fnc_t *init_sequence[] = {
cpu_init, // 初始化 cpu ,主要是设置 FIQ 和 IRQ 的堆栈起始地址
board_init, // 开发板初始化,设置电源、时钟、 I/O 端口及全能 I/DCache
interrupt_init, // 中断初始化,设置 PWM 时钟
env_init, // 环境变量初始化,检测环境变量是否有效,并初始化相全局变
量
init_baudrate, // 初始化波特率,设置板子通信时的波特率
serial_init, // 初始化串口,设置串口和通信时数据结构,包括起始 / 停止位等
console_init_f, // 控制台初始化,将控制台设置为 silent 模式
display_banner,// 打印板子相关信息
dram_init, // 内存初始化,设置内存的起始地址和大小
display_dram_config, // 显示内存配置信息
#if defined(CONFIG_VCMA9)
checkboard,
#endif
NULL,
剩余24页未读,继续阅读
资源评论
- ghsf33442012-09-29写的不是很详细
- arizona_dale2012-05-08感觉写的不够详细,不过还是要反复拜读~ 感谢
csdn_199
- 粉丝: 18
- 资源: 191
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功