1. Rockchip 平台概述:从芯片选型到 SDK 上手

做 Rockchip 平台驱动开发,第一件事不是写代码,而是搞清楚你手里拿的到底是什么芯片、什么板子、什么 SDK。我见过不少新手,拿到 RK3588 的 datasheet 就开始翻寄存器,结果连芯片有几个 PCIe 控制器都没搞清楚——这其实挺浪费时间的。

这一节,我带你把 RK3568 和 RK3588 的核心特性、数据手册怎么看、开发板怎么选、SDK 源码结构怎么组织,一次性理清楚。嗯,这些都是我平时做项目时反复用到的东西。

1.1 RK3568 与 RK3588 芯片特性对比

先看一张对比表,把两个芯片的关键差异摆出来。你想想看,选型的时候最关心什么?无非是 CPU 性能、GPU、NPU、外设接口这些。

特性 RK3568 RK3588
CPU 4×Cortex-A55 @ 2.0GHz 4×Cortex-A76 @ 2.4GHz + 4×Cortex-A55 @ 1.8GHz
GPU Mali-G52 EE Mali-G610 MP4
NPU 1 TOPS (RKNN) 6 TOPS (RKNN)
内存 LPDDR4/LPDDR4x, 最大 8GB LPDDR4x/LPDDR5, 最大 32GB
显示 HDMI 2.0, eDP 1.3, MIPI DSI HDMI 2.1, DP 1.4, eDP 1.4, MIPI DSI ×2
视频编解码 4K@60fps 解码, 1080p@60fps 编码 8K@60fps 解码, 8K@30fps 编码
PCIe 1×PCIe 3.0 x2, 1×PCIe 2.0 x1 2×PCIe 3.0 x4, 2×PCIe 3.0 x2
USB 1×USB 3.0, 2×USB 2.0 2×USB 3.1 Gen1, 2×USB 2.0
以太网 2×GMAC (RGMII) 2×GMAC (RGMII + SGMII)
封装 BGA636, 21×21mm BGA1088, 23×23mm

我的选型建议:如果项目只需要 4K 显示、轻量级 AI 推理、成本敏感,RK3568 完全够用。但如果要做 8K 视频、多路摄像头、高性能 NPU 推理,直接上 RK3588。我在一个智能安防项目里用过 RK3588,8 路 1080p 同时解码,CPU 占用不到 30%。

1.2 数据手册导读——别从头翻到尾

Rockchip 的数据手册动辄上千页。我刚开始做的时候也犯过傻,拿着 RK3588 的 TRM(Technical Reference Manual)从第 1 页开始读,读到第 300 页就放弃了。后来我发现,正确的读法是:带着问题找答案。

数据手册通常分这几部分:

  • Chapter 1: Introduction —— 芯片概览、特性列表、框图。必读。
  • Chapter 2: System Architecture —— 总线拓扑、内存映射、中断控制器。做驱动前必须看。
  • Chapter 3~N: Peripheral Descriptions —— 每个外设的寄存器、操作模式、时序。按需查阅。
  • Last Chapters: Electrical Characteristics, Package —— 硬件工程师更关心,驱动开发一般用不到。

我的习惯:拿到一个新芯片,先看 System Architecture 和 Memory Map。搞清楚外设挂在哪个总线、中断号怎么分配、DMA 通道怎么用。这些信息决定了驱动框架怎么搭。

举个例子,RK3588 的 TRM 里,第 2 章的 Memory Map 会告诉你:

0xFD000000 - 0xFDFFFFFF: 系统寄存器 (GRF)
0xFE000000 - 0xFEFFFFFF: 外设寄存器 (PERI)
0xFF000000 - 0xFFFFFFFF: 其他 (包括 PMU、CRU 等)

写驱动时,你要操作的外设寄存器地址,基本都在 0xFE000000 这个区间。我一般会在驱动里先定义好基地址宏,再按偏移量访问具体寄存器。

1.3 硬件开发板介绍——以 TB-RK3568X 为例

市面上 Rockchip 的开发板很多,我推荐新手从 TB-RK3568X 入手。为什么?因为它的原理图公开、SDK 维护活跃、社区资料多。我自己也有一块,调试起来很顺手。

TB-RK3568X 的核心硬件资源:

  • SoC: RK3568, 4×Cortex-A55
  • 内存: 4GB LPDDR4x
  • 存储: 32GB eMMC, 支持 TF 卡扩展
  • 显示: HDMI 2.0 输出, MIPI DSI 接口
  • 网络: 千兆以太网 ×2, Wi-Fi 6 (可选模块)
  • 扩展: PCIe 3.0 x2 插槽, USB 3.0, 40-pin GPIO
  • 调试: UART 串口, JTAG (需转接板)

注意:TB-RK3568X 的 UART 串口默认是 3.3V 电平,接 USB 转串口模块时别接 5V,否则可能烧坏芯片。我曾经有一次不小心接反了,结果串口芯片直接冒烟——还好 SoC 没事。

开发板上的跳线也要留意。比如 BOOT 模式选择:

跳线状态 启动模式 用途
BOOT=0 (低电平) eMMC 启动 正常系统启动
BOOT=1 (高电平) MaskROM 模式 烧录固件、恢复系统

我调试驱动时,经常需要切到 MaskROM 模式重新烧录内核。所以建议你准备一根杜邦线,把 BOOT 引脚引出来,方便切换。

1.4 SDK 源码结构——Linux SDK 与 Android SDK 的区别

Rockchip 提供两套 SDK:Linux SDK 和 Android SDK。它们的源码结构差异很大,选错了会走很多弯路。

先看一张整体对比图:

Rockchip SDK 源码结构对比 Rockchip SDK 源码结构对比 Linux SDK u-boot/ kernel/ buildroot/ device/rockchip/ external/rkbin/ build.sh → 一键编译 Android SDK u-boot/ kernel/ device/rockchip/ hardware/rockchip/ external/ (HAL, libs) make -j8 → 全编译 Linux SDK 轻量、适合嵌入式产品;Android SDK 庞大、适合消费电子 驱动开发核心都在 kernel/ 目录,两套 SDK 的内核源码基本一致

从图上能看出来,两套 SDK 的顶层结构差异很大。我重点说几个关键点:

Linux SDK

  • kernel/ —— 内核源码,驱动开发的主战场。Rockchip 基于主线内核,但会加很多 BSP 补丁。
  • u-boot/ —— 引导加载程序,负责初始化硬件、加载内核。
  • buildroot/ —— 根文件系统构建工具。你可以自己裁剪,也可以直接用预编译的。
  • device/rockchip/ —— 板级配置、设备树、分区表。写驱动时经常要改这里的 .dts 文件。
  • external/rkbin/ —— Rockchip 的闭源二进制文件,包括 DDR 初始化、M0 协处理器固件等。

我的经验:Linux SDK 的编译流程很简单,执行 ./build.sh 就能一键生成固件。但如果你只改内核驱动,可以单独编译内核:./build.sh kernel,省时间。

Android SDK

  • kernel/ —— 内核源码,和 Linux SDK 的内核基本一样,但配置不同。
  • device/rockchip/ —— 板级配置、设备树、Android 专属的 BoardConfig.mk。
  • hardware/rockchip/ —— Rockchip 的硬件抽象层(HAL),比如显示、摄像头、GPU 的 HAL 实现。
  • external/ —— 第三方库和 Rockchip 的闭源库,比如 librga(2D 加速)、libmpp(视频编解码)。

注意:Android SDK 的编译环境要求很高。我建议至少用 16 核 CPU、32GB 内存的机器,否则一次全编译可能要等两三个小时。我第一次编译 RK3588 的 Android 12,用了 8 核的笔记本,结果编译了 4 个多小时——后来果断换了服务器。

1.5 驱动开发的核心目录——kernel/ 里看什么

不管用哪套 SDK,驱动开发的核心都在 kernel/ 目录。我一般会重点关注这几个子目录:

kernel/
├── arch/arm64/boot/dts/rockchip/   # 设备树文件,板级硬件描述
├── drivers/                         # 驱动源码
│   ├── pinctrl/rockchip/            # 引脚复用控制器驱动
│   ├── clk/rockchip/                # 时钟驱动
│   ├── i2c/busses/                  # I2C 控制器驱动
│   ├── spi/                         # SPI 控制器驱动
│   ├── gpio/                        # GPIO 驱动
│   ├── pci/                         # PCIe 驱动
│   ├── media/platform/rockchip/     # 视频、摄像头驱动
│   └── ...
├── include/dt-bindings/             # 设备树绑定头文件
└── Documentation/devicetree/        # 设备树绑定文档

举个例子,如果你想写一个 I2C 外设驱动,需要先看 drivers/i2c/busses/i2c-rk3x.c,了解 Rockchip I2C 控制器的寄存器操作方式。然后在设备树里添加你的外设节点,比如:

&i2c1 {
    status = "okay";
    clock-frequency = <400000>;

    my_sensor: sensor@48 {
        compatible = "myvendor,my-sensor";
        reg = <0x48>;
        interrupt-parent = <&gpio0>;
        interrupts = <RK_PB2 IRQ_TYPE_LEVEL_LOW>;
    };
};

嗯,设备树是 Rockchip 平台驱动开发的基础。后面我会专门用一章来讲设备树的写法,这里先有个印象就行。

1.6 本章小结

这一节我们覆盖了 Rockchip 平台开发的四个基础点:芯片选型、数据手册阅读、开发板硬件、SDK 源码结构。说白了,这些就是驱动开发的“地图”。地图画清楚了,后面写代码才不会迷路。

我个人建议,你拿到开发板后,先做三件事:

  1. 把 SDK 下载下来,执行一次全编译,确保环境没问题。
  2. 把开发板用串口连上,看启动日志,确认内核能正常跑起来。
  3. 打开设备树文件,对照原理图,把每个外设的引脚、时钟、中断对应上。