lowlevel_init函数分析
lowlevel_init函数是uboot启动阶段调用的第一个函数,主要功能就是初始化S5PV210的各个硬件部分。
#include <config.h>
#include <version.h>
#include <s5pc110.h>
#include "smdkc110_val.h"
包含头文件,主要是s5pc110.h文件,里面包含了板子的硬件寄存器的地址。
lowlevel_init:
push {lr}
压栈,保存现场,否则函数返回时返回地址就丢了。
/* check reset status */
ldr r0, =(ELFIN_CLOCK_POWER_BASE+RST_STAT_OFFSET)
//0xE0100000+0xa000
ldr r1, [r0]
bic r1, r1, #0xfff6ffff
cmp r1, #0x10000
beq wakeup_reset_pre
cmp r1, #0x80000
beq wakeup_reset_from_didle
检查复位状态,查询数据手册(section 02_system 4.10.3 RESET CONTROL REGISTER)。位清除后保留了bit16和bit19,bit16置1为睡眠模式,跳转到
wakeup_reset_pre,bit19置1,ARM将从DEEP-IDLE模式重置,因此跳转到
wakeup_reset_from_didle
/* IO Retention release */
ldr r0, =(ELFIN_CLOCK_POWER_BASE + OTHERS_OFFSET)
//0xE0100000+0xe000
ldr r1, [r0]
ldr r2, =IO_RET_REL
//((1 << 31) | (1 << 29) | (1 << 28))
orr r1, r1, r2
str r1, [r0]
恢复I/O状态,查数据手册这3位分别对应GPIO、MMC、UART,都是禁止使能。但从描述上来看会自动清零复位。 If you want to disable RELEASE_RET_GPIO, set to 1. After RELEASE_RET_G