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 驱动的关键前提。

RK3399 显示子系统顶层架构 RK3399 显示子系统顶层架构 CPU (A72/A53) Mali-T860 GPU DDR 内存 VOP 视频输出 (Win / Layer 合成) HDMI 2.0 MIPI-DSI (双通道) eDP / DP 1.2 LVDS (桥接) 说明: VOP 是 RK3399 显示子系统的核心,负责从内存读取 Framebuffer 数据, 完成图层合成(Alpha Blending)后,分发到不同的物理显示接口。

1.2 显示子系统架构

RK3399 的显示子系统采用 分层架构,从上到下依次为:应用层、FrameBuffer 驱动层、VOP 驱动层、硬件层。每一层都承担着明确的职责,层与层之间通过标准接口进行交互。

层级 组件/模块 主要职责
应用层 GUI 框架(Qt/GTK/DirectFB) 调用 Framebuffer 设备节点,绘制图形界面
内核层 FrameBuffer 驱动 (fbdev) 提供 /dev/fb0 设备,管理显存映射与刷新
内核层 VOP 驱动 (rockchip_drm_vop) 配置 VOP 寄存器,管理图层与显示时序
硬件层 VOP + 显示接口 (HDMI/MIPI/eDP) 执行像素合成与物理信号输出
关键概念: 在 RK3399 上,FrameBuffer 驱动通常作为 DRM(Direct Rendering Manager)框架的一部分存在。虽然我们课程中直接操作的是传统的 /dev/fb0 接口,但底层依然依赖 DRM 的 VOP 驱动来完成真正的硬件配置。理解这种“fbdev 用户接口 + DRM 内核实现”的混合模式,是移植成功的关键。
显示子系统软件分层架构 显示子系统软件分层架构 应用层:Qt / GTK / DirectFB / 裸机程序 系统调用:open / read / write / ioctl / mmap 内核层:FrameBuffer 驱动 (fbdev) /dev/fb0 | fbmem.c | 显存管理 VOP 驱动 (rockchip_drm_vop) 图层配置 | 时序生成 | 中断处理

1.3 FrameBuffer 概念

FrameBuffer(帧缓冲)是 Linux 内核提供的一种 抽象显示设备接口。它将显示设备(如 LCD 屏幕、HDMI 显示器)的显存抽象为一个连续的内存区域,应用程序可以直接通过 mmap() 系统调用将这片显存映射到用户空间,然后通过向这片内存写入像素数据来实现屏幕绘制。

FrameBuffer 核心数据结构:
  • 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() 系统调用
移植注意: RK3399 的 VOP 支持多个视频层(Win0/Win1/Win2),但传统的 FrameBuffer 驱动通常只使用 Win0 作为主层。在移植过程中,需要确保设备树中 VOP 的 win-mapping 属性正确配置,否则可能出现屏幕无输出或显示错位的问题。
FrameBuffer 工作流程 FrameBuffer 工作流程 用户空间程序 (绘制像素数据) mmap() 内核显存 (Framebuffer) (DDR 连续物理内存) DMA 读取 VOP 硬件 (扫描输出) 显示设备 像素时钟 流程:用户程序通过 mmap 直接写入显存 → VOP 通过 DMA 周期性读取显存 → 输出到显示设备。

1.4 课程目标与前置知识

本课程旨在带领学员从零开始,在 RK3399 平台上完成 FrameBuffer 显示驱动的移植与调试。课程将覆盖从硬件原理分析、设备树配置、内核驱动编译,到最终在屏幕上显示 Linux Logo 和终端控制台的完整流程。

课程核心目标:
  1. 理解 RK3399 VOP 显示子系统的硬件架构与寄存器编程模型。
  2. 掌握 Linux 内核 FrameBuffer 驱动框架(fbmem.c / fbdev)的接口与实现。
  3. 能够独立修改 RK3399 设备树,配置 VOP 与显示接口的时序参数。
  4. 完成内核编译、设备树编译与烧录,使目标板通过 FrameBuffer 正常显示。
  5. 实现基本的用户空间测试程序,验证 Framebuffer 的读写与刷新功能。

前置知识要求:

知识领域 具体要求
Linux 基础 熟悉 Linux 命令行操作,了解文件系统与设备文件概念
C 语言编程 能够阅读和编写简单的 C 语言程序,理解指针与内存操作
嵌入式基础 了解交叉编译、U-Boot 启动流程、内核与设备树的基本概念
硬件基础 了解 I2C/SPI 等总线协议,知道什么是时序图与寄存器
学习建议: 如果你对设备树(Device Tree)还不熟悉,建议先花 30 分钟阅读 Linux 内核文档中的 devicetree/booting-without-of.txt。设备树是 RK3399 显示驱动移植中最重要的配置文件,后续章节会反复涉及。
课程知识图谱 课程知识图谱 RK3399 FrameBuffer 显示驱动移植 Linux 内核基础 设备树 (DTS) 交叉编译工具链 VOP 驱动配置 Framebuffer 接口 显示时序调试