U-Boot源代码阅读笔记(二) —— 对lowlevel_init.S的分析
本文主要分析与U-Boot启动过程相关的汇编代码lowlevel_init.S,目标平台以PXA270为例。
文件位于board/myboard/lowlevel_init.S,主要执行内存相关的初始化
- 把链接寄存器LR(即R14)的值转存到寄存器R10中,以便lowlevel_init完成后恢复执行
.globl lowlevel_init
lowlevel_init:
mov r10, lr
- 按顺序初始化GPIO寄存器: GPSR GPCR GRER GFER GPDR GAFR PSSR
/* Set up GPIO pins first */
ldr r0, =GPSR0
ldr r1, =CFG_GPSR0_VAL
str r1, [r0]
.....
- 初始化内存控制器
/* Initlialize Memory Controller */
@ skip memory init if we're run in ram(must be a JTAG run)
mov r0, pc
ldr r1, =0xa0000000
and r0, r0, r1 /* 把当前PC寄存器的值与0xa0000000逻辑与*/
cmp r0, r1 /* 如果结果等于0xa0000000,说明uboot是从RAM启动的 */
beq mem_init_done /* 那么就需要跳过RAM初始化, 直接跳转到mem_init_done执行 */
/* 具体的初始化操作与目标板有很大相关性,下面以我的PXA270开发板为例 */
mem_init:
@ get memory controller base address
ldr r1, =MEMC_BASE /* 内存控制器基地址 */
- 初始化内存控制器 Step 1
@****************************************************************************
@ Step 1
@
@ Step 1a
/* Initlialize Static Memory Control register */
/* 初始化MSCx寄存器需要设置 */
/* RBUFFx —— Return Data Buffer vs. Streaming Behavior */
/* RRRx —— ROM/SRAM Recovery Time */
/* RDNx —— ROM Delay Next Access */
/* RDFx —— The ROM Delay First Access */
/* RBWx —— ROM Bus Width */
/* RTx —— ROM Type */
@ write msc0, read back to ensure data latches
ldr r2, =CFG_MSC0_VAL
str r2, [