1. 课程导论与目标
1.1 RK3399 平台概述
RK3399 是瑞芯微(Rockchip)推出的旗舰级六核 64 位高性能处理器,采用双核 Cortex-A72 + 四核 Cortex-A53 的 big.LITTLE 大小核架构,主频最高可达 2.0 GHz。该芯片集成了 Mali-T860 MP4 GPU,并拥有丰富的外设接口,在嵌入式显示、智能终端、工业控制等领域应用广泛。
- CPU: 双核 Cortex-A72 (2.0 GHz) + 四核 Cortex-A53 (1.5 GHz)
- GPU: Mali-T860 MP4,支持 OpenGL ES 1.1/2.0/3.0/3.1
- 显示接口: 双 MIPI-DSI、eDP、HDMI 2.0、DP 1.2、LVDS(通过桥接)
- 视频处理: 支持 4K H.264/H.265 解码,1080P 多路编码
- 内存: 双通道 DDR3/DDR3L/LPDDR3/LPDDR4
在显示驱动开发中,RK3399 的 VOP(Video Output Processor) 模块是核心组件,负责将 Framebuffer 中的图像数据合成并输出到各类显示接口。理解 VOP 的架构是移植 FrameBuffer 驱动的关键前提。
1.2 显示子系统架构
RK3399 的显示子系统采用 分层架构,从上到下依次为:应用层、FrameBuffer 驱动层、VOP 驱动层、硬件层。每一层都承担着明确的职责,层与层之间通过标准接口进行交互。
| 层级 | 组件/模块 | 主要职责 |
|---|---|---|
| 应用层 | GUI 框架(Qt/GTK/DirectFB) | 调用 Framebuffer 设备节点,绘制图形界面 |
| 内核层 | FrameBuffer 驱动 (fbdev) | 提供 /dev/fb0 设备,管理显存映射与刷新 |
| 内核层 | VOP 驱动 (rockchip_drm_vop) | 配置 VOP 寄存器,管理图层与显示时序 |
| 硬件层 | VOP + 显示接口 (HDMI/MIPI/eDP) | 执行像素合成与物理信号输出 |
1.3 FrameBuffer 概念
FrameBuffer(帧缓冲)是 Linux 内核提供的一种 抽象显示设备接口。它将显示设备(如 LCD 屏幕、HDMI 显示器)的显存抽象为一个连续的内存区域,应用程序可以直接通过 mmap() 系统调用将这片显存映射到用户空间,然后通过向这片内存写入像素数据来实现屏幕绘制。
- fb_var_screeninfo: 可变屏幕信息,包括分辨率(xres/yres)、位深(bits_per_pixel)、像素时钟等。
- fb_fix_screeninfo: 固定屏幕信息,包括显存起始地址(smem_start)、显存大小(smem_len)、行字节数(line_length)等。
- fb_cmap: 颜色映射表,用于 8 位伪彩色模式下的调色板设置。
在 RK3399 平台上,FrameBuffer 的显存通常分配在 DDR 内存的连续物理区域,通过 IOMMU(Input-Output Memory Management Unit)映射给 VOP 模块读取。这意味着用户空间写入 Framebuffer 的数据,最终会由 VOP 模块以固定帧率(如 60Hz)扫描并输出到显示接口。
| 概念 | 说明 | 对应 ioctl 命令 |
|---|---|---|
| 可变信息 | 可动态修改的显示参数(分辨率、位深) | FBIOPUT_VSCREENINFO |
| 固定信息 | 硬件相关的固定参数(显存地址、行跨度) | FBIOGET_FSCREENINFO |
| 颜色映射 | 设置/获取调色板(仅伪彩色模式) | FBIOPUTCMAP / FBIOGETCMAP |
| 显存映射 | 将内核显存映射到用户空间 | mmap() 系统调用 |
win-mapping 属性正确配置,否则可能出现屏幕无输出或显示错位的问题。
1.4 课程目标与前置知识
本课程旨在带领学员从零开始,在 RK3399 平台上完成 FrameBuffer 显示驱动的移植与调试。课程将覆盖从硬件原理分析、设备树配置、内核驱动编译,到最终在屏幕上显示 Linux Logo 和终端控制台的完整流程。
- 理解 RK3399 VOP 显示子系统的硬件架构与寄存器编程模型。
- 掌握 Linux 内核 FrameBuffer 驱动框架(fbmem.c / fbdev)的接口与实现。
- 能够独立修改 RK3399 设备树,配置 VOP 与显示接口的时序参数。
- 完成内核编译、设备树编译与烧录,使目标板通过 FrameBuffer 正常显示。
- 实现基本的用户空间测试程序,验证 Framebuffer 的读写与刷新功能。
前置知识要求:
| 知识领域 | 具体要求 |
|---|---|
| Linux 基础 | 熟悉 Linux 命令行操作,了解文件系统与设备文件概念 |
| C 语言编程 | 能够阅读和编写简单的 C 语言程序,理解指针与内存操作 |
| 嵌入式基础 | 了解交叉编译、U-Boot 启动流程、内核与设备树的基本概念 |
| 硬件基础 | 了解 I2C/SPI 等总线协议,知道什么是时序图与寄存器 |
devicetree/booting-without-of.txt。设备树是 RK3399 显示驱动移植中最重要的配置文件,后续章节会反复涉及。