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
验证方法与判定标准
- 编译验证:上述make命令无报错退出,且
zImage与.dtb文件生成。 - 启动验证:开发板串口(115200-8-N-1)连接主机,上电后观察输出。预期看到U-Boot启动信息,随后Linux内核解压日志,最后出现
Welcome to Buildroot登录提示符或login:字样。 - 设备树验证:内核日志中出现
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芯片驱动已编译进内核。