1. IMX6ULL开发板入门指南
第一次拿到IMX6ULL开发板时,很多开发者都会面临同样的困惑:如何快速搭建开发环境?如何编译出可用的系统镜像?如何将镜像正确烧录到开发板?这些问题看似基础,但实际操作中却暗藏不少玄机。作为一款广泛应用于工业控制、智能家居等领域的ARM Cortex-A7处理器,IMX6ULL以其出色的性价比和丰富的接口资源赢得了众多嵌入式开发者的青睐。
我在过去三年里经手过数十个基于IMX6ULL的项目,从最初的手忙脚乱到现在的游刃有余,积累了不少实战经验。本文将系统性地分享从源码编译到系统启动的全流程操作要点,特别会重点讲解那些官方文档没有明确说明,但实际开发中必然会遇到的"坑"。无论你是刚接触IMX6ULL的新手,还是希望优化现有开发流程的老手,这些经验都能为你节省大量试错时间。
2. 开发环境搭建与工具链配置
2.1 主机系统选择与基础准备
对于IMX6ULL开发,官方推荐使用Ubuntu 18.04 LTS作为主机系统。这个版本与NXP提供的BSP包兼容性最好,能避免很多因系统版本差异导致的问题。我个人的经验是,即使你习惯使用其他Linux发行版,也建议专门为IMX6ULL开发准备一个Ubuntu 18.04的环境。
安装完基础系统后,需要安装以下必备工具包:
bash复制sudo apt-get install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf \
build-essential git-core libncurses5-dev lzop u-boot-tools \
flex bison gperf libssl-dev
特别注意:不要使用Ubuntu自带的交叉编译工具链,必须使用NXP官方提供的版本,否则会出现链接库不兼容的问题。
2.2 获取官方BSP包
NXP为IMX6ULL提供了完整的Linux BSP(Board Support Package),这是开发的基础。获取方式有两种:
- 从NXP官网直接下载L4.1.15_2.0.0版本BSP(最新稳定版)
- 通过repo工具同步源码(推荐,便于后续更新):
bash复制mkdir imx6ull-bsp && cd imx6ull-bsp
repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-sumo -m imx-4.14.98-2.0.0_ga.xml
repo sync
同步完成后,目录结构应包含以下关键内容:
uboot-imx: U-Boot引导程序源码linux-imx: Linux内核源码fsl-release-bsp: 板级支持包mfgtools: 官方烧录工具
2.3 交叉编译工具链配置
NXP提供的工具链位于/opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi,需要在每次编译前执行:
bash复制source /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
验证工具链是否生效:
bash复制arm-poky-linux-gnueabi-gcc --version
应显示类似arm-poky-linux-gnueabi-gcc (GCC) 7.3.0的输出。
3. U-Boot编译与配置
3.1 获取适合的U-Boot版本
虽然IMX6ULL支持主线U-Boot,但建议使用NXP官方维护的分支,兼容性更好。进入uboot-imx目录后,先切换合适的分支:
bash复制git checkout origin/imx_v2017.03_4.9.88_2.0.0_ga -b my_imx6ull
3.2 配置与编译
IMX6ULL常见的两种配置:
mx6ull_14x14_evk_defconfig:适用于14x14mm封装评估板mx6ull_9x9_evk_defconfig:适用于9x9mm封装评估板
编译命令示例:
bash复制make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
编译成功后,会生成以下关键文件:
u-boot.imx:最终可烧录的U-Boot镜像u-boot.bin:原始二进制文件u-boot.srec:Motorola S-record格式文件
3.3 常见问题排查
问题1:编译时报错imx6ull_pins.h: No such file or directory
解决:这是因为缺少板级头文件,需要先执行:
bash复制make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_defconfig
问题2:U-Boot启动时卡在Starting kernel...
解决:通常是设备树不匹配,检查CONFIG_DEFAULT_DEVICE_TREE配置是否正确。
4. Linux内核编译与定制
4.1 内核配置选择
进入linux-imx目录后,首先选择基础配置:
bash复制make ARCH=arm imx_v7_defconfig
对于IMX6ULL,需要特别关注以下配置选项:
CONFIG_SOC_IMX6ULL=y:启用IMX6ULL支持CONFIG_ARM_IMX6Q_CPUFREQ=y:CPU频率调节- 文件系统支持(根据需求选择ext4、yaffs2等)
4.2 设备树定制
设备树文件位于arch/arm/boot/dts/目录,IMX6ULL常用的有:
imx6ull-14x14-evk.dts:评估板标准配置imx6ull-9x9-evk.dts:小型封装版本
修改设备树后,需要重新编译:
bash复制make ARCH=arm dtbs
经验分享:在修改设备树时,建议先备份原文件,每次只修改一个节点,便于问题定位。
4.3 内核编译与输出
完整编译命令:
bash复制make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8 zImage dtbs modules
编译产物:
arch/arm/boot/zImage:压缩内核镜像arch/arm/boot/dts/*.dtb:设备树二进制文件- 各模块的
.ko文件
5. 根文件系统构建
5.1 选择文件系统类型
IMX6ULL支持多种根文件系统:
- Buildroot:轻量级,适合资源受限场景
- Yocto:功能强大但复杂,适合产品化部署
- Debian:功能丰富,适合快速原型开发
这里以Buildroot为例说明配置过程。
5.2 Buildroot配置
获取Buildroot源码:
bash复制git clone https://github.com/buildroot/buildroot.git
cd buildroot
make menuconfig
关键配置项:
code复制Target options ->
Target Architecture -> ARM (little endian)
Target Architecture Variant -> cortex-A7
Target ABI -> EABIhf
Floating point strategy -> NEON
Toolchain ->
Toolchain type -> External toolchain
Toolchain -> Custom toolchain
Toolchain path -> /opt/fsl-imx-x11/4.1.15-2.0.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi
Toolchain prefix -> arm-poky-linux-gnueabi
5.3 添加自定义软件包
在package/目录下创建自定义包的目录结构:
code复制myapp/
├── Config.in
├── myapp.mk
└── myapp-1.0.tar.gz
Config.in示例:
makefile复制config BR2_PACKAGE_MYAPP
bool "My Custom Application"
help
This is a custom application for IMX6ULL.
myapp.mk示例:
makefile复制MYAPP_VERSION = 1.0
MYAPP_SOURCE = myapp-$(MYAPP_VERSION).tar.gz
MYAPP_SITE = /path/to/package
define MYAPP_BUILD_CMDS
$(MAKE) CC="$(TARGET_CC)" -C $(@D)
endef
define MYAPP_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/myapp $(TARGET_DIR)/usr/bin
endef
$(eval $(generic-package))
6. 镜像烧录与启动
6.1 烧录工具选择
IMX6ULL支持多种烧录方式:
- MFGTool:NXP官方工具,通过USB OTG烧录
- uuu(Universal Update Utility):开源替代方案
- TF卡烧录:适用于批量生产
这里重点介绍MFGTool的使用方法。
6.2 使用MFGTool烧录
-
准备配置文件:
在mfgtools/Profiles/Linux/OS Firmware目录下准备:ucl2.xml:烧录流程定义u-boot.imx:引导程序zImage:内核镜像rootfs.ubi:文件系统镜像
-
开发板设置为下载模式:
- 将BOOT_MODE[1:0]设置为01(串行下载)
- 连接USB OTG接口到PC
-
运行MFGTool:
bash复制./mfgtoolcli -c "linux" -p "IMX6ULL" -s "board=IMX6ULL"
注意:烧录过程中不要断开USB连接,否则可能导致芯片损坏。
6.3 首次启动调试
成功烧录后,将BOOT_MODE[1:0]设置回00(内部启动),上电后应在串口终端看到类似输出:
code复制U-Boot 2017.03 (Nov 15 2022 - 15:32:46 +0800)
CPU: Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
...
Hit any key to stop autoboot: 0
=>
常见启动问题:
- 无输出:检查串口线序(IMX6ULL通常使用3.3V TTL电平)
- 卡在U-Boot:检查环境变量
bootcmd是否正确 - 内核panic:检查设备树是否匹配硬件
7. 系统优化与性能调优
7.1 电源管理配置
IMX6ULL支持多种低功耗模式,通过以下命令查看当前状态:
bash复制cat /sys/kernel/debug/pm_genpd/pm_genpd_summary
启用深度睡眠模式:
bash复制echo mem > /sys/power/state
7.2 CPU频率调节
查看可用频率:
bash复制cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
设置性能模式:
bash复制echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
7.3 内存优化
IMX6ULL默认内存配置为256MB/512MB,可通过修改arch/arm/boot/dts/imx6ull.dtsi调整:
dts复制memory@80000000 {
device_type = "memory";
reg = <0x80000000 0x20000000>; /* 512MB */
};
8. 实际项目经验分享
在最近的一个工业控制器项目中,我们遇到了一个棘手的问题:系统运行一段时间后会出现随机死机。经过两周的排查,最终发现是DDR3内存时序配置不当导致的。解决方法是在U-Boot中调整了mmdc寄存器的值:
bash复制setenv mddrc_config \
"mw 0x021b001c 0x00008000; mw 0x021b001c 0x00008004; \
mw 0x021b001c 0x00008000; mw 0x021b001c 0x00008004"
saveenv
另一个常见问题是SD卡识别不稳定,这通常是由于IO电压配置不当。解决方法是在设备树中明确指定电压:
dts复制&usdhc2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usdhc2>;
bus-width = <4>;
no-1-8-v;
keep-power-in-suspend;
enable-sdio-wakeup;
status = "okay";
};
对于需要长时间运行的产品,我强烈建议:
- 定期检查系统日志(
dmesg) - 监控CPU温度(通过
/sys/class/thermal) - 使用ECC内存(如果支持)
- 实现看门狗定时器