i.MX6UL开发板OpenWrt系统移植实战:从内核适配到镜像打包

张开发
2026/4/18 2:04:19 15 分钟阅读

分享文章

i.MX6UL开发板OpenWrt系统移植实战:从内核适配到镜像打包
1. 环境准备与工具链选择第一次接触i.MX6UL开发板时我花了两周时间才搞明白为什么官方OpenWrt 19.07无法直接运行。这个Cortex-A7架构的芯片虽然性能不错但内核适配确实是个技术活。建议直接用Ubuntu 14.04系统别问为什么——这是用三个不同版本虚拟机测试后的血泪教训高版本系统会出现各种诡异的库依赖问题。开发板厂商提供的Linux内核版本是4.1.15而OpenWrt 19.07默认用的是4.14内核这个版本差会导致设备树文件不兼容。我的做法是把内核源码放在/home/[你的用户名]/MYiR-iMX-Linux目录下注意路径不要有中文和空格。关于交叉编译工具链的选择我试过开发板自带的gcc-linaro-4.9工具链结果在编译OpenWrt时各种符号错误最后改用OpenWrt自带的工具链才顺利通过。安装依赖库时建议分批次执行避免网络中断导致重来sudo apt-get update sudo apt-get install -y subversion g zlib1g-dev build-essential git python sudo apt-get install -y libncurses5-dev gawk gettext unzip file libssl-dev sudo apt-get install -y wget libelf-dev ecj fastjar java-propose-classpath2. OpenWrt源码配置与内核适配下载OpenWrt 19.07.2源码后重点来了——平台适配。由于官方没有i.MX6UL的预设选项我们需要魔改Freescale i.MX6的配置。执行make menuconfig后在Target System选择Freescale i.MX 6时记得进入Advanced configuration options把内核源码路径指向你本地的4.1.15内核目录。关键修改在target/linux/imx6/Makefile里把CPU_TYPE从cortex-a9改为cortex-a7添加浮点支持CPU_CFLAGS -mfloat-abihard -mfpuvfpv3-d16内核版本改为4.1虽然实际是4.1.15但写4.1更保险有个隐藏坑点需要把开发板厂商提供的defconfig文件比如myd_y6ulx_defconfig改名为config-4.1复制到target/linux/imx6/目录并删除原有的config-4.14。同时记得清理target/linux/generic/下的旧配置文件否则编译时会版本冲突。3. 典型编译错误与解决方案第一次编译绝对会碰壁我记录了几个经典错误问题1libc.so.6缺失Package libnl-tiny is missing dependencies for the following libraries: libc.so.6解决方法编辑staging_dir/target-arm_cortex-a7vfpv3-d16_glibc/pkginfo/libc.provides添加libc.so.6。问题2内核配置中断* Restart config... * Enable the block layer这说明需要先单独编译内核源码。设置环境变量export PATH$PATH:/path/to/gcc-linaro-4.9/bin export CROSS_COMPILEarm-linux-gnueabihf- export ARCHarm然后在内核目录执行make distclean make myd_y6ulx_defconfig make zImage dtbs问题3设备树编译报错imx50.dtsi: fatal error: dt-bindings/clock/imx5-clock.h: No such file创建软链接解决cd arch/arm/boot/dts/include ln -s ../../../../../include/dt-bindings/ ./4. 镜像打包与烧录技巧编译成功后需要提取三个关键文件rootfs位于bin/targets/imx6/generic-glibc/openwrt-imx6-default-rootfs.tar.gzzImage在build_dir/target-arm_cortex-a7vfpv3-d16_glibc_eabi/linux-imx6/zImagedtb文件在linux-4.1/arch/arm/boot/dts/目录下比如imx6ul-14x14-evk.dtb最坑的是rootfs打包格式。开发板厂商用的是.tar.bz2格式而OpenWrt生成的是.tar.gz。千万别在Windows上用图形工具转换格式正确做法是在Linux下执行mkdir rootfs tar zxvf openwrt-imx6-default-rootfs.tar.gz -C rootfs cd rootfs tar jcvf ../core-image-base-myd-y6ul14x14.rootfs.tar.bz2 ./*如果打包方式不对会出现著名的No working init found错误这时候连内核日志都看不出问题所在。我当初就是在这里卡了整整两天最后发现是压缩时文件权限丢失导致的。烧录前建议用file命令检查文件类型file zImage # 应显示Linux kernel ARM boot executable zImage file *.dtb # 应显示Device Tree Blob5. 启动优化与调试技巧成功启动后还有几个实用技巧串口调试修改/etc/inittab可以调整串口输出速率建议保持115200速率与uboot一致网络配置在/etc/config/network中设置静态IP时注意phy-mode要匹配开发板设计存储优化修改target/linux/imx6/image/Makefile可以调整rootfs分区大小开机自启OpenWrt使用procd系统服务脚本要放在/etc/init.d/下遇到内核崩溃时可以尝试在uboot中修改启动参数setenv bootargs consolettymxc0,115200 root/dev/mmcblk0p2 rootwait saveenv如果启动卡住在内核命令行添加init/bin/sh可以进入紧急shell。移植完成后建议做个差异备份tar czvf my_openwrt_patch.tar.gz \ target/linux/imx6/ \ package/kernel/linux/modules/ \ .config这样下次升级时就能快速还原你的定制配置。

更多文章