代码参考下面修改处。
7、u-boot启动第二阶段:给内核传递参数
call_board_init_f:
ldr r0,=0x00000000
bl board_init_f
ldr r1, _TEXT_BASE
bl board_init_r
..........
修改board_init_f:
//addr -= gd->mon_len;
//addr &= ~(4096 - 1);
addr = CONFIG_SYS_TEXT_BASE;
//addr = _TEXT_BASE;不用函数计算得到的地址,强制设置u-boot的链接地址为0x33f00000
修改board_init_f, 把relocate_code去掉
//修改include/common.h文件中board_init_f的返回值是unsigned int
返回:return (unsigned int)id;
给board_init_r函数使用,并设置board_init_r函数第二个参数:目的地址为_TEXT_BASE,即CONFIG_SYS_TEXT_BASE
u-boot启动时SP指向SDRAM的刚开始低地址位置,在代码重定位以后要从新设置栈指针SP,更改栈指针SP:
在汇编start.S里添加:
.globl base_sp
base_sp:
.long 0
在函数board_init_f里调用时加上extern long base_sp;声明即可当做变量使用,最后把:
base_sp = addr_sp;即可
修改后:
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 // 8-byte alignment for ABI compliance //
bl nand_init_ll
mov r0, #0
//ldr r1, =_start
ldr r1, _TEXT_BASE
//ldr r2, =__bss_start
//sub r2, r2, r1
ldr r2, _bss_start_ofs
bl copy_code_to_sdram_ll //重定位
bl clear_bss_ll //清除BSS
ldr pc, =call_board_init_f //跳到SDRAM中运行call_board_init_f
// 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
注意:上面三段代码为另外手动添加,因为u-boot源码中的:
#ifdef CONFIG_NAND_SPL
ldr r0, _nand_boot_ofs
mov pc, r0
_nand_boot_ofs:
.word nand_boot
#else
ldr r0, _board_init_r_ofs
adr r1, _start
add lr, r0, r1
add lr, lr, r9
mov r0, r5
mov r1, r6
mov pc, lr
_board_init_r_ofs:
.word board_init_r - _start
#endif
这段代码就是为了实现调用board_init_r的功能,故省略这一步直接跳过去运行。
8、跳到SDRAM中运行call_board_init_f
ldr pc, =call_board_init_f
9、乱码,查看串口波特率的设置,发现在get_HCLK里没有定义CONFIG_S3C2440
①更改get_HCLK里没有定义CONFIG_S3C2440
board_init_f
init_sequence
serial_init
serial_init_dev
_serial_setbrg
get_PCLK
get_HCLK
处理措施:include/configs/smdk2440.h: 去掉CONFIG_S3C2410
#define CONFIG_S3C2440
在smdk2440.h
#ifdef CONFIG_CMD_NAND
#define CONFIG_NAND_S3C2410
解决办法:暂时去掉如下行
//#define CONFIG_CMD_NAND
再次编译,出现错误:
fs/yaffs2/libyaffs2.o: In function `yaffs_StartUp:
/home/share/jz2440/source/u-boot/u-boot-2012.04.01/fs/yaffs2/yaffscfg.c:210: undefined reference to `nand_info
解决方法:将#define CONFIG_YAFFS2注释掉
10、去除编译条件pie,在(u-boot-2012.04.01/u-boot-2012.04.01/arch/arm/config.mk)
# LDFLAGS_u-boot += -pie
11、修改代码支持Nor Flash
在board_init_r函数中:
flash_size = flash_init();
if (flash_size > 0) {
# ifdef CONFIG_SYS_FLASH_CHECKSUM
char *s = getenv("flashchecksum");
print_size(flash_size, "");
//
// Compute and print flash CRC if flashchecksum is set to y
//
// NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
//
if (s && (*s == y)) {
printf(" CRC: X", crc32(0,
(const unsigned char *) CONFIG_SYS_FLASH_BASE,
flash_size));
}
putc(\n);
# else // !CONFIG_SYS_FLASH_CHECKSUM //
print_size(flash_size, "\n");
# endif // CONFIG_SYS_FLASH_CHECKSUM //
}
else {
puts(failed);
hang();
}
#endif
上面代码在nand flash启动时nor flash是没有办法访问的,flash_init之后没有找到nor flash,故打印失败,程序卡死在hang();
修改:当程序找不到nor flash的时候继