1. 课程导入与开发环境搭建
STM32MP1 是 ST 推出的异构多核微处理器系列,典型型号如 STM32MP157A/D、STM32MP153、STM32MP151,内部同时集成双核 Cortex-A7 与单核 Cortex-M4。A7 侧运行 Linux,负责应用、网络、图形与多媒体;M4 侧运行裸机或 RTOS 固件,负责实时控制、低延迟采集与电源管理等任务。两侧通过硬件信号量、IPCC 中断、共享内存以及 OpenAMP/RPMsg 框架通信。理解这一分工,是后续做 DRM 显示工程的前提:显示子系统、GPU、LCD-TFT 控制器、DSI 控制器都挂在 A7 侧的 Linux 上,由内核 DRM/KMS 统一管理,而 M4 通常只参与背光、面板上电时序或实时刷新触发等辅助工作。
从软件栈看,Linux 图形显示自下而上大致分为几层:最底层是 SoC 内的显示控制器(STM32MP1 上是 LTDC 与 DSI)和 GPU(Vivante GC nano 3D、GC 2D);其上是内核 DRM/KMS 子系统,DRM 提供设备节点 /dev/dri/card0、/dev/dri/renderD128 以及 GEM/DMA-BUF 缓冲管理,KMS 负责 CRTC、Encoder、Connector、Plane 的建模与原子提交;再往上是 libdrm、Mesa、Wayland/Weston、X11 或 Qt/EGLFS 等用户态组件;最上层才是具体的 GUI 应用。DRM/KMS 处在承上启下的位置:向下直接配置寄存器与时钟,向上为合成器提供统一的显示抽象。做显示工程时,绝大多数“黑屏、花屏、分辨率不对、撕裂”问题,最终都要回到 KMS 的 mode、plane 与 atomic commit 上排查。
搭建开发环境的第一步是确定构建系统。STM32MP1 官方推荐 Yocto,ST 提供的 OpenSTLinux 发行版基于 Yocto,包含 meta-st-stm32mp 层,能直接生成带 DRM、Weston、GPU 驱动的完整镜像;Buildroot 更轻量,适合裁剪定制,但需要自行处理 GPU 用户态库与固件。若目标是快速跑通显示,建议先用 Yocto 的 st-image-weston 验证硬件,再按需裁剪。典型流程是:安装 repo,初始化 OpenSTLinux 清单,执行 bitbake st-image-weston,产物在 tmp-glibc/deploy/images/stm32mp1/ 下,包含 .wic 镜像、设备树 .dtb 与 U-Boot。
# 示例:Yocto 环境初始化(版本与路径以实际清单为准)
mkdir -p ~/stm32mp1 && cd ~/stm32mp1
repo init -u https://github.com/STMicroelectronics/oe-manifest.git \
-b refs/tags/openstlinux-5.15
repo sync -j8
DISTRO=openstlinux-weston MACHINE=stm32mp15-disco \
source layers/meta-st/scripts/envsetup.sh
bitbake st-image-weston
硬件侧,DK2(STM32MP157C-DK2)自带 4 英寸 DSI 触摸屏,是最省事的验证平台;自定义板卡则要重点确认三件事:LTDC 或 DSI 的引脚复用是否与设备树一致、面板时序参数(hactive/vactive、porch、clock-frequency)是否匹配、背光与复位 GPIO 是否接对。设备树中 panel 节点、ltdc 节点与 dsi 节点的 status 必须为 okay,否则内核不会注册对应的 DRM connector。
镜像烧写后,先验证串口与网络这两条“生命线”。串口控制台通常为 115200 8N1,接在 ST-Link 虚拟串口或板载 UART 上,能进 U-Boot 与内核日志即可;网络用 udhcpc 或静态 IP 配通后,用 ssh root@<板卡IP> 登录,后续调试就不必反复插拔串口。显示接口验证按顺序做:先 dmesg | grep -i drm 看 LTDC/DSI 是否 probe 成功,再 ls /dev/dri 确认 card0 存在,然后用 modetest -M stm32-drm -c 列出 connector 与 mode,最后 modetest -M stm32-drm -s <connector>:<mode> 点亮测试图。若能看到彩条,说明 KMS 通路已通;若黑屏但 dmesg 无报错,优先查背光与面板上电时序。