嵌入式Linux驱动开发笔记(八)
- 交叉编译工具说明:
正点原子提供两种交叉编译工具链。这两种交叉编译工具链解释如下图。
我们只需要知道上面的第二种通用的交叉编译器去学习【正点原子】 I.MX6U 嵌入式 Linux 驱动开发指南这本教程。第一种 Poky 编译器是Yocto 项目编译出的,常用于编译开发板光盘 A-基础资料->1、例程源码->3、正点原子 Uboot和 Linux 出厂源码及快速编译 Qt 应用程序到开发板上运行。
1 Linaro GCC 编译器编译U-Boot和Linux内核
1.1 安装 Linaro GCC 交叉编译工具链
Linaro GCC 交叉编译工具链 版本
gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
1.2 编译U-Boot源码
# 安装依赖库
# 安装 ncurses 库, 否则编译会报错
sudo apt-get install libncurses5-dev
# 解压源码包
mkdir -p uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7
tar -vxjf uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2 -C uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7/
cd uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7
因为我们使用的是 512MB(DDR3)+8GB(EMMC)核心板,使用如下命令来编译对应的 uboot
# ARCH=arm 设置目标为 arm 架构
# CROSS_COMPILE 指定所使用的交叉编译器
# 清除工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
# 配置 uboot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
# 编译
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
编译完成以后 uboot 源码多了一些文件,其中 u-boot.bin 就是编译出来的 uboot二进制文件。uboot是个裸机程序,因此需要在其前面加上头部(IVT、DCD等数据)才能在I.MX6U上执行,u-boot.imx 文件就是添加头部以后的 u-boot.bin, u-boot.imx 就是我们最终要烧写到开发板中的 uboot 镜像文件。
1.3 编译Linux内核源码
# 安装依赖库
# 安装 lzop 库,否则内核编译会失败
sudo apt-get install lzop
# 解压源码包
mkdir -p linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7
tar -vxjf linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7.tar.bz2 -C linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7/
cd linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7
# ARCH=arm 设置目标为 arm 架构
# CROSS_COMPILE 指定所使用的交叉编译器
# 清除工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
# 配置工程
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
# 打开图形配置界面,对 Linux 进行配置
# make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
# 编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j4
编译完成以后就会在 arch/arm/boot 这个目录下生成一个叫做 zImage 的文件, zImage 就是我们要用的 Linux 镜像文件。另外也会在 arch/arm/boot/dts 下生成很多.dtb 文件,这些.dtb 就是设备树文件。
2 Poky 编译器编译U-Boot和Linux内核
2.1 安装 Poky 交叉编译工具链
# 修改Poky 交叉编译工具链脚本的权限
chmod u+x fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh
# 执行脚本安装交叉编译工具,连续敲下两次回车键确认,再输入用户密码即可
# 默认安装到/opt/fsl-imx-x11/4.1.15-2.1.0 这个默认目录
./fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh
# 在不同终端或者切换用户时需要重新使能环境变量方可使用
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
# 使能环境变量后可以使用 env 指令查看生效的环境变量
env
# 查看 gcc 版本,表明环境变量已经生效
arm-poky-linux-gnueabi-gcc --version
2.2 安装依赖库
# 先更新软列表(本地数据库)
sudo apt-get update
# 安装 lzop 工具,用于生成压缩或解压镜像
sudo apt-get install lzop
# 安装 ncurese 相关库, U-boot 或者内核菜单显示时需要
sudo apt-get install libncurses*
2.3 编译U-Boot源码
# 解压源码包
mkdir -p uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7
tar -vxjf uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7.tar.bz2 -C uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7/
cd uboot-imx-2016.03-2.1.0-g0ae7e33-v1.7
# 执行脚本编译,编译的目标文件会在当前 U-boot 源码顶层目录下的 tmp 文件夹里
# 开始编译出厂 U-boot 源码, 生成 u-boot.imx, 第一级启动引导文件
./build.sh
2.4 编译Linux内核源码
# 解压源码包
mkdir -p linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7
tar -vxjf linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7.tar.bz2 -C linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7/
cd linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7
# 执行脚本编译,编译的目标文件会在当前 Linux 源码顶层目录下的 tmp 文件夹里。
# 开始编译出厂 Linux 源码,包括 zImage, dtb 和 modules
./build.sh