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 驱动的典型操作流程:

menuconfig 中配置瑞芯微 DRM 驱动流程 menuconfig 配置瑞芯微 DRM 驱动流程 1. Device Drivers → Graphics support 2. 选中 <*> DRM Support (CONFIG_DRM) 3. 进入 Rockchip SoC DRM 子菜单 4. 选中 <*> Rockchip DRM (CONFIG_DRM_ROCKCHIP) 5. 返回上层,配置 Display Bridges / Panels 6. Save → Exit,编译新内核 提示:使用 "/" 键可快速搜索配置项,例如输入 "ROCKCHIP" 直接定位

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)配置步骤

  1. 安装 NFS 服务:
    sudo apt update
    sudo apt install nfs-kernel-server
  2. 创建并导出根文件系统目录:
    sudo mkdir -p /srv/nfs/rootfs
    # 假设你已经有一个 buildroot 或 yocto 构建好的 rootfs 在此目录
    sudo chown -R nobody:nogroup /srv/nfs/rootfs
    sudo chmod -R 755 /srv/nfs/rootfs
  3. 编辑导出文件:
    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 权限,否则文件操作会因权限不足而失败。调试阶段务必加上此选项。
  4. 重启 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 的“修改-编译-重启”快速迭代流程:

NFS 调试工作流 基于 NFS 的快速迭代调试工作流 宿主机(Ubuntu) A1: 修改 DRM 驱动源码 A2: 编译内核与模块 A3: 复制新模块到 NFS 目录 A4: 通过串口重启开发板 目标板(RK3568/RK3588) B1: U-Boot 加载内核与 DTB B2: 内核通过 DHCP 获取 IP B3: 挂载 NFS 根文件系统 B4: 加载新模块,验证显示 根据日志反馈修改源码 核心优势:无需烧录、无需 SD 卡、修改后重启即生效,单次迭代可缩短至 30 秒

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 脚本,实现开机自动检查环境状态,并将结果通过串口输出,方便快速定位问题。