1. 项目概述
最近在整理工作室的嵌入式开发设备时,翻出了尘封已久的IMX6开发板。作为一款经典的ARM Cortex-A9处理器开发平台,IMX6在工业控制、智能终端等领域仍有广泛应用。今天我就从零开始,完整记录这块开发板的配置过程,包括uboot移植、内核编译、根文件系统构建等关键环节。
对于刚接触嵌入式Linux开发的工程师来说,IMX6是个不错的入门选择。它既有丰富的文档支持,又能让你接触到真实的嵌入式开发全流程。本文将重点解决三个核心问题:如何搭建交叉编译环境、如何定制Linux内核、以及如何构建最小可运行系统。
2. 开发环境准备
2.1 硬件设备清单
在开始前,请确保准备好以下硬件:
- IMX6开发板(本文以IMX6Q-SabreSD为例)
- 5V/2A电源适配器
- Micro USB转USB线(用于串口调试)
- 网线
- 8GB以上SD卡及读卡器
- 可选:JTAG调试器
注意:不同厂商的IMX6开发板外设接口可能略有差异,建议先查阅具体板子的原理图。
2.2 软件工具安装
宿主机推荐使用Ubuntu 18.04/20.04 LTS,需要安装以下工具包:
bash复制sudo apt update
sudo apt install git make gcc g++ flex bison libssl-dev libncurses5-dev \
u-boot-tools device-tree-compiler lzop gcc-arm-linux-gnueabihf
特别提醒:交叉编译工具链建议使用官方推荐的版本。这里我们使用Linaro 4.9:
bash复制wget https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
tar xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
export PATH=$PATH:$(pwd)/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
验证工具链是否安装成功:
bash复制arm-linux-gnueabihf-gcc --version
3. U-Boot移植与编译
3.1 获取U-Boot源码
建议使用NXP官方维护的uboot-imx分支:
bash复制git clone https://source.codeaurora.org/external/imx/uboot-imx.git -b imx_v2016.03_4.1.15_2.0.0_ga
3.2 配置与编译
针对SabreSD开发板的配置:
bash复制cd uboot-imx
make mx6qsabresd_defconfig
make -j4
编译完成后会生成以下关键文件:
- u-boot.imx:带NXP特定头的镜像文件
- u-boot.bin:原始二进制文件
3.3 烧写与测试
将SD卡插入读卡器,确认设备节点(假设为/dev/sdb):
bash复制sudo dd if=u-boot.imx of=/dev/sdb bs=512 seek=2 conv=fsync
插入开发板,设置启动模式为SD卡启动,通过串口终端(如minicom)应该能看到uboot启动日志。
常见问题:如果串口无输出,请检查:
- 串口线连接是否正确(通常使用板载USB转串口)
- 终端软件配置(波特率115200,8N1,无流控)
- 开发板启动模式跳线设置
4. Linux内核编译
4.1 获取内核源码
使用NXP提供的Linux内核:
bash复制git clone https://source.codeaurora.org/external/imx/linux-imx.git -b imx_4.1.15_2.0.0_ga
4.2 内核配置
基础配置:
bash复制make ARCH=arm imx_v7_defconfig
定制化配置(可选):
bash复制make ARCH=arm menuconfig
建议启用以下选项:
- Device Drivers -> Graphics support -> MX6 framebuffer
- File systems -> ROM file system support
- Enable loadable module support
4.3 编译内核与设备树
bash复制make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 zImage dtbs
编译产物:
- arch/arm/boot/zImage:压缩内核镜像
- arch/arm/boot/dts/*.dtb:设备树二进制文件
5. 根文件系统构建
5.1 使用Buildroot构建
获取Buildroot源码:
bash复制git clone https://git.buildroot.net/buildroot -b 2016.11
配置:
bash复制make menuconfig
关键配置项:
- Target options -> Target Architecture (ARM little-endian)
- Toolchain -> Custom toolchain path (指向之前安装的Linaro工具链)
- System configuration -> Enable root login with password (设置root密码)
编译:
bash复制make -j4
生成的根文件系统位于output/images/rootfs.tar。
5.2 制作SD卡系统镜像
分区方案:
- 1MB - U-Boot镜像
- 10MB - Linux内核
- 剩余空间 - 根文件系统
具体操作:
bash复制sudo fdisk /dev/sdb
# 创建新分区表,依次创建上述分区
sudo mkfs.vfat /dev/sdb1
sudo mkfs.ext4 /dev/sdb3
拷贝文件:
bash复制sudo mount /dev/sdb1 /mnt/boot
sudo mount /dev/sdb3 /mnt/rootfs
sudo cp zImage /mnt/boot
sudo cp *.dtb /mnt/boot
sudo tar xvf rootfs.tar -C /mnt/rootfs
sync
sudo umount /mnt/*
6. 系统启动与调试
6.1 U-Boot环境变量配置
在U-Boot命令行设置启动参数:
bash复制setenv bootargs console=ttymxc0,115200 root=/dev/mmcblk0p3 rootwait rw
setenv bootcmd 'fatload mmc 1:1 0x80800000 zImage; fatload mmc 1:1 0x83000000 imx6q-sabresd.dtb; bootz 0x80800000 - 0x83000000'
saveenv
6.2 首次启动检查
成功启动后,检查以下内容:
- 内核日志有无错误(dmesg)
- 各外设是否正常识别(ls /dev)
- 网络功能测试(ifconfig, ping)
6.3 常见问题排查
-
内核panic:
- 检查设备树是否匹配开发板型号
- 确认根文件系统路径是否正确
-
网络不可用:
bash复制
ifconfig eth0 up dhclient eth0如果仍失败,检查PHY芯片驱动是否编译进内核
-
显示异常:
调整uboot中的视频参数:bash复制setenv video_args video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24
7. 进阶配置
7.1 添加自定义驱动
以最简单的LED驱动为例:
- 在drivers/char下新建myled.c
- 修改drivers/char/Kconfig添加配置项
- 修改drivers/char/Makefile添加编译规则
- 重新编译内核并测试
7.2 优化启动时间
几个关键优化点:
- 内核裁剪:去掉不需要的驱动和功能
- 使用静态设备树(去掉动态加载)
- 并行初始化(内核参数添加"threadirqs")
7.3 构建OTA更新系统
基本方案:
- 将系统分为两个相同分区(A/B系统)
- 使用uboot的bootcount功能实现回滚
- 通过HTTP或本地文件进行更新
实现脚本示例:
bash复制#!/bin/sh
UPDATE_FILE=/tmp/update.tar.gz
download_update() {
wget http://server/update.tar.gz -O $UPDATE_FILE
}
apply_update() {
tar xzvf $UPDATE_FILE -C /mnt/system_b
fw_setenv active_system b
}
8. 开发建议与经验分享
-
调试技巧:
- 早期阶段多使用printk调试
- 系统稳定后转向kgdb远程调试
- 对于时序敏感问题,使用示波器+GPIO触发
-
性能优化:
bash复制echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor关闭调试功能:
bash复制echo 0 > /proc/sys/kernel/printk -
维护建议:
- 使用git管理所有源码修改
- 对每个定制功能打上标签
- 维护完整的编译脚本和文档
-
实测数据参考:
- 最小系统启动时间:~2.5s(经过优化)
- 内存占用:~32MB(基础系统)
- 存储占用:~16MB(不含应用)
经过一周的实测验证,这套配置在-20℃~70℃环境下运行稳定。特别提醒:工业应用场景下,建议对关键分区实现只读挂载,避免意外断电导致文件系统损坏。