微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > u-boot-2012.04.01流程以及移植说明

u-boot-2012.04.01流程以及移植说明

时间:11-21 来源:互联网 点击:

代码参考下面修改处。

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的时候继

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top