转载地址:http://baijiahao.baidu.com/s?id=1597908272737208426&wfr=spider&for=pc
1、引言
我使用的开发板是通过公司购买的OKMX6Q-C开发板,该开发板如图1所示。该开发板自带稳定版的引导程序版本为:U-boot-2009.08。Linux内核版本为:Linux3.035。我现在分析了引导程序的一些代码,并做了一些笔记。以后,我将陆续分享给大家。希望各位能持续关注我的百家号:爱捣鼓。希望志同道合的朋友能和我一起学习进步。谢谢!
今天我先给大家分享一下,我分析U-boot-2009.08引导程序根目录下的./build.sh和./build_sd.sh这两个文件的笔记。
2、编译IMX6Q烧写到eMMC存储器的Uboot映像
编译烧写到 eMMC所用 uboot 映像,默认生产 LVDS 的 u-boot.bin。如果客户使用LCD,需要把./include/configs/mx6q_sabresd.h 中的“#define CONFIG_LVDS ”改为“/* #define CONFIG_LVDS */”,再使用命令编译:# ./build.sh
编译成功后,将在uboot2009-08目录下产生名为 “u-boot.bin”的二进制文件。该文件即我们需要烧写到eMMC上的 U-boot 映像文件。
3、作用
./build.sh的作用是:
获取宿主机CPU核心数量,用于提高make的编译效率。设置环境变量,指定目标机CPU架构、交叉编译器路径和交叉编译命令路径。执行make命令,清除编译产生的非源码文件,配置目标机和按宿主机CPU核心指定的并行线程数编译源码。
4、分析源码
1.#!/bin/sh
2.export CPUS=`grep -c processor /proc/cpuinfo`
3.export ARCH=arm
4.exportCROSS_COMPILE=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-
5.export PATH=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin:$PATH
6.make distclean
7.make mx6q_sabresd_config
8.make -j${CPUS}
第1行:指定Shell程序为宿主机Linux操作系统路径下./bin/sh。
第2行:获取宿主机CPU的信息,把宿主机CPU的核心数量传给变量“CPUS”。
第3行:指定目标机CPU采用ARM架构。
第4行:告诉宿主机采用指定路径的Freescale交叉编译器编译代码。
第5行:告诉宿主机采用指定路径的Freescale交叉编译器命令。
第6行:清除编译过程中产生的非源码文件。
第7行:执行makefile中目标机的配置命令,完成目标机相关基本参数的配置。
第8行:执行编译u-boot源码。一般输入“make”命令即可,这里采用“make -j${CPUS}”是指根据不同的CPU核心数量,执行编译时,可并行编译的线程数(每个核心对应1个线程)。这样配置,对于多核CPU可以提高编译效率,缩短编译时间。
5、分析./build_sd.sh
./build_sd.sh用于编译从SD卡启动的u-boot映像。除了执行make配置命令不同外,其代码和./build.sh相同。即把3.3章节代码第7行替换为下面代码即为./build_sd.sh的源码。
make mx6q_sabresd_sd_config
6、小结
通过build.sh和build_sd.sh可知:
(1)在make之前,设定环境变量配置ARM结构对应的交叉编译工具链。
(2)执行make distclean清除编译后的文件。
(3)如果是编译适合eMMC的uboot映像,那么,执行:make mx6q_sabresd_config
(4)若编译适合SD的uboot映像,那么,执行:make mx6q_sabresd_sd_config
(5)根据uboot映像烧写到不同的存储器,执行不同的配置命令。
(6)最后,指定主机的CPU核心数量,执行make编译uboot。编译好的u-boot.bin存放在uboot2009-08根目录下。