u-boot2010.03 移植篇(二)-----修改start.S,支持nand启动

本文详细介绍了在u-boot2010.03移植过程中遇到的nand启动错误,通过分析错误提示,发现因缺少nand_cp.o链接导致的问题。在指定目录的Makefile中添加nand_cp.o的编译规则,然后进行尝试,发现仍然无法正常运行。接着分析启动流程,指出start.S作为第一条执行的代码需要被拷贝到0地址。由于限制,需要确保0-0x2000内的代码无符号跳转,并通过u-boot.map发现问题,最后提出使用链接脚本来指导链接器正确放置代码。
摘要由CSDN通过智能技术生成
下面开始 移植篇(二)-----修改start.S,支持nand启动
----------------------------------------------------------
使用环境
PC:     ubuntu 11.04
kernel: 2.6.32-28-generic
corss:  arm-linux-gcc 4.3.2
arm:    s3c6410
uboot:  uboot-2010-03
----------------------------------------------------------
作者:    LvApp
联系方式: 97164811@qq.com

一切版权均有作者所有,欢迎转载,请指明出处,如何修改请与本人联系,谢谢


uboot的第一阶段,其实做的事情也是比较多的,,但是一般来说,重点就是配置各种硬件环境,来保证第二阶段能正常启动.
而该部分根据不同的硬件也是不同的..像我的,s3c6410有2片dram,和一片nand..所以我为了保证我的代码能正常执行,
我必须得把代码搬移到内存里面去.不然代码在nand中也没法执行...但是为什么代码在nand中不能执行呢?其中一个比较
重要的原因就是nand并不是挂在CPU总线上面的,而是采用专门的硬件处理单元来控制的...nand控制器.
在你不添加任何代码的情况下,是不能控制外围的nand芯片的...但是怎么办.cpu内根本没有代码,怎么才能读取nand中的
代码到内存中去呢?没错-----s3c6410在启动的时候会帮我们以nand的最基本的时序.搬移nand中的前8K代码,到stepping
这样就可以执行了.而uboot的代码远比这个大..以至于我们得紧靠这部分代码,来完成剩下的代码部分的搬移....

今天的重点就是这个了.主要是来完成nand中剩余部分的uboot搬移到ram中,以便uboot能正常启动起来....好了.直接开始..

首先,你得有smdk6410_config 编译目标,不然怎么开始.....此处省略N字...请看我的移植篇第一篇...

下面开始.打开start.S (cpu/arm1176/start.S)和smdk6410.h (include/configs/smdk6410.h)
我们得一边参看头文件中的配置,一边修改代码,来达到我们的目的..
start.S 中,最开始就是一段啥?异常向量表,此处忽略,请参考分析篇中对start.S的分析

前面一部分是MMU啥的...直接招待after_copy:这个标签
什么?之前没有任何copy的东西???怎么有after_copy一说呢?
没错..所以我们得把copy代码添加在这里..从nand中把数据搬移出来,放到这之前完成,这样才对得起这个after_copy的标签
说干就干,这里我是调用的C代码,你也可以用汇编来完成的,只要功能一样就行了

这里我们得向我们的配置头文件内添加一个宏,就是 #define CONFIG_NAND_BOOT
接着,我们要去添加我们要调用的copy_from_nand

* 
 * copy U-Boot to SDRAM and jump to ram (from NAND or OneNAND) 
 * r0: size to be compared 
 * Load 1'st 2blocks to RAM because U-boot's size is larger than 1block(128k) size 
 */// 
.globl copy_from_nand 
  
copy_from_nand: 
	mov r10, lr  					/* save return address */
	
	mov r9, r0 
	/* get ready to call C functions */  
	ldr sp, _TEXT_PHY_BASE 			/* setup temp stack pointer */
	sub sp, sp, #12 
	mov fp, #0   					/* no previous frame, so fp=0 */
	mov r9, #0x1000 
	bl  copy_uboot_to_ram           /* 此函数需要添加,稍后说明。 */
3: 	tst r0, #0x0 					
	bne copy_failed 				/* 判断返回值是否失败 */
	ldr r0, =0x0c000000 			/* 判断内容是否一致 */
	ldr r1, _TEXT_PH
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值