分类: 嵌入式
2010-08-19 14:58:10
u-boot启动代码分析(ARM S3C2410为例)
u-boot启动过程分为两个阶段
第一阶段在/cpu/arm920t目录下的start.S中(汇编语言),主要是cpu的一些设置
定义异常向量表
设置ARM工作在SVC32模式下
关闭看门狗
禁止所有中断
设置cpu工作时钟频率(采用的默认的120MHz),设置其它时钟与cpu时钟比例
配置ARM的存储控制器
将u-boot搬移到RAM中去执行
初始化堆栈
bss段地址清零
跳转到第二阶段start_armboot
第二阶段代码在/lib_arm/目录下的board.c(C语言实现),主要是外围设置的初始化
入口函数为start_armboot,顺序执行init_sequence数组中的初始化函数
init_sequence[]数组保存着基本的初始化函数指针,包括
init_fnc_t *init_sequence[] = {
cpu_init, /* 基本的处理器相关配置 -- cpu/arm920t/cpu.c */
board_init, /* 基本的板级相关配置 -- board/smdk2410/smdk2410.c */
interrupt_init,/* 初始化中断处理 -- cpu/arm920t/s
env_init, /* 初始化环境变量 -- common/env_flash.c */
init_baudrate, /* 初始化波特率设置 -- lib_arm/board.c */
serial_init, /* 串口通讯设置 -- cpu/arm920t/s
console_init_f, /* 控制台初始化阶段1 -- common/console.c */
display_banner, /* 打印u-boot信息 -- lib_arm/board.c */
dram_init, /* 配置可用的RAM -- board/smdk2410/smdk2410.c */
display_dram_config, /* 显示RAM的配置大小 -- lib_arm/board.c */
NULL,
};
flash_init()配置可用的flash /*board/smdk2410/flash.c*/
env_relocate ()配置环境变量
getenv_IPaddr ("ipaddr")从环境变量中获取ip地址等等
for (;;) {
main_loop (); /*common/main.c*/
}
无限循环,处理执行用户命令