瑞芯微RK摄像头Sensor驱动开发与MIPI接入 - 第1节

1.1 RK芯片系列介绍

Rockchip(瑞芯微)是国内领先的SoC设计公司,其芯片广泛应用于AIoT、平板、智能显示、工业控制及车载领域。在Sensor与MIPI CSI驱动开发中,我们主要关注带有ISP(图像信号处理器)或支持MIPI CSI接口的芯片。

1.1.1 主流RK芯片产品线

系列 代表型号 CPU架构 ISP能力 MIPI CSI Lane 典型应用
RK35xx RK3588 / RK3568 / RK3566 Cortex-A76 + A55 双ISP,支持HDR、多路拼接 4 Lane × 2 AI摄像头、NVR、平板
RK33xx RK3399 / RK3326 Cortex-A72 + A53 单ISP,支持基础3A 4 Lane × 1 商显、广告机、入门AI
RK21xx RK2108 / RK2118 Cortex-M3 + DSP 轻量ISP,低功耗 2 Lane × 1 智能门锁、低功耗IPC
RV11xx RV1109 / RV1126 Cortex-A7 + NPU 3DNR、WDR 4 Lane × 1 AI IPC、车载DVR
开发选型建议: 对于Sensor驱动开发入门,推荐使用RK3568或RV1126。这两款芯片文档齐全、社区活跃,且具备完整的MIPI CSI + ISP链路,便于调试RAW图和3A流程。

1.1.2 RK芯片Camera子系统架构

RK平台的Camera子系统采用典型的V4L2(Video for Linux 2)框架,硬件上由Sensor、MIPI D-PHY、CSI Host Controller、ISP以及DDR控制器组成。软件上分为用户空间(Camera HAL / 3A库)和内核空间(V4L2驱动、Media Controller)。

RK平台Camera子系统架构图 硬件层 (Hardware) CMOS Sensor MIPI D-PHY CSI Host ISP 内核层 (Kernel Space) V4L2 Subdev Media Controller RK ISP Driver 用户空间 (User Space) Camera HAL / 3A Lib V4L2 API / ioctl 应用层 (App)

1.2 RK Linux SDK架构

RK官方提供的Linux SDK基于Yocto/Buildroot或直接提供完整的Android/Linux BSP。对于Sensor驱动开发,我们主要关注内核源码树中的以下目录结构:

1.2.1 SDK目录结构

RK_LINUX_SDK/
├── kernel/                     # Linux内核源码
│   ├── drivers/media/i2c/      # Sensor驱动存放位置
│   ├── drivers/media/platform/rockchip/  # RK平台ISP/CSI驱动
│   ├── arch/arm64/boot/dts/rockchip/     # 设备树文件
│   └── ...
├── u-boot/                     # 引导加载程序
├── buildroot/                  # 根文件系统构建
├── external/                   # 第三方库与工具
│   ├── rkisp_3a/               # 3A算法库
│   └── camera_engine/          # Camera引擎
├── device/rockchip/            # 板级配置与HAL层
└── docs/                       # 开发文档与数据手册
关键路径说明:
  • drivers/media/i2c/ —— 所有Sensor驱动(如ov5648.c、imx415.c)都放在这里,遵循V4L2 Subdev框架。
  • drivers/media/platform/rockchip/ —— RK自研的ISP驱动、CSI Host控制器驱动,负责DMA、MIPI协议解析。
  • arch/arm64/boot/dts/rockchip/ —— 设备树中定义Sensor的I2C地址、MIPI Lane映射、时钟频率等硬件拓扑。

1.2.2 驱动分层模型

RK平台的Sensor驱动采用分层设计,从上到下依次为:

  1. 应用层:Camera App通过V4L2 API调用。
  2. 框架层:Camera HAL + 3A库,负责ISP参数调节。
  3. 内核V4L2层:Video Device、Subdev、Media Controller。
  4. 硬件抽象层:I2C通信、GPIO控制、MIPI D-PHY配置。
  5. 物理层:Sensor芯片、MIPI总线、时钟晶振。
Sensor驱动分层模型 应用层 (Camera App / V4L2 API) 框架层 (HAL / 3A Lib / ISP Tuning) 内核V4L2层 (Video Device / Subdev / Media) 硬件抽象层 (I2C / GPIO / MIPI D-PHY Config) 物理层 (Sensor / MIPI Bus / XTAL)

1.3 RK驱动开发环境搭建

搭建一个高效的RK驱动开发环境是后续实战的基础。下面以RK3588 EVB + Ubuntu 22.04主机为例,给出标准搭建流程。

1.3.1 硬件准备清单

组件 推荐型号/规格 备注
开发板 RK3588 EVB / RK3568 EVB 必须带有MIPI CSI接口
Sensor模组 OV5648 / IMX415 / SC2336 优先选RK官方支持的型号
调试工具 USB转UART模块、逻辑分析仪 用于打印和MIPI信号分析
电源 12V/3A DC适配器 确保供电稳定
主机 Ubuntu 22.04 x86_64 至少16GB RAM,200GB磁盘

1.3.2 主机开发环境配置

在Ubuntu主机上安装必要的工具链和依赖包:

# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装基础编译工具
sudo apt install -y git make gcc g++ gawk flex bison \
  libssl-dev libncurses-dev u-boot-tools

# 安装交叉编译工具链 (aarch64)
sudo apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# 安装SDK管理工具
sudo apt install -y repo python3 python3-pip device-tree-compiler

# 安装调试工具
sudo apt install -y minicom picocom screen
常见踩坑点:
  • 交叉编译器版本必须与SDK要求的版本一致,否则内核模块可能无法加载。RK SDK通常使用 gcc-arm-10.3-2021.07 或更新版本。
  • 如果使用repo同步SDK,请确保网络稳定,建议使用国内镜像源。

1.3.3 SDK获取与编译

以RK官方Linux SDK为例,通过repo获取完整源码:

# 创建工作目录
mkdir rk3588_sdk && cd rk3588_sdk

# 初始化repo (使用官方manifest)
repo init -u https://github.com/rockchip-linux/manifests.git \
  -b linux-5.10-gen-rkr4.1

# 同步源码 (耗时较长)
repo sync -c -j8

# 编译内核 (以RK3588 EVB为例)
cd kernel
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make rockchip_linux_defconfig
make rk3588-evb1-lp4-v10.img -j$(nproc)

1.3.4 烧录与调试

编译完成后,使用RK烧录工具将镜像写入开发板:

# 进入烧录模式 (按住RECOVERY键,上电)
# 使用 rkdeveloptool 或 Windows 端 RKDevTool

# 烧录内核 (以rkdeveloptool为例)
sudo rkdeveloptool db rk3588_spl_loader_v1.08.bin
sudo rkdeveloptool wl 0x00008000 kernel.img
sudo rkdeveloptool rd

# 查看内核启动日志
sudo minicom -D /dev/ttyUSB0 -b 1500000
调试技巧: 在Sensor驱动开发初期,建议在设备树中先关闭ISP,仅使用V4L2 Subdev直接读取Sensor的RAW数据,通过media-ctl和v4l2-ctl工具验证MIPI链路是否通调。这样可以先排除硬件连接问题,再深入ISP调试。

1.3.5 开发环境验证

搭建完成后,通过以下命令验证环境是否就绪:

# 检查交叉编译器
aarch64-linux-gnu-gcc --version

# 检查内核源码树
ls kernel/drivers/media/i2c/

# 检查设备树编译工具
dtc --version

# 检查串口工具
minicom --version