3. 内核编译与调试环境准备:内核配置选项、menuconfig中DRM相关选项、调试串口与网络文件系统(NFS)挂载
在瑞芯微平台进行 DRM 驱动开发前,搭建一套高效、可复现的内核编译与调试环境是基础中的基础。本章将聚焦于三个核心环节:内核配置选项(特别是 DRM/KMS 相关)、调试串口的启用,以及网络文件系统(NFS)的挂载配置。正确的环境准备能大幅缩短“修改-编译-部署-验证”的迭代周期。
调试环境核心原则: 使用 NFS 根文件系统 + 串口终端 + 内核动态调试(dyndbg),实现“宿主机编译、目标板无盘启动、实时日志输出”的闭环。
3.1 内核配置选项与 menuconfig 操作
瑞芯微平台(如 RK3568/RK3588)的 DRM 驱动依赖于一系列内核配置选项。错误的配置会导致显示控制器无法初始化、HDMI 无输出或 GPU 无法探测。以下是在 menuconfig 中必须检查的关键路径。
3.1.1 核心 DRM/KMS 配置项
进入内核源码根目录,执行 make ARCH=arm64 menuconfig(64 位平台),按以下路径使能关键选项:
| 配置路径 | 配置项 | 说明 |
|---|---|---|
Device Drivers → Graphics support |
CONFIG_DRM=y |
启用 DRM 核心框架,必须编译进内核 |
Device Drivers → Graphics support |
CONFIG_DRM_KMS_HELPER=y |
KMS 辅助模块,提供 CRTC/Encoder/Connector 标准实现 |
Device Drivers → Graphics support |
CONFIG_DRM_ROCKCHIP=y |
瑞芯平台 DRM 驱动主模块,包含 VOP(Video Output Processor)驱动 |
Device Drivers → Graphics support → Display Interface Bridges |
CONFIG_DRM_DW_HDMI=y |
Synopsys DesignWare HDMI 桥接芯片驱动(RK3568/RK3588 常用) |
Device Drivers → Graphics support → Display Interface Bridges |
CONFIG_DRM_LVDS_BRIDGE=y |
LVDS 桥接驱动(如 RK3568 接 LVDS 屏时必选) |
Device Drivers → Graphics support → Display Interface Bridges |
CONFIG_DRM_PANEL_SIMPLE=y |
简单面板驱动,用于直接连接 RGB/LVDS 显示屏 |
常见陷阱: 如果只编译了
CONFIG_DRM_ROCKCHIP=m 而未将其加入 initramfs,内核在挂载根文件系统前无法加载显示驱动,导致开机无显示。建议在开发阶段将核心 DRM 驱动设为 y。
3.1.2 调试与辅助配置项
为了在调试过程中获取更多信息,建议同时启用以下选项:
- DRM 调试日志:
CONFIG_DRM_DEBUG_MM=y和CONFIG_DRM_DEBUG_MODESET=y,用于输出内存管理和模式设置的详细日志。 - 帧缓冲兼容层:
CONFIG_FB=y和CONFIG_FB_CFB_FILLRECT=y,虽然 DRM 是主流,但早期启动阶段或某些测试工具仍依赖 FBDEV。 - 动态调试:
CONFIG_DYNAMIC_DEBUG=y,允许在运行时通过debugfs动态开启/关闭特定文件的dev_dbg()输出,是定位驱动问题的利器。
3.1.3 menuconfig 操作流程 SVG
下图展示了在 menuconfig 中定位并启用瑞芯微 DRM 驱动的典型操作流程:
3.2 调试串口(UART)配置
串口是嵌入式 Linux 开发中最可靠的“生命线”。当网络或显示驱动尚未正常工作时,串口终端是唯一能获取内核早期启动日志(printk)和进入 shell 的通道。
3.2.1 内核串口配置
瑞芯微平台通常使用 UART2 作为调试串口(对应硬件引脚 TXD2/RXD2)。需要在 menuconfig 中确保以下配置:
CONFIG_SERIAL_8250=y:8250 串口驱动支持。CONFIG_SERIAL_8250_CONSOLE=y:将串口作为控制台。CONFIG_SERIAL_OF_PLATFORM=y:支持设备树描述的串口设备。- 设备树(DTS)中确认: 检查
chosen节点的stdout-path属性是否指向正确的串口别名,例如stdout-path = &uart2;。
3.2.2 串口调试参数速查表
| 参数 | 典型值 | 说明 |
|---|---|---|
| 波特率 | 1500000 (1.5Mbps) | 瑞芯微平台常用高速率,减少日志传输延迟 |
| 数据位 | 8 | 标准设置 |
| 停止位 | 1 | 标准设置 |
| 校验 | 无 (N) | 标准设置 |
| 流控 | 无 | 调试串口通常不使用硬件流控 |
| 内核启动参数 | console=ttyS2,1500000n8 |
在 bootargs 中指定,ttyS2 对应 UART2 |
实战建议: 在宿主机上使用
screen 或 minicom 连接串口。推荐命令:sudo screen /dev/ttyUSB0 1500000。如果日志滚动太快,可以使用 Ctrl+A 然后按 : 进入命令模式,输入 logfile /tmp/serial.log 将日志保存到文件。
3.3 网络文件系统(NFS)挂载
NFS 挂载允许目标板(开发板)将宿主机上的某个目录作为根文件系统(rootfs)使用。这意味着在宿主机上修改内核模块或应用程序后,目标板无需重新烧录,重启即可生效,极大提升调试效率。
3.3.1 宿主机(Server)配置步骤
- 安装 NFS 服务:
sudo apt update sudo apt install nfs-kernel-server - 创建并导出根文件系统目录:
sudo mkdir -p /srv/nfs/rootfs # 假设你已经有一个 buildroot 或 yocto 构建好的 rootfs 在此目录 sudo chown -R nobody:nogroup /srv/nfs/rootfs sudo chmod -R 755 /srv/nfs/rootfs - 编辑导出文件:
sudo vim /etc/exports # 添加以下行(假设开发板 IP 为 192.168.1.100,子网掩码 24) /srv/nfs/rootfs 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)关键参数说明:no_root_squash允许开发板上的 root 用户保持 root 权限,否则文件操作会因权限不足而失败。调试阶段务必加上此选项。 - 重启 NFS 服务并验证:
sudo exportfs -a sudo systemctl restart nfs-kernel-server # 在宿主机本地验证 showmount -e localhost
3.3.2 目标板(Client)内核配置与启动参数
目标板内核需要启用 NFS 客户端支持:
CONFIG_NFS_FS=y:NFS 文件系统支持。CONFIG_NFS_V4=y和CONFIG_NFS_V4_1=y:建议启用 NFSv4,性能更好。CONFIG_IP_PNP=y和CONFIG_IP_PNP_DHCP=y:允许内核在挂载根文件系统前通过 DHCP 获取 IP 地址。
在 U-Boot 的 bootargs 环境变量中设置以下参数:
setenv bootargs 'console=ttyS2,1500000n8 root=/dev/nfs nfsroot=192.168.1.10:/srv/nfs/rootfs,v3,tcp rw ip=dhcp'
saveenv
boot
参数解析:
root=/dev/nfs:告诉内核使用 NFS 作为根文件系统。nfsroot=192.168.1.10:/srv/nfs/rootfs,v3,tcp:指定 NFS 服务器 IP、导出路径、协议版本和传输层。ip=dhcp:自动获取 IP 地址。也可以静态指定,如ip=192.168.1.100::192.168.1.1:255.255.255.0::eth0:off。
3.3.3 NFS 调试工作流 SVG
下图展示了基于 NFS 的“修改-编译-重启”快速迭代流程:
3.4 环境验证清单
完成上述配置后,建议按以下清单逐项验证,确保环境可用:
| 验证项 | 验证方法 | 预期结果 |
|---|---|---|
| 串口输出 | 上电后观察串口终端 | 看到 U-Boot 和内核启动日志,最终进入 shell 提示符 |
| NFS 挂载 | 执行 mount | grep nfs |
显示 192.168.1.10:/srv/nfs/rootfs on / type nfs |
| DRM 驱动加载 | 执行 dmesg | grep drm |
看到 rockchip-drm display-subsystem 初始化成功,无错误 |
| KMS 测试 | 执行 modetest -M rockchip |
列出可用的 CRTC、Encoder、Connector 和模式列表 |
| 动态调试 | 执行 echo 'file rockchip_drm_vop.c +p' > /sys/kernel/debug/dynamic_debug/control |
在 dmesg 中看到 VOP 驱动的调试信息 |
进阶技巧: 将上述验证命令写入
/etc/rc.local 或 init.d 脚本,实现开机自动检查环境状态,并将结果通过串口输出,方便快速定位问题。