先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
本文主要实现smdk2440的uboot支持nand启动
a. 原来的链接脚本u-boot.lds在链接时,加了"-pie"选项,使得uboot.bin多了"(.rel)","*(.dynsym)",导致uboot程序非常大,不利于从nand启动,重定位之前的代码应该小于4k
.rel.dyn : {
__rel_dyn_start = .;
*(.rel*)
__rel_dyn_end = .;
}
.dynsym : {
__dynsym_start = .;
*(.dynsym)
}
b. 去掉"-pie"选项
grep "\-pie" * -nR
arch/arm/config.mk:75:LDFLAGS_u-boot += -pie 去掉这行
c. 参考\第1期和第2期衔接视频教\32th_my_bootloader\2th中的start.s, init.c修改代码
1.修改 start.S 按照上面的课程,实现代码重定位,清除bss段
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
bl clear_bss
ldr pc, =call_board_init_f
``
2.复制 init.c 文件到/board/samsung/smdk2440 并解决函数重名等问题,同时修改当前目录下的Makefile
COBJS := smdk2410.o init.o
3.修改 smdk2440.h,问题为什么这里要设置为0x33f00000?因为nand flash内存是64MB,即0x34000000,0x34000000-0x33f00000=1024k,一般地我们的uboot大小不超过512k
#define CONFIG_SYS_TEXT_BASE 0x33f00000
4.因为修改后的uboot代码中已经实现了重定位功能,需要去掉原来uboot中实现的重定位,修改board_init_f(arch/arm/lib/board.c)函数,把重定位代码去掉
//relocate_code(addr_sp, id, addr);
5.继续修改board_init_f函数,使得函数返回一个id值,添加语句如下,这个id值正好给第二阶段使用
return (unsigned int)id;
/* unsigned int的值存在r0里,正好给board_init_r */
ldr r1, _TEXT_BASE
ldr sp, base_sp /* 重新设置栈指针 */
/* 调用第二阶段代码 */
bl board_init_r
6.修改链接脚本u-boot.lds,把start.S, init.c, lowlevel.S等文件放在最前面,新增如下一行代码:board/samsung/smdk2440/libsmdk2440.o (.text)
.text :
{
__image_copy_start = .;
CPUDIR/start.o (.text)
board/samsung/smdk2440/libsmdk2440.o (.text)
*(.text)
}
7.修改arch/arm/cpu/u-boot.lds,在.text部分增加如下语句
board/samsung/smdk2440/libsmdk2440.o (.text)
注意这样做的前提是目录下还存在这个库文件,如果我们之前使用了 make distclean命令,这个库会被先删掉,我们可以拷贝一份别的过来改一下名字,然后在make
8.继续修改board_init_f函数
//addr -= gd->mon_len;
//addr &= ~(4096 - 1);
addr = CONFIG_SYS_TEXT_BASE; /* addr = _TEXT_BASE */
9.烧写韦老师提供的u-boot.bin,以便可以通过命令烧写我们自己编译的u-boot.bin,烧写步骤如下
烧写到nand flash
(1)利用韦老师的uboot烧写我们编译的uboot,命令 usb 1 30000000,然后利用dnw烧写
(2)nand erase 0 80000
(3)nand write 30000000 0 80000
10.烧写完成之后,设置开发板为nand启动,重新上电,发现有输出,说明我们的uboot代码已经支持了nand启动,至于错误后面再继续解决
493

被折叠的 条评论
为什么被折叠?



