将u-boot2014.04移植到mini2440上的一些想法

来源:互联网 发布:新手学编程怎么开始 编辑:程序博客网 时间:2024/05/21 22:37

这不是一片照搬代码的文章,想说的是一种方法。

在移植之前,问下几个问题:

1、你是否理解bootloader是做什么用的?

2、u-boot的启动过程是否清楚?

3、移植u-boot,最迷茫的地方在哪里?

好吧,第三个问题说的有点深了,貌似刚拿到代码的时候,对那里都是迷茫的,嘿嘿。

4、一般说移植是什么意思?对嵌入式?对上层应用?对跨平台?

这里说的是嵌入式中的移植,u-boot对跨平台的支持很好(跨平台是指CPU不同),常用平台PowerPC,MIPS,ARM等,当然,我现在描述的是对ARM,单板是MINI2440的移植,u-boot 2014.04版本号。

对嵌入式移植来讲,一般是先编译好源码,再将其DOWNLOAD到单板上运行;然后循环往复,不停的改代码,不停的下载代码。整个过程你会遇到很多乱七八糟的问题,当然,也需要调试方法咯。

都知道,s3c2440的启动暂时分为两种,nor flash和nand Flash;都是从第一阶段(start.S)到第二阶段(start_armboot或者board_init_f, board_init_r)。

移植,其实就是说要改的地方不多,只是针对特定的单板来做些修改,u-boot框架已经搭好,一般找一个相似的单板拷贝一份(这里是拷贝smdk2410),board.cfg中增加个单板信息,也是拷贝(老版本直接修改顶层目录下的Makefile),这样就可以编译了;然后一步一步的根据编译出的问题,进行修改。比如,少了个文件mini2440.h,就去configs目录下增加一个(会提示你问题出在哪里或者找搜索引擎)。编译阶段的问题只能这样了,不像调试阶段,可以通过单板的LED或者蜂鸣器或者串口来回应你。

调试阶段,遇到问题有几种办法,第一阶段,用LED灯,因为整个汇编的时候又不能打印到串口显示,就写个LED的汇编,哪里需要就粘贴到哪里去,看程序一步一步的走向。到第二阶段,初始化了串口,就可以通过打印来熟悉程序走向。虽然,你可以通过看代码了解程序结构,但是u-boot里面宏定义太多,总是分不清哪个是定义哪个未定义,哎,头疼。

嵌入式的调试,编码什么的,就是需要细心,耐心。只要是代码就能调试出来的决心,征服她吧,哈哈。

来点总结吧!

新版本中,start.S 先初始化CPU,再跳转到_main(crt0.S),再跳转到board_init_f,然后返回。这里有问题,我用bl board_init_f跳转之后,就再也没办法回来了,可能是这个函数里面有绝对跳转,果不其然,反汇编之后就发现其有绝对跳转,然后lr寄存器被占用,返回的时候就不知道回哪去,导致系统不断重启。解决办法是直接进了这个函数之后,不对代码进行重定位,直接跳转到board_init_r中,这样能起来到命令行。

还有其他的问题,如果有问题先屏蔽掉,让系统继续往下跑就是了,串口不用修改,直接可用。

对uboot重定位的部分代码,需要通过阅读源代码搞清楚其内存分布,在纸上画出来,每个区间占多少空间,这样再修改重定位的时候就比较方便了。

其实看代码对uboot的内存分布搞清楚之后,其他的问题也可以很方便的解决。

现在清楚开始问题的答案了么?

 

接下来要做的是,1、完善uboot存在的问题,2、引导内核,3、移植文件系统jffs2吧。

在这个过程中可能存在的问题:

nandflash 中分区的问题,即uboot,kernel,jffs2的存放地址,目前还不清楚;

uboot给kernel传送的tags,即环境变量等相关问题;

jffs2文件系统我还一无所知。

原文地址:http://www.codertown.cn/blog/?p=110

0 0