今天开始移植U-boot的官方2013.10版本,做一下笔记,以备日后所需
移植的时候有一点感想,就是最好别注释掉不对的源码,定义的地方千万别动,尽量修改调用的地方,这样可以极大的避免出错;
0.取得合适版本的源码
- 版本不是越新越好,因为越新越臃肿,所以选择的版本只要含有我们板子上的cpu相关的代码即可。此外U-boot的2013版本之后,其配置体系发生了极大的变化,它引入了kernel的配置体系(Kbuild、Kconfig、menuconfig),从而可以在图形界面下配置U-boot。虽然配置体系发生了变化,但是U-boot的代码本身没有太大的变化,在此我们选用2013.10版本进行移植
- 取得源码后,如果运气好,里面会有和我们SOC相关的代码(可以在board文件夹下的厂商文件夹下找找名字)。但是一般情况下,厂商会把名字取的很晦涩,怎么寻找是一个问题。以三星的s5pv210为例,进入board/samsung下,发现根本找不到s5pv210这个名字,然后我们再去include目录下找找头文件,也挺难找的,不过最后还是在s5p_goni.h中找到了s5pc110的宏定义,由此可确认include/configs/s5p_goni.h,对应的board在uboot/board/samsung/goni
1.检查配置和编译部分
- 上手检查主Makefile,发现前面大部分相同,可我们当make s5p_goni_config配置时需要的伪目标 s5p_goni_config在主Makefile中不存在!其实取而代之的是这样的一个伪目标:
目标行首的%代表是通配符,当我们输入任何xxx_config时,都会到这里执行此伪目标;操作行首的@代表静默执行,MKCONFIG这个变量代表的是源码目录下最关键的一个shell文件即mkconfig,这个shell文件负责了make之前的配置过程,这段代码在执行$(MKCONFIG)前还把-A 、$(@:_config=)这2个参数传给了mkconfig,其中参数$(@:_config=)是引用了一个替换函数,将该规则中的目标(用@表示)中的_config用空替换,故 $(@:_config=)的值为s5p_goni - 还有一个疑问,传这两个参数明显不够啊…以前的SOC、架构、板级等参数去哪里了?好了,那么到mkconfig脚本中再去检查检查,发现mkconfig开头的参数解析这里做了些手脚:
这堆代码比较复杂,还涉及到了正则表达式,我们不用管它的具体实现,只需知道它功能是根据输入的2个参数(其中有个是s5p_goni),去boards.cfg中搜索,找到和s5p_goni有关系的一行(其实就是以前的SOC、架构、板级等参数)
然后把那一行传给变量line,后面再将line中的内容以空格为间隔分别赋值给$1$2……$8,如此一来,mkconfig脚本中就有了SOC、架构、板级等参数。
其实这一块的本质就是把以前的版本主Makefile中各种开发板的配置伪目标抽离出来,然后写到了一个独立文件boards.cfg中 - 配置部分貌似没问题,接下来检查编译工具链,根据 可知U-boot配置及编译阶段流程宏观分析,交叉编译