读书人

0K6410学习之初始Uboot移植

发布时间: 2013-04-02 12:35:26 作者: rapoo

0K6410学习之初步Uboot移植

一个人跌跌撞撞终于来到了Uboot的移植,经过这几天对uboot源代码的分析,可以说得上是获益匪浅,也可以说收获不多吧,唉,知识实在是匮乏啊,Uboot代码中相当多的句子看不明白,很多都是猜测性的,或许我有生之年也写出那样的代码吧,不发牢骚了,开始今天的学习了。

好吧,既然是Uboot的移植,那么我们首先搞清楚为什么要对Uboot进行移植呢?两个原因,uboot虽然名为通用的bootloader,但是这个通用得打上引号。每个人手上开发板的架构以及外设资源是不一样的,所以,我们需要对Uboot上的一些驱动程序等加以修改,称为板级移植,此为原因之一;同样根据我们使用的CPU不同,那么我们uboot上一些寄存器等也需要进行修改,称为片级移植,此为原因之二。

恩,原因已经分稍稍分析了一下,那就开始uboot的移植吧!

一、 移植前的准备

1、 arm-linux-gcc4.3.2;2、u-boot-2010.03;3、OK6410开发板;redhat5.0;4、SD卡(用于烧写uboot,没网络啊!)。

二、 第一步:删繁取简

得到UBOOT后,将u-boot-2010.03.tar FZ到redhat中去,(为避免出现不必要的麻烦。个人建议一切操作在linux下面进行,好像xp下面的空格和linux下面的空格是不一样的,装个tools一切麻烦解决)解压后得到u-boot-2010.03。

1、 进入u-boot-2010.03根目录下面的board文件夹,删除samsung之外的所有文件夹。

2、 进入u-boot-2010.03.根目录下面的cpu文件夹 ,删除arm1176之外的所有文件夹。

3、 进入u-boot-2010.03.根目录下面的include文件夹,删除以asm-开头的(一定要注意)除asm-arm、asm-generic之外的文件夹。

4、 回到根目录下面,删除以lib_开头的出去lib_arm、lib_generic之外的文件夹。

5、 进入 u-boot-2010.03\include\configs,删除 smdk6400.h以外的 其它的东西。

6、 修改u-boot-2010.03下面的makefile,将CROSS_COMPILE ?=修改为CROSS_COMPILE?=arm-linux-,增添交叉编译工具链。

7、 初步尝试 make smdk6400_config,然后执行make。编译完成后可以看到下面的信息。

0K6410学习之初始Uboot移植

注意在第一步的过程中可能会出现如下问题

0K6410学习之初始Uboot移植

这肯定的是你没有按步骤删除导致的,也就是删了一些不该删除得东西。初步编译后的uboot还是不能给我么开发板用的,下面就开始做一定修改。

还有一点就是需要进入u-boot-2010.03根目录才能执行make。。我之前经常犯这种错误。。。

三、 第二:对号入座

先make distclean吧。

1、 进入 u-boot-2010.03\board\samsung, 把除了 smdk6400 之外的文件夹删除, 同时建立一个文件夹 smdk6410, 把 smdk6400 文件夹里面的东西复制到smdk6410 文件夹中。进入 smdk6410 文件夹,将smdk6410文件夹下面所有文件中出现了6400的改为6410(保险起见)。

2、 进入 u-boot-2010.03\include\asm-arm ,把除了 arch-s3c64xx 、proc-armv 之外的文件夹删除。进入 arch-s3c64xx,建立 s3c6410.h,将 s3c6400.h 文件里面的程序原原本本复制到s3c6410.h。同时将arch-s3c64xx文件夹下面所有出现了smdk6400的改为smdk6410。

3、 进入u-boot-2010.03\nand_spl\board\samsung,建立smdk6410文件夹,同事把smdk6400中的内容FZ到smdk6410中去,接着把smdk6410中所有文件中出现了6400的地方改成6410。

4、 进入u-boot-2010.03/include/configs,复制smdk6400.h,并且将副本改为smdk6410.h,同时里面出现了的6400全部改为6410.

5、 进入u-boot-2010.03根目录的makefile文件,将里面的6400全部改为6410。

6、 执行make smdk6410_config、make。这时候会出现下面的编译结果,唯一的区别就是6400变成了6410。但是还是不能用,完事之后,就开始深度修改吧,幸好之前分析了一下uboot源码,不然,真特么是“黑匣子”移植呀!

0K6410学习之初始Uboot移植

四、 第三步:初步移植

1、 打开start.S,之前已经分析了启动代码,现在就不细述,第一个修改地方,增加了一条协处理命令。

0K6410学习之初始Uboot移植

2、 第二个代码修改的地方,用#if 0注释掉以下代码。

0K6410学习之初始Uboot移植

3、 在bl lowlevel_init后面插入如下代码,判断启动方式。

0K6410学习之初始Uboot移植

4、在 u-boot-2010.03\cpu\arm1176 下面新建一个 nand_cp.c 文件,c文件中的代码如下:


6、进入u-boot-2010.03\nand_spl\board\samsung \smdk6410,修改makefile中的内容,修改后如下。

0K6410学习之初始Uboot移植

接下来就是

0K6410学习之初始Uboot移植

7、在第二个#ifndef CONFIG_NAND_SPL后面增加如下代码,这里的顺序可不能搞错了,否则就会报错,如果编译过程中出现了未定义,那八成就是这里出问题了。


8、 最后还需要修改链接脚本那!

u-boot.lds和u-boot_nand.lds两个链接脚本中都需要做修改,路径分别为u-boot-2010.03 /CPU/ARM1176/uboot.lds, u-boot-2010.03/BOARD/SAMSUNG/SMDK6410/u-boot_nand.lds,修改内容如下:

0K6410学习之初始Uboot移植

10、还是一样编译吧,make了,由于没有网络,不好检测网卡移植是否成功,所以网卡移植就先不说了,最后贴上串口上打印的信息如下:

0K6410学习之初始Uboot移植

好了,一下又到了12点多了,不能再熬下去了,脸上长包啦~~~,这学期被这东西整的人不像人的,没办法啊,今天的总结就写到这里了,睡觉去。。。。

读书人网 >编程

热点推荐