移植新版本u-boot之三 --- 支持nand启动

先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题

本文主要实现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启动,至于错误后面再继续解决

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值