目录
- Linux 内核架构与基础
- DRM/KMS 显示驱动框架
- fbdev 帧缓冲驱动
- GEM / dma-buf 显存管理
- DSI / MIPI-DSI 显示接口协议
- HDMI / DP / eDP / LVDS 显示接口
- VBlank 垂直同步机制
- 中断处理与同步机制
- Android SurfaceFlinger 框架
- Android HWC (Hardware Composer)
- Gralloc 内存分配机制
- Wayland / Weston 显示框架
- X11 显示框架
- GPU / 图形渲染管线
- AFBC 帧缓冲压缩
- XR / VR 显示技术
- 芯片 Bring-up 与仿真平台
- 性能测试与优化方法
- 原理图与寄存器规格书
- Git 与代码规范
- 多屏异显 / 分区更新 / 低功耗
- DRM 主线社区贡献
- LTP-DDT 测试框架
1. Linux 内核架构与基础
涉及知识
| 知识点 | 说明 | 深度要求 |
|—|—|—|
| 内核模块编写 | module_init/exit, GPL许可 | 理解 |
| 设备模型 | platform_driver, i2c_driver, pci_driver | 理解 |
| 内存管理 | kmalloc/vmalloc, ioremap, dma_alloc_* | 掌握 |
| 中断处理 | request_irq, tasklet, workqueue, 顶半部/底半部 | 掌握 |
| 同步原语 | spinlock, mutex, rw_semaphore, rcu | 掌握 |
| Proc/Sysfs 接口 | 驱动调试信息导出 | 理解 |
学习路径
入门阶段
- 书籍: 《Linux Device Drivers, 3rd Edition》(LDD3) — 第 1-10 章
- 书籍: 《Linux Kernel Development》— Robert Love,第 4-8 章
- 在线: Linux Kernel Documentation — [kernel.org/doc/Documentation/]
进阶阶段
- 源码: 研读内核
drivers/gpu/drm/下的 DRM 驱动实现 - 书籍: 《Understanding the Linux Kernel》— 深入内存管理子系统
- 实践: 在 QEMU/virt 平台上编写简单的 platform 驱动
资源推荐
- 内核文档: https://www.kernel.org/doc/html/latest/
- DRM 子系统文档: https://www.kernel.org/doc/html/latest/gpu/drm.html
- Linux Device Drivers 3rd Edition: https://lwn.net/Articles/driver-porting/
2. DRM/KMS 显示驱动框架
涉及知识
DRM (Direct Rendering Manager) 是现代 Linux 显示驱动的核心框架,其核心组件:
| 组件 | 英文全称 | 功能 |
|---|---|---|
| CRTC | Cathode Ray Tube Controller | 扫描输出控制器,生成时序信号 |
| Encoder | Encoder | 将像素数据编码为显示信号 |
| Connector | Connector | 物理接口 (HDMI/DP/DSI等) |
| Plane | Plane | 画面层,支持叠加/混合 |
| FB | Framebuffer | 显存对象描述 |
| Crtc | — | drm_crtc_* 驱动注册 |
| Encoder | — | drm_encoder_* 驱动注册 |
| Connector | — | drm_connector_* 驱动注册 |
| Encoder Helpers | — | DRM Encoder 辅助函数 |
| Bridge | — | 级联信号转换 (如 DSI→HDMI) |
| Panel | — | 显示面板 (背光、EDID读取) |
| Framebuffer | — | drm_framebuffer_* |
| Mode Setting | — | drm_mode_* 模式设置 |
DRM 驱动开发核心流程:
// 1. 分配 & 注册 DRM device
drm_dev_alloc() / drm_dev_register()
// 2. 初始化 CRTC
drm_crtc_init_with_planes()
// 3. 初始化 Encoder
drm_encoder_init()
// 4. 初始化 Connector
drm_connector_init() / drm_connector_attach_encoder()
// 5. 初始化 fbdev (可选, legacy fallback)
drm_fbdev_generic_setup()
// 6. 实现 atomic API 或 legacy set_config
drm_atomic_helper_check() / drm_mode_set_config_internal()
DRM 四大对象关系:
Plane → (attached to) → CRTC → (drives) → Encoder → (converts to) → Connector
↓
Framebuffer (FB)
学习路径
阶段1: 框架概览
- 内核文档: DRM overview —
Documentation/gpu/drm-uapi.rst - 内核文档: DRM KMS overview —
Documentation/gpu/drm-kms.rst - 文章: 《Linux DRM/Modesetting By Example》— David Herrmann
- https://dvdhrm.github.io/xmore/docs/drm-howto/
阶段2: 源码研读
- 参考驱动:
drivers/gpu/drm/vc4/(树莓派, 最简单完整的 DRM 驱动) - 参考驱动:
drivers/gpu/drm/udl/(USB 显示) - 参考驱动:
drivers/gpu/drm/etnaviv/(嵌入式 GPU) - 学习顺序: vc4_crtc.c → vc4_encoder.c → vc4_connector.c → vc4_kms.c
阶段3: 理解 Atomic API
drm_atomic_helper_check()drm_atomic_commit()drm_pending_event_*(VSync 事件)- Properties system (brightness, alpha, zpos…)
资源推荐
- DRM Wiki: https://wiki.freedesktop.org/norean/DRI/
- 内核 DRM 文档: https://www.kernel.org/doc/html/latest/gpu/drm.html
- DRM 设计文档: https://01.org/linuxgraphics/gfx-docs/drm/
3. fbdev 帧缓冲驱动
涉及知识
fbdev (Framebuffer Device) 是 DRM 出现前的传统 Linux 显示接口:
| 概念 | 说明 |
|---|---|
/dev/fb0 |
帧缓冲设备节点 |
struct fb_info |
帧缓冲核心结构 |
fb_ops |
底层硬件操作 (set_par, pan_display, blank…) |
vm_area_struct |
mmap 显存映射 |
| IOCTL | FBIOGET_VSCREENINFO, FBIOPUT_VSCREENINFO, FBIOBLANK 等 |
与现代显示系统的关系:
用户空间 (显示APP)
↓ mmap / ioctl
/dev/fb0 (fbdev层, legacy)
↓ 抽象
DRM/KMS 驱动 (现代层)
↓ 寄存器操作
显示硬件 (DPU/CRTC)
理解要点: fbdev 在现代系统中通常通过 DRM 的 drm_fbdev_generic_setup() 自动生成,作为兼容性 fallback 存在。
学习路径
- 内核文档:
Documentation/fb/ - 《Linux Device Drivers》— Framebuffer 章节
- 研读:
drivers/video/fbdev/core/fbmem.c— fbdev 核心实现
4. GEM / dma-buf 显存管理
涉及知识
GEM (Graphics Execution Manager)
DRM 框架中的显存管理子系统:
| 功能 | API |
|---|---|
| 分配显存对象 | drm_gem_object_alloc() |
| mmap 映射 | drm_gem_mmap() |
| 同步管理 | drm_syncobj_* |
| Prime 共享 | drm_gem_prime_* |
dma-buf
跨设备/跨驱动的缓冲区共享机制:
// 导出端 (GPU驱动)
struct dma_buf *dma_buf_export_dynamic(...);
int dma_buf_attach(struct dma_buf *, struct device *);
struct sg_table *dma_buf_map_attachment(...);
// 导入端 (显示驱动)
struct dma_buf *dma_buf_get(int fd);
int dma_buf_begin_cpu_access(struct dma_buf *, enum dma_data_direction);
void *dma_buf_vmap(struct dma_buf *);
使用场景:
- GPU 渲染 → 显示控制器读取(零拷贝)
- Camera → ISP → 显示管线
- 多屏共享同一帧缓冲区
学习路径
- 内核文档:
Documentation/driver-api/dma-buf.rst - 内核文档:
Documentation/gpu/drm-gem.rst - 源码:
drivers/dma-buf/和drivers/gpu/drm/drm_gem*.c
5. DSI / MIPI-DSI 显示接口协议
涉及知识
MIPI-DSI 协议栈
| 层级 | 说明 |
|---|---|
| 物理层 (DSI PHY) | D-PHY / C-PHY / M-PHY 电气特性 |
| 协议层 | 数据包格式 (Short/Long Packet)、Data Type |
| 命令模式 (Video Mode) | 同步事件、像素数据流传输 |
| 视频模式 (Command Mode) | DCS (Display Command Set) 寄存器配置 |
DSI 数据包格式:
┌──────┬────────┬──────┬──────┬─────────┐
│ Data ID │ Word Count │ ECC │ Payload │ Checksum │
└──────┴────────┴──────┴──────┴─────────┘
关键概念:
- Lane: 1/2/4 lane DSI, 带宽计算
- D-PHY: 时钟 Lane + 数据 Lane, HS/LP 模式切换
- DCS Commands:
set_display_on,set_pixel_format,set_address_mode等 - Video Mode: 实时像素流, 需要 HS 模式
- Command Mode: 可发送命令, 支持 LP 模式省电
DSI 驱动架构 (Linux)
drm_panel (显示面板)
↓
mipi_dsi_device / mipi_dsi_host
↓
dsi_host_ops (发送数据包)
↓
DSI PHY driver (dsi_phy_*.c)
↓
硬件寄存器
关键驱动组件:
drivers/gpu/drm/panel/panel-*.c— 面板驱动drivers/gpu/drm/bridge/synopsys/dsi->*— DSI bridgedrivers/gpu/drm/bridge/analogix/analogix*dsi*.c
学习路径
- MIPI Alliance 官方规范 (MIPI DSI-2): https://www.mipi.org/specifications/display
- 内核文档:
Documentation/gpu/panel-recipe.rst - 研读:
drivers/gpu/drm/panel/panel-samsung-s6d16d0.c等典型面板驱动 - 理解 DSI 调试: 逻辑分析仪 / MIPI 协议分析仪抓包
6. HDMI / DP / eDP / LVDS 显示接口
涉及知识
HDMI
| 知识点 | 说明 | |—|—| | TMDS 编码 | 最小化传输差分信号 | | HDCP | 内容保护 | | EDID | 显示器能力读取 (I2C DDC) | | CEC | 消费电子控制 | | HDMI Audio | 音频传输 | | HDMI 版本 | 1.4 / 2.0 / 2.1 带宽差异 |
DisplayPort (DP)
| 知识点 | 说明 | |—|—| | AUX 通道 | 辅助通道, EDID/HPD/HDCP | | Main Link | 高速数据传输 (1/2/4 lane) | | MSA | Main Stream Attribute | | DPCD | DisplayPort Configuration Data | | 版本差异 | DP 1.4 / 2.0 / 2.1 |
eDP
- 嵌入式 DisplayPort, 笔记本内部屏幕接口
- 相比 DP 更简化,无外部连接器
- 涉及 Panel Self Refresh (PSR) 节能
LVDS
- 低压差分信号, 传统接口
- 低功耗、低 EMI
- 逐渐被 eDP/MIPI-DSI 替代
DRM 中的接口实现
// HDMI Connector
drm_connector_init()
drm_hdmi_connector_set_funcs()
// DP Connector
drm_dp_aux_register()
// eDP (通常走 DP AUX)
drm_panel_attach()
学习路径
- HDMI spec: https://www.hdmi.org/spec/
- DisplayPort spec: https://vesa.org/standards-developments/displayport/
- 内核驱动:
drivers/gpu/drm/bridge/synopsys/ - 内核驱动:
drivers/gpu/drm/bridge/parade-ps8622.c等
7. VBlank 垂直同步机制
涉及知识
VBlank (Vertical Blank)
CRT/LCD 显示器的扫描机制,扫描完一帧后到下一帧开始前的空档期:
| 概念 | 说明 |
|---|---|
| VBlank 中断 | 每帧结束后触发, 用于页面翻转 |
| drm_vblank_*() | DRM VBlank API |
| 双缓冲 vs 三缓冲 | 缓冲区切换策略 |
| Page Flip | drm_mode_page_flip() / atomic commit |
DRM VBlank API
// 获取 VBlank 时间戳
drm_wait_vblank_reply();
// 启用/禁用 VBlank
drm_vblank_off();
drm_vblank_on();
// 原子提交时的页面翻转
drm_atomic_helper_page_flip();
VSync 流程:
用户请求页面翻转
↓
等待 VBlank 中断
↓
交换缓冲区 (ping-pong)
↓
硬件扫描输出新帧
学习路径
- 内核文档:
Documentation/gpu/drm-kms.rst(VBlank 部分) - DRM 原子模式:
drivers/gpu/drm/drm_atomic.c
8. 中断处理与同步机制
涉及知识
中断处理
| 机制 | 适用场景 | 上下文限制 | |—|—|—| | Hard IRQ | 硬件中断, 紧急处理 | 原子上下文, 不能睡眠 | | tasklet | 软中断, 延迟处理 | 原子上下文 | | workqueue | 延迟处理, 可睡眠 | 进程上下文 | | ** threaded IRQ** | 中断线程化 | 可睡眠 | | ** IRQ bottom half** | 中断下半部 | 取决于实现 |
同步原语
| 原语 | 类型 | 用途 |
|—|—|—|
| spinlock_t | 自旋锁 | 原子上下文 |
| struct mutex | 互斥锁 | 进程上下文 |
| rw_semaphore | 读写信号量 | 读多写少 |
| completion | 完成量 | 等待事件 |
| atomic_t | 原子变量 | 计数器 |
| rcu | 读拷贝更新 | 免锁读 |
学习路径
- 《Linux Kernel Development》— 中断与异常章节
- 《Linux Device Drivers》— 第 9 章 (中断处理)
- 内核文档:
Documentation/kernel-hacking/
9. Android SurfaceFlinger 框架
涉及知识
SurfaceFlinger 架构
Android 的显示服务器,负责合成所有应用的 Surface:
┌──────────────────────────────────────────────────┐
│ 应用进程 (APP) │
│ Canvas / OpenGL ES / Vulkan 渲染到 Surface │
└──────────────────────────────────────────────────┘
↓ 匿名共享内存 (ashmem)
┌──────────────────────────────────────────────────┐
│ SurfaceFlinger (System Server) │
│ │
│ 1. HWC (Hardware Composer) 获取合成策略 │
│ 2. 使用 GLES 或 HWC 合成所有 Surface │
│ 3. 双重缓冲: App 写 Surface / SF 读 Surface │
│ 4. 最终合成结果 → Framebuffer │
│ 5. 发送 VSync 信号同步 │
└──────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────┐
│ HAL 层 (gralloc, hwcomposer) │
└──────────────────────────────────────────────────┘
↓
┌──────────────────────────────────────────────────┐
│ Kernel DRM / fbdev │
└──────────────────────────────────────────────────┘
SurfaceFlinger 核心组件:
| 组件 | 功能 |
|---|---|
| BufferQueue | 生产者(APP)/消费者(SF) 之间的缓冲区队列 |
| Surface | 应用的绘图表面 |
| Layer | SF 中的合成层 |
| DisplayDevice | 显示设备抽象 |
| HWComposer | 硬件合成器接口 |
| RenderEngine | GLES 合成引擎 |
学习路径
- AOSP 源码:
frameworks/native/services/surfaceflinger/ - Android HAL:
hardware/interfaces/graphics/composer/ - 文章: Android Display System 深度系列 — 罗升阳
- 书籍: 《Android BSP 开发与维护》
10. Android HWC (Hardware Composer)
涉及知识
HWC HAL 版本
| 版本 | Android 版本 | 特性 | |—|—|—| | HWC1.0 | Android 4.x | 传统接口 | | HWC2.0 | Android 8+ | 标准化接口, 支持多种显示 | | HWC3.0 | Android 14+ | AIDL 化 |
HWC2 API 核心概念
// 核心数据类型
struct layers_t; // 合成层列表
struct display_t; // 显示设备
struct composer_t; // HWC 作曲家
// 核心流程
prepare() // 获取合成策略: CLIENT/DEVICE
set() // 执行合成
present() // 提交到显示硬件
getCapabilities() // 查询硬件能力
合成类型: | 类型 | 说明 | 硬件负担 | |—|—|—| | CLIENT | SF 使用 GLES 合成 | GPU | | DEVICE | HWC 直接合成 | 显示控制器 | | SOLID_COLOR | 纯色层 | 无需缓冲区 |
HWC vs SF 分工:
理想情况: HWC 尽量多做合成 (省电/省GPU)
极限情况: 全 GLES 合成 (SF_GEOMETRY_CHANGED)
学习路径
- AOSP HAL:
hardware/interfaces/graphics/composer/(V2/V3) - 旧版 HWC1:
frameworks/native/services/surfaceflinger/HWC2.cpp - 典型实现:
vendor/qcom/display-hal/或vendor/xxx/display-hal/
11. Gralloc 内存分配机制
涉及知识
Gralloc HAL
Android 图形内存分配器,负责分配用于渲染和显示的缓冲区:
APP 请求分配 → Gralloc HAL → DMA-Buf 导出 → 共享给 SF/GPU/显示控制器
gralloc 接口:
int gralloc_alloc(size_t size, int usage, buffer_handle_t* handle);
int gralloc_free(buffer_handle_t handle);
// 按 GRALLOC_USAGE_* 标志分配:
// - GRALLOC_USAGE_HW_FB // 显示控制器使用
// - GRALLOC_USAGE_HW_RENDER // GPU 渲染使用
// - GRALLOC_USAGE_HW_COMPOSER // HWC 使用
// - GRALLOC_USAGE_PROTECTED // 受保护内容
Gralloc 与 DRM GEM:
- gralloc 后端通常调用
dma-buf或GEMAPI - 分配结果通过
ANativeWindowBuffer::handle(fd) 传递
学习路径
- AOSP:
hardware/libhardware/modules/gralloc/(旧版) - AOSP:
hardware/interfaces/graphics/allocator/(新版 AIDL) - 内核:
drivers/dma-buf/,drivers/gpu/drm/drm_gem*.c
12. Wayland / Weston 显示框架
涉及知识
Wayland 架构
现代 Linux 桌面显示协议:
┌─────────────────────────────────────────────────┐
│ 客户端 (Client) │
│ EGL / Vulkan → wl_surface → Wayland Protocol │
└─────────────────────────────────────────────────┘
↓ Unix Socket
┌─────────────────────────────────────────────────┐
│ Weston (Compositor) │
│ │
│ 接收 Client 的 wl_surface → 合成 → DRM/KMS │
│ wl_shell / xdg-shell / IVI-shell │
│ 支持: GBM, EGL, libinput │
└─────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────┐
│ DRM / KMS (Linux Kernel) │
└─────────────────────────────────────────────────┘
核心协议:
| 协议 | 说明 |
|—|—|
| wl_surface | 窗口/图层 |
| wl_buffer | 图形缓冲区 |
| wl_compositor | 合成器 |
| wl_output | 显示输出 |
| xdg-shell | 桌面窗口管理接口 |
Weston vs SurfaceFlinger 对比:
| 维度 | Weston | SurfaceFlinger |
|---|---|---|
| 平台 | Linux Desktop | Android |
| 协议 | Wayland | Binder IPC |
| 硬件加速 | GBM + EGL | EGL + HWC |
| 输入处理 | libinput | InputDispatcher |
学习路径
- Weston 源码: https://gitlab.freedesktop.org/wayland/weston
- Wayland 协议: https://wayland.freedesktop.org/
- GBM:
drivers/gpu/drm/gem-display下的 GBM 子系统 - 书籍: 《Wayland Development》— Packt Publishing
13. X11 显示框架
涉及知识
X11 架构 (传统)
┌─────────────────────────────────────────────────┐
│ X11 Client (Qt/Gtk 应用) │
│ libX11 → X Protocol │
└─────────────────────────────────────────────────┘
↓ TCP/Unix Socket
┌─────────────────────────────────────────────────┐
│ X Server (Xorg) │
│ │
│ 窗口管理, 合成, 输入处理 │
│ 驱动: modesetting (DRM) / fbdev / intel/nvidia│
└─────────────────────────────────────────────────┘
X11 与 DRM 集成:
- Xorg modesetting 驱动:
xfree86/modesetting/ - 使用 KMS 进行模式设置
- 使用 GBM 分配缓冲区
学习路径
- X.Org Wiki: https://wiki.x.org/
- 《X Window System》— 架构理解
14. GPU / 图形渲染管线
涉及知识
GPU 渲染管线
应用 → 顶点着色 → 图元装配 → 光栅化 → 片段着色 → 测试与混合 → 帧缓冲
DRM 中的 GPU 协同
drm/gem— 显存对象管理 (GPU 与显示共享)drm/scheduler— GPU 命令调度drm/gpu_scheduler— 多引擎调度
常见 GPU 驱动
| 驱动 | GPU | 架构 |
|—|—|—|
| i915 | Intel Gen GPU | DRM + GEM |
| amdgpu | AMD GPU | DRM + GEM + KFD |
| panfrost | ARM Mali Bifrost | DRM + panfrost |
| vc4 / v3d | Broadcom VC4/V3D | DRM + V3D |
学习路径
- 《Real-Time Rendering》— 图形学基础
- DRM GPU 调度:
drivers/gpu/drm/scheduler/
15. AFBC 帧缓冲压缩
涉及知识
AFBC 简介
ARM Frame Buffer Compression — ARM 设计的帧缓冲压缩格式,用于减少显存带宽:
| 特性 | 说明 |
|---|---|
| 无损压缩 | 压缩/解压缩零误差 |
| 带宽节省 | 可达 50% 带宽降低 |
| 分块压缩 | 16x16 或 32x8 块 |
| 色彩格式 | 支持 YUV420 / RGBA 等 |
| AFBC 1.2 | 支持 Tiled 模式 |
显示控制器支持:
- 需要硬件支持 (如 ARM Mali-DP / DPU)
- 驱动中需要在 plane format list 中声明 AFBC 格式
DRM_FORMAT_ARM_AFBC等格式定义
学习路径
- ARM 官方文档: AFBC Specification
- 内核:
include/uapi/drm/drm_fourcc.h(AFBC 格式定义) - 驱动参考: ARM Mali-DP 驱动中 AFBC 相关代码
16. XR / VR 显示技术
涉及知识
XR 显示核心技术
| 技术 | 全称 | 说明 |
|---|---|---|
| ATW | Asynchronous TimeWarp | 头盔移动时画面翘曲补偿 |
| ASW | Asynchronous SpaceWarp | 空间翘曲, 降低 GPU 负担 |
| Front Buffer Rendering | — | 直接渲染到前缓冲区, 避免撕裂 |
| Multiview Rendering | — | 单次渲染生成左右眼画面 (OVR_multiview) |
| Single Pass Stereo | — | 单遍立体渲染 |
| 显示畸变校正 | — | 桶形畸变/枕形畸变 |
| 低持久性 | Low Persistence | 减少运动模糊 |
Android XR (ARCore) 显示管线
┌─────────────────────────────────────┐
│ SurfaceFlinger (双显示器) │
│ 分别为左眼/右眼创建 Surface │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ HWC (VR Composer HAL) │
│ TimeWarp 应用, 畸变校正 │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ 显示控制器 (OVR芯片) │
│ 双屏输出 / 时序同步 │
└─────────────────────────────────────┘
学习路径
- Oculus 官方文档: https://developer.oculus.com/documentation/
- Vulkan MultiView:
VK_EXT_multiview扩展 - Android VR SDK:
androidx.core.hardware.display
17. 芯片 Bring-up 与仿真平台
涉及知识
芯片 Bring-up 流程
规格定义 → RTL设计 → 仿真验证 → 硅片 → Bring-up
↓
Bootloader → 内核 → 显示驱动
(Tianocore / U-Boot / LK)
仿真平台
| 平台 | 厂商 | 说明 |
|---|---|---|
| FPGA | Xilinx / Intel | 原型验证, 最真实 |
| ZEBU | Synopsys | 虚拟平台, 速度慢但灵活 |
| Veloce | Siemens EDA | 仿真加速器 |
| QEMU | 开源 | 虚拟化 ARM/RISC-V |
| J7200 | Synopsys | 下一代虚拟平台 |
显示子系统 Bring-up 步骤
- 时钟配置 — 显示时钟 PLL 配置
- PHY 初始化 — DSI/HDMI/DP PHY 训练
- DPU 初始化 — 扫描输出配置
- 寄存器配置 — 面板参数、时序参数
- EDID 读取 — 显示器能力探测
- Framebuffer 分配 — GEM 对象创建
- 模式设置 — DRM 模式协商
- 双缓冲 — ping-pong 机制
- 性能验证 — 带宽、帧率测试
学习路径
- 《硬件系统设计》— 芯片 Bring-up 参考
- U-Boot 显示:
drivers/video/drm/ - Arm SoC Boot: https://u-boot.readthedocs.io/
18. 性能测试与优化方法
涉及知识
性能测试工具
| 工具 | 用途 |
|---|---|
| perf | CPU profiling, perf top, perf record |
| ftrace | 内核函数追踪, 延迟分析 |
| systrace | Android 系统追踪 |
| Simpleperf | Android 原生 profiling |
| drm_debug | DRM 调试 (DRM_ATOMIC, DRM_KMS) |
| kms++, DRM tests | 显示驱动测试 |
| weston-simple-egl | Wayland 性能基准 |
关键性能指标
| 指标 | 工具/方法 |
|---|---|
| 帧率 (FPS) | /dri/0/crtc*/output_framerate |
| 帧时间 | drm_vblank_get() 时间戳 |
| 显存带宽 | IP 寄存器或 perf stat |
| 显示延迟 | 传感器 + 高速摄像头 |
| 功耗 | /sys/class/graphics/ |
优化方向
- 带宽优化: AFBC, 压缩格式, tiling
- 延迟优化: 双缓冲 vs 三缓冲, 减少合成层数
- 功耗优化: Panel Self Refresh (PSR), DCRO
- CPU 优化: 中断合并, DMA 传输
学习路径
- perf: https://www.brendangregg.com/perf.html
- ftrace: https://www.kernel.org/doc/html/latest/trace/ftrace.html
- systrace: https://developer.android.com/topic/performance/tracing
19. 原理图与寄存器规格书
涉及知识
原理图阅读
- 显示接口信号定义 (DSI lane, HDMI differential pair)
- 电源/时钟连接
- SoC Pin MUX 配置
- I2C/SPI 控制总线
寄存器规格书阅读
| 技能 | 说明 | |—|—| | DPU registers | CRTC, Plane, Overlay, Mixer 配置寄存器 | | DSI registers | Lane配置, Packet格式, PHY控制 | | PHY registers | Tx/Rx 电气特性, 时钟数据恢复 | | Interrupt registers | 中断状态/屏蔽/清除 |
寄存器操作实践
// 映射外设寄存器
void __iomem *base = ioremap(res->start, resource_size(res));
// 读写寄存器
writel(value, base + OFFSET);
u32 val = readl(base + OFFSET);
// 寄存器位操作
u32 val = readl(base + OFFSET);
val |= BIT(16);
writel(val, base + OFFSET);
学习路径
- SoC 官方 TRM (Technical Reference Manual)
- 芯片参考原理图 (Renesas/Qualcomm/MTK/NXP 等)
20. Git 与代码规范
涉及知识
| 技能 | 说明 |
|---|---|
| Git 基础 | add, commit, push, pull, merge, rebase |
| 分支管理 | feature branch, develop, master |
| Code Review | PR/MR, 评审流程 |
| 提交规范 | feat:, fix:, docs: 等 commit message |
| 子模块管理 | git submodule |
| Patch 制作 | git format-patch, git send-email |
学习路径
- Pro Git 书籍: https://git-scm.com/book/zh/v2
- Linux 内核提交规范:
Documentation/process/submitting-patches.rst
21. 多屏异显 / 分区更新 / 低功耗
涉及知识
多屏异显 (Multi-Display)
┌─────────────────────────────┐
│ 显示控制器 (DPU) │
│ │
│ ┌─────────┐ ┌─────────┐ │
│ │ Plane 0 │ │ Plane 1 │ │ ← 多个图层
│ │ Display A│ │Display B│ │
│ └────┬────┘ └────┬────┘ │
│ ↓ ↓ │
│ CRTC 0 CRTC 1 │ ← 多个 CRTC
│ ↓ ↓ │
│ Encoder Encoder │
│ ↓ ↓ │
│ Connector Connector │
└─────────────────────────────┘
DRM 多屏实现:
// 为每个显示器创建独立的 CRTC/Encoder/Connector
// 通过 drmModeSetCrtc() 配置各显示器
// plane 可以 attach 到不同的 CRTC
分区更新 (Partial Update)
- 只更新屏幕变化的区域, 节省带宽
- 面板支持: e-ink, AMOLED 常用
- DRM atomic commit 中的 damage tracking
低功耗优化
| 技术 | 说明 | |—|—| | PSR (Panel Self Refresh) | 静止画面时面板自刷新, 关闭 DPU | | DRCS (Dynamic Refresh Rate) | 动态刷新率 | | DCRO (DRM Clock Resource Optimization) | 动态时钟门控 | | LVDC | 低压差分时钟门控 |
22. DRM 主线社区贡献
涉及知识
Linux DRM 主线开发流程
- 邮件列表订阅: dri-devel@lists.freedesktop.org
- 代码规范: Linux 内核编码风格
- 测试:
igt(Intel Graphics Tools) 测试套件 - 提交:
git format-patch+git send-email - Review: Patchwork 跟踪 (https://patchwork.freedesktop.org/)
- Bot 检测:
checkpatch.pl,syzkallerfuzz
知名 DRM 开发者
- Dave Airlie (Red Hat) — DRM maintainer
- Daniel Vetter (Intel) — DRM, Tungsten
- Rob Clark (Qualcomm) — Freedreno (Adreno GPU)
学习路径
- Linux 内核贡献指南: https://www.kernel.org/doc/html/latest/process/
- DRM 子系统指南:
Documentation/gpu/
23. LTP-DDT 测试框架
涉及知识
LTP (Linux Test Project)
- 系统级功能测试
- 覆盖内核系统调用、内存、网络、文件系统
DDT (Driver Development Test)
- 驱动级测试
- 针对特定驱动 (如显示驱动) 的测试
IGT (Intel Graphics Tools)
显示驱动测试的事实标准:
igt@gem_@ — GEM/显存测试
igt@kms_@ — KMS/显示功能测试
igt@i915_@ — Intel GPU 特定测试
常用 IGT 命令:
igt-runner list # 列出所有测试
igt-runner run kms_pipe_crc_basic # 运行多屏 CRC 测试
igt@kms_plane@plane-panning # 平面平移测试
igt@kms_flip@basic-plain-flip # 页面翻转测试
学习路径
- IGT 源码: https://gitlab.freedesktop.org/drm/igt-gpu-tools
- LTP: https://github.com/linux-test-project/ltp
