uboot移植之添加单板和NAND启动

在学习完裸机知识后进入到了uboot的学习,最开始对uboot的完全不了解,慢慢的去看uboot的源码,分析它的结构,最近开始做uboot的移植,在这里也不是说要展示什么,只是把自己在移植的过程中遇到的问题和一些过程记录下来,方便以后查看,好了,我们可以从官网上下载uboot,我们使用的是uboot-2012.04.01,这个版本的uboot里并没有对s3c2440单板的支持,所以,把它下载到2440板子里是不能启动的,那就需要在此基础上来创建2440的文件
1、添加2440单板的文件
这个uboot里虽然没有对s3c2440的支持,但是它里边有对2410单板的支持,我们就在2410的基础上来修改2440的文件,首先解压uboot

tar xvf uboot-2012.04.01
cd uboot-2012.04.01
cd samsung
cp smdk2410 smdk2440 -rf
cd include/configs
cp smdk2410.h smdk2440.h

然后在boards.cfg文件里添加2440的配置信息,依照2410那样
在这里插入图片描述
添加完这些之后试着编译一下

make smdk2440_config
make

编译成功,生成uboot.bin,这个时候把uboot.bin烧到2440的单板里肯定是不能成功启动的,因为我们还什么都没有做
2、使用2440启动
打开uboot启动的第一个文件分析,对于2440来说是在arch\arm\cpu\arm920t目录下的start.S
在这里插入图片描述
这个是单板启动的中断向量表,上电之后从start_code开始执行,这里我就不把代码贴出来分析了,因为uboot的第一阶段不是很复杂,大概的流程我们都知道,这里简单总结一下就行

1、设置CPU为管理模式,关看门狗,关闭中断
2、调用函数cpu_init_crit,设置cache
3、然后进入lowlevel_init函数设置SDRAM
4、然后跳出来调用函数board_init_f进行更底层的初始化

进入函数board_init_f里边,它会遍历一个函数指针数组,执行数组的每一项,进行初始化工作
在这里插入图片描述
函数指针数组里有一项是board_early_init_f,在它里边进行了时钟的初始化,我们看到这里才看到时钟的初始化,在以前自己写uboot的时候是在一开始就进行了时钟的初始化,尽早的让系统工作于一个比较高的频率,所以这里我们要改一下
在这里插入图片描述在函数lowlevel_init对SDRAM进行的初始化也不是我们对应的操作,需要进行修改,这里比较简单,把对SDRAM控制器的值改为我们以前验证过的值就可以了
在这里插入图片描述
这个时候内存和时钟已经正常工作了,进行编译,把生成的uboot.bin烧写到单板中,这个时候已经可以工作了,但是输出的信息是乱码,所以要去串口的初始化去看看,最后在波特率的设置的时候,追踪到了get_HCLK这个函数,这个函数里的宏CONFIG_S3C2440没有定义,是黑色的,那么去定义这个宏就行了,在include/configs/smdk2440.h里进行定义即可
在这里插入图片描述
然后再次进行编译,在这个过程中会发生一些问题,由于不是我当时做的,已经过去了一段时间,所以错误的信息我无法保存,但是简单的信息是下面这样的

1、boot-2012.04.01/include/asm/arch/s3c24x0.h:470: error: duplicate member 'gpacon'
这个问题是宏的问题,include/configs/smdk2440_config里去掉2410的宏,改为2440就可以了

2、s3c2410_nand.c -c
s3c2410_nand.c: In function 's3c2410_hwcontrol':
s3c2410_nand.c:57: warning: implicit declaration of function 's3c2410_get_base_nand'
s3c2410_nand.c:57: warning: initialization makes pointer from integer without a cast
s3c2410_nand.c:72: error: dereferencing pointer to incomplete type
解决:   COBJS-$(CONFIG_NAND_S3C2410) += s3c2410_nand.o
	 include/configs/smdk2440.h ##define CONFIG_CMD_NAND
3、   u-boot-2012.04.01/fs/yaffs2/yaffscfg.c:210: undefined reference to `nand_info`
这个问题的大概信息就是说yaffs2文件系统的问题,去掉就行了,
include/configs/smdk2440.h   //#define CONFIG_YAFFS2

再次编译已经没有问题了,把生成的bin再次烧到nor flash中进行启动,输出下面的启动信息,第一阶段的移植功能已经完成
在这里插入图片描述
3、添加NAND启动
要添加nand启动的话需要有对nand flash的操作,复制我们以前写过的nand flash的程序到board/samsung/smdk2440文件夹内
内存的开始地址是0x30000000,内存的大小是64M,就是0x34000000,那么内存的起始地址就是0x30000000~0x34000000,而boot的大小不会超过512k(0x80000),那么我们就把uboot放到0x34000000-0x80000 = 0x33f80000的地方去,这个地址是在start.S中定义的
在这里插入图片描述
跟踪这个宏,在include/configs/smdk2440.h把#define CONFIG_SYS_TEXT_BASE 0x0改为0x33f80000
在这里插入图片描述
要使得我们的Uboot可以从nand flash中启动就必须进行代码的重定位,我们知道,s3c2440单板从nand flash中启动的话,硬件会自动把nand的前4K代码拷贝到片内sram中运行,所以,我们必须在前4k内进行代码重定位,把整个uboot拷贝到SDRAM中去,前面我们分析原本的uboot没有在最前面进行代码的重定位,修改start.S如下
在这里插入图片描述

首先执行nand flash的初始化,然后把0赋值到r0里,因为我们的程序烧写到nand flash中,加载到片内的sram中了,它的地址是0,也就是uboot的加载地址,CPU从0地址取指令,_TEXT_BASE我们刚刚修改过0x33f80000,这个地址是我们想要把uboot加载到SDRAM中的地址,也称为程序的运行地址,把它赋值给r1寄存器,r2寄存器的值是bss_start - start,就是整个uboot的大小,把这三个值传递给函数copy_code_to_sdram,就会把uboot从nand flash中拷贝到SDRAM中去,然后执行清除BSS段,
接下来是执行ldr指令,让程序从SRAM跳转到SDRAM中去执行

关于上面的内容,我在另一篇文章中有详细的记录,
在这里插入图片描述
在上面调用到了call_board_init_f,我们让这里执行完第一阶段的初始化函数之后紧接着调用第二阶段的初始化函数board_init_r,我们需要去看一下函数需要什么参数,
在这里插入图片描述
一个参数是id,一个参数是一个地址,gd_t我们知道它是一个全局变量,那么另一个参数dest_addr是什么意思,我们在代码里找到如下的信息
在这里插入图片描述
ok.接下来看uboot的内存分布图,从图中可以明显的看到TEXT BASE - CFG_MALLOC_LEN = 这里的malloc_start,所以第二个参数是TEXT BASE,就是之前说的0x33f80000的地址,
在这里插入图片描述
对第二阶段的函数需要的参数明确了之后就可以来调用它了,这里还需要修改第一阶段函数里的一些内容
在这里插入图片描述
在函数board_init_f里我们根据上面的代码和内存分布图可以判断addr在这里指向了uboot的开始地址,所以在程序里把这个值针对2440单板就确定下来
在这里插入图片描述
在函数的最后让它返回全部变量gd_t的地址,并且去掉原来就有的代码重定位的函数,因为我们在前面已经做好了,这里修改了之后记得要修改对应的头文件,最后编译测试,还要一个小问题,就是我们实际编译出来的uboot已经超出了512K,所以之前为uboot预留的空间是不够的,所以在程序里重新修改了一下宏定义
在这里插入图片描述
这并不是一个大问题,只需要在测试的时候注意一下即可。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值