4. 移植Linux内核到车载开发板

任务目标

将Linux内核移植到车载开发板(以i.MX6ULL EVK为参考平台),完成从源码下载、设备树配置、交叉编译到通过SD卡烧录并启动内核的完整闭环。最终验证标准:开发板串口终端输出内核启动日志并进入用户空间shell。

环境与依赖

  • 主机:Ubuntu 20.04+,已安装交叉编译工具链 arm-linux-gnueabihf-(gcc 9.4.0)
  • 目标板:i.MX6ULL EVK开发板,SD卡启动方式
  • 内核源码:linux-5.4.47(NXP官方BSP对应版本)
  • 必要工具:u-boot-tools(生成dtb)、device-tree-compiler

实现步骤与代码

1. 下载并解压内核源码

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.47.tar.xz
tar -xJf linux-5.4.47.tar.xz
cd linux-5.4.47

2. 配置设备树与内核

i.MX6ULL的默认设备树文件为imx6ull-14x14-evk.dts。若需适配自定义板载外设(如修改LED引脚或添加CAN控制器),直接编辑该dts文件后重新编译即可。此处使用默认配置演示完整流程:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make imx_v6_v7_defconfig
# 可选:make menuconfig 进行内核功能裁剪
make imx6ull-14x14-evk.dtb

3. 编译内核与设备树

make -j4 zImage
make imx6ull-14x14-evk.dtb

编译产物:arch/arm/boot/zImage 与 arch/arm/boot/dts/imx6ull-14x14-evk.dtb。

4. 烧录到SD卡

将SD卡分为两个分区:FAT32分区(100MB)存放内核与dtb,ext4分区(剩余空间)存放根文件系统。假设SD卡设备为/dev/sdb:

sudo mkfs.vfat -F 32 /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
sudo mount /dev/sdb1 /mnt/boot
sudo cp arch/arm/boot/zImage /mnt/boot/
sudo cp arch/arm/boot/dts/imx6ull-14x14-evk.dtb /mnt/boot/
sync
sudo umount /mnt/boot

根文件系统(如Buildroot生成的rootfs.tar)解压到/dev/sdb2后,插入SD卡并设置开发板拨码开关为SD卡启动。

5. U-Boot引导参数

开发板进入U-Boot后设置环境变量并启动:

setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk0p2 rootwait rw'
setenv bootcmd 'fatload mmc 0:1 0x80800000 zImage; fatload mmc 0:1 0x83000000 imx6ull-14x14-evk.dtb; bootz 0x80800000 - 0x83000000'
saveenv
boot

验证方法与判定标准

  1. 编译验证:上述make命令无报错退出,且zImage与.dtb文件生成。
  2. 启动验证:开发板串口(115200-8-N-1)连接主机,上电后观察输出。预期看到U-Boot启动信息,随后Linux内核解压日志,最后出现Welcome to Buildroot登录提示符或login:字样。
  3. 设备树验证:内核日志中出现Machine model: Freescale i.MX6ULL 14x14 EVK Board,且无Failed to find或Error级别的设备树解析错误。

预期输出(串口终端最后几行):

VFS: Mounted root (ext4 filesystem) on device 179:2.
Freeing unused kernel memory: 2048K
Run /sbin/init as init process
Starting network: OK
Welcome to Buildroot
buildroot login:

出现上述登录提示即表示内核移植成功。若卡在Kernel panic - not syncing: VFS: Unable to mount root fs,则检查root=/dev/mmcblk0p2参数与SD卡ext4分区是否对应。

常见问题

  • dtb无法加载:确认U-Boot中fatload的dtb地址与bootz命令地址一致,且dtb文件未损坏。
  • 串口无输出:检查拨码开关启动模式、串口线连接(ttymxc0对应UART1)以及console=ttymxc0,115200参数。
  • 网络不通:若需网络功能,确认设备树中fec1节点status为okay,且PHY芯片驱动已编译进内核。