1 cd board/samsung/
cp smdk2410/ smdk2440/ -rf
cp smdk2410.h smdk2440.h
cd ../../
修改boards.cfg
仿照
smdk2410 arm arm920t - samsung s3c24x0
添加:
smdk2440 arm arm920t - samsung s3c24x0
make smdk2440_config
make
编译uboot,烧写到nor flash中,测试运行。应该是不能运行的!
2. 分析u-boot: 通过链接命令分析组成文件、阅读代码分析启动过程
a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH
b. 如果bootloader比较大,要把它重定位到SDRAM
c. 把内核从NAND FLASH读到SDRAM
d. 设置"要传给内核的参数"
e. 跳转执行内核
2.1 _start: b start_code
2.2 set the cpu to SVC32 mode 设置CPU工作在管理模式
2.3 /* turn off the watchdog */关看门狗,关中断
2.4 /* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
时钟设置不对,此处需要修改
2.5 调用cpu_init_crit用来对指令\数据cache,关MMU等协处理器操作
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
2.6 调用 call_board_init_f 设置堆栈,然后调用C函数 board_init_f 位于arch\arm\lib\board.c
call_board_init_f
2.7 调用 init_sequence 数组中的所有函数
board_init_f
board_early_init_f //设置系统时钟,GPIO等
relocate_code(addr_sp, id, addr);//重定位代码
2.8 relocate把nor中的代码复制到sdram中。
2.8.1 nor中的代码复制到sdram
2.8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使"基于0地址编译得到的地址"
现在把程序复制到了SDRAM
需要修改代码,把"基于0地址编译得到的地址"改为新地址
2.8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs
2.9 清bss
2.10 调用C函数board_init_r:第2阶段的代码
ldr r0, _board_init_r_ofs
adr r1, _start
add lr, r0, r1
add lr, lr, r9
/* setup parameters for board_init_r */
mov r0, r5 /* gd_t */
mov r1, r6 /* dest_addr */
/* jump to it ... */
mov pc, lr
/*修改lr的值把_board_init_r_ofs 的值加上r1(值为_start),再加上r9(偏移地址长度),
得到一个返回值,也就是函数 board_init_r 的入口地址。从而实现程序从Nor运行到sdram
中运行的跳转*/
_board_init_r_ofs:
.word board_init_r - _start