跳到主要内容

配置 T527 主线 Linux 内核

内核能够编译,不等于它能够启动这块板。最典型的问题是:eMMC 或 ext4 驱动被编成模块,而这些模块恰好存放在尚未挂载的 eMMC 根文件系统里。Linux 无法在挂载根分区之前读取这些模块,因此启动所需的存储与文件系统驱动必须直接编入内核。

这一篇先配置挂载根文件系统之前必须具备的内核能力,再加入系统验收所需的驱动。配置片段记录板级差异,Kconfig 合并后生成的 output/build/linux-custom/.config 才是最终生效的配置。

内核启动
└─ 识别 eMMC(必须内建)
└─ 识别分区(必须内建)
└─ 挂载 ext4(必须内建)
└─ 读取 /lib/modules(此后才能加载模块)

将 eMMC 与 ext4 驱动编入内核

打开 board/avaota/a1-mainline/linux.fragment,先加入能够进入根文件系统的选项:

CONFIG_LOCALVERSION="-avaota-a1-mainline"
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
CONFIG_ARCH_SUNXI=y
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_DW=y
CONFIG_MMC=y
CONFIG_MMC_SUNXI=y
CONFIG_EXT4_FS=y

这些配置形成最短启动链:UART0 输出日志,sunxi MMC 驱动读取 eMMC,ext4 驱动挂载 rootfs

这里三类驱动必须内建为 =y。内核只有挂载 rootfs 后才能读取 /lib/modules;若把 CONFIG_MMC_SUNXICONFIG_EXT4_FS 编成模块,加载这些模块所需的文件恰好位于尚未挂载的 rootfs 中,会形成循环依赖。串口也保持内建,才能在根挂载失败时看到完整日志。

CONFIG_DEVTMPFS 负责在内核设备模型注册设备时生成 /dev 节点,CONFIG_DEVTMPFS_MOUNT 则在早期挂载 devtmpfs。它们不负责驱动硬件,而是让 Buildroot 用户空间在没有预先静态设备节点的情况下访问已经注册的设备。

配置系统验收所需驱动

继续追加:

CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_CONFIGFS_FS=y
CONFIG_USB_CONFIGFS=m
CONFIG_USB_CONFIGFS_ACM=y
CONFIG_USB_CONFIGFS_ECM=y
CONFIG_STMMAC_ETH=m
CONFIG_DWMAC_SUN55I=m
CONFIG_REALTEK_PHY=y
CONFIG_SUNXI_WATCHDOG=m

USB gadget、双网口 MAC 和 watchdog 选择为模块,可以在用户空间看到模块加载结果;Realtek PHY 保持内建,保证网卡驱动加载时 PHY 支持已经可用。

这些功能不参与挂载根文件系统的早期过程,所以可以作为模块延后加载。模块化还有一个诊断价值:modprobe 的返回值、dmesg 的 probe 日志和 /sys/module 可以区分“配置未进入内核”“模块未安装”和“驱动绑定失败”。但依赖关系仍要满足,例如 CONFIG_USB_CONFIGFS_ACM 只是 configfs gadget 的一个 function,真正创建 gadget 还需要用户空间挂载 configfs、创建描述符并绑定 UDC。

生成并检查内核配置

buildroot-2026.05.1 中执行:

make avaota_a1_mainline_defconfig
make linux-configure

Buildroot 把 arm64 默认配置和 linux.fragment 合并到:

output/build/linux-custom/.config

不要只检查片段本身。使用最终配置确认关键项:

linux_config=output/build/linux-custom/.config
for symbol in \
CONFIG_SERIAL_8250_DW=y \
CONFIG_MMC_SUNXI=y \
CONFIG_EXT4_FS=y \
CONFIG_USB_CONFIGFS=m \
CONFIG_DWMAC_SUN55I=m; do
grep -qx "$symbol" "$linux_config" || echo "missing: $symbol"
done

命令没有输出才表示五项配置都进入了最终内核。片段中存在一行但最终 .config 没有,通常意味着依赖项没有满足,需要使用:

make linux-menuconfig

查看该选项的依赖关系,而不是重复追加同一行。

Kconfig 可能把请求的 =m 提升、降低或直接取消。例如上层菜单未启用、架构不支持或依赖被设为 n 时,片段文本仍然存在,但最终值不会照抄。判断配置生效要同时看最终 .config 和编译产物,不能用片段中的一行代替。

检查内核版本与构建产物

make -j"$(nproc)" linux
make linux-show-info | sed -n '1,80p'

检查内核镜像和 release 字符串:

test -s output/images/Image
make -s -C output/build/linux-custom kernelrelease

版本应为 7.2.0-avaota-a1-mainline。该字符串同时决定 /lib/modules/ 下的目录名,后面安装模块时必须保持一致。

CONFIG_LOCALVERSION 不只是给 uname 增加说明文字。内核的 kernelrelease 会写入模块的 vermagic,并成为 Buildroot 安装模块的目录名。更改 localversion 后只替换 Image、不重建 rootfs 中的模块,会出现 invalid module format 或找不到 /lib/modules/$(uname -r)。因此内核、模块目录和发布清单必须作为同一组产物更新。

继续:核对 Avaota A1 设备树