前言
在前面,了解了Bootloader的作用以及从0写一个Bootloader之后,最近花了差不多一个星期学习韦东山老师的JZ2440移植UBOOT 2012.04.1,看了视频和参考博客园NQian的博客进行学习。我制作的最新补丁:https://github.com/sanjaywu/UBOOT_2012.04.1_JZ2440_patch。
一、JZ2440移植UBOOT 2012.04.1笔记
以下笔记全部来自博客园NQian的笔记,讲得非常详细,我也是参照他的博客进行学习的,收益很大,点击跳转可以直接到他的博客看。
1.移植uboot-分析uboot启动流程(详解)
2.移植uboot-添加2440单板,并实现NOR、NAND启动
3.移植uboot-使板卡支持nor、nand
4.移植uboot-使uboot支持DM9000网卡
5.移植uboot-设置默认环境变量,裁剪,并分区
6.移植uboot-支持yaffs烧写,打补丁
二、和韦东山老师移植存在的区别
我是参考博客园NQian的笔记进行学习,里面主要的不同是在调用第2阶段的代码、relocate_code的处理上有些不一样以及重新设置栈。
1、韦东山老师的处理方法
(1)、在board.c中修改函数board_init_f
,将该函数改为有返回值,修改函数为:unsigned int board_init_f(ulong bootflag)
,用于返回id
(存放 gd_t结构体的首地址)。
(2)、将board_init_f
函数后面的relocate_code(addr_sp, id, addr);
注释去掉。
(3)、在include\common.h里面把void board_init_f (ulong) __attribute__ ((noreturn));
改为unsigned int board_init_f(ulong bootflag)
。
(4)、根据前面三个步骤,再来调用第二阶段代码board_init_r
,代码如下:
/* Set stackpointer in internal RAM to call board_init_f */
call_board_init_f:
ldr r0,=0x00000000
bl board_init_f
/* unsigned int的值存在r0里, 正好给board_init_r */
ldr r1, _TEXT_BASE
ldr sp, base_sp /* 重新设置栈 */
/* 调用第2阶段的代码 */
bl board_init_r
(5)、base_sp定义如下:
在
/* IRQ stack memory (calculated at run-time) + 8 bytes */
.globl IRQ_STACK_START_IN
IRQ_STACK_START_IN:
.word 0x0badc0de
后面添加:
.globl base_sp
base_sp:
.long 0
(6)把relocate_code全部去掉:
/*
* void relocate_code (addr_sp, gd, addr_moni)