RK平台Camera开发入门:从基础知识点到实战调试

电子说

1.4w人已加入

描述

 

 

大家好!在安防监控、物联网设备、消费电子等领域,瑞芯微(Rockchip)平台凭借出色的图像处理能力,成为很多开发者的首选。但 Camera 开发涉及硬件链路、驱动配置、调试优化等多个环节,新手很容易踩坑。今天这篇文章,我们就基于瑞芯微官方《RK VI 驱动指南》,梳理 RK 平台 Camera 开发的核心基础知识点实战调试方法,帮你快速入门,解决常见问题。

Linux

一、RK Camera 开发基础知识点

 

想要做好 RK 平台 Camera 开发,首先要理清 硬件架构 软件配置 关键概念” 这三大块,我们一步步拆解。

 

 

1. 先搞懂:适用平台与核心硬件模块

 

RK 平台对 Camera 的支持覆盖多系列芯片,不同芯片的 VIVideo Input)模块能力有差异,先明确你的开发目标平台:

 

 

芯片型号

 

 

软件系统

 

 

核心能力亮点

 

 

RV1126

 

 

Linux 4.19

 

 

支持 3 帧 HDRVICAP Full/Lite 双 IP

 

 

RV1109

 

 

Linux 4.19

 

 

 RV1126,分辨率上限 3072x2048

 

 

RK3566

 

 

Linux 4.19

 

 

 VICAP,不支持 HDR

 

 

RK3568

 

 

Linux 4.19

 

 

支持 2 帧 HDR,分辨率上限 4096x2304

 

 

RK3588

 

 

Linux 5.10

 

 

 ISP + 双 FEC,支持 8K 合成 + 7 路 sensor

 

 

核心硬件模块解析

 

Camera 数据从传感器到输出,要经过 采集 处理 后处理” 三大模块,链路如下(建议收藏):

 

 

Linux  

RKVICAP:视频采集模块,负责接收 Sensor 的原始数据,支持 MIPIDPHY/CPHY)、LVDSDVPBT601/BT656/BT1120)接口,不同芯片的 VICAP 数量 能力不同(如 RV1126 有 VICAP Full+Lite)。

 

 

RKISP:图像信号处理器,Camera 的 大脑,支持 HDR 合成(帧 / 3 帧)、自动白平衡(AWB)、自动曝光(AE)、自动对焦(AF)等 3A 功能,还能处理 RAW 格式转换。

 

 

CISCMOS Image Sensor:相机传感器,通过 I2C 与主控通信,驱动需基于 V4L2 Subdev 框架实现,是数据的 源头

 

 

2. 再上手:关键软件配置

 

软件配置的核心是DTS 设备注册驱动框架,这两步错了,Camera 根本跑不起来。

 

 

1DTS 配置:Camera 注册的 身份证

 

DTS(设备树)负责描述硬件连接关系,比如 Sensor 的接口类型、I2C 地址、电源 GPIO 等,不同接口(MIPI/LVDS/DVP)的配置略有差异,这里以最常用的MIPI 接口为例(基于 RV1126+OS04A10 Sensor):

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
// 1. Sensor节点配置os04a10: os04a10@36 {    compatible = "ovti,os04a10"// 与驱动匹配的字符串    reg = <0x36>; // Sensor I2C地址(7位)    clocks = <&cru CLK_MIPICSI_OUT>; // Sensor时钟源    clock-names = "xvclk";    power-domains = <&power RV1126_PD_VI>; // 电源域    // 电源配置    avdd-supply = <&vcc_avdd>;    dovdd-supply = <&vcc_dovdd>;    dvdd-supply = <&vcc_dvdd>;    // GPIO配置(断电/复位)    pwdn-gpios = <&gpio1 RK_PD4 GPIO_ACTIVE_HIGH>;    // 模组信息(匹配IQ参数)    rockchip,camera-module-index = <1>; // 模组编号(不重复)    rockchip,camera-module-facing = "front"// 朝向(front/back)    // MIPI端口链接    port {        ucam_out0: endpoint {            remote-endpoint = <&mipi_in_ucam0>; // 链接到MIPI DPHY            data-lanes = <1 2 3 4>; // MIPI Lane数(必须配置,否则识别失败)        };    };};// 2. MIPI DPHY节点配置&csi_dphy0 {    status = "okay";    ports {        port@0 {            mipi_in_ucam0: endpoint@1 {                reg = <1>;                remote-endpoint = <&ucam_out0>; // 反向链接Sensor                data-lanes = <1 2 3 4>; // 与Sensor一致            };        };        port@1 {            csidphy0_out: endpoint@0 {                remote-endpoint = <&isp_in>; // 链接到ISP            };        };    };};// 3. ISP虚拟节点配置(数据链路生效)&rkisp_vir0 {    status = "okay";    ports {        port@0 {            isp_in: endpoint@0 {                remote-endpoint = <&csidphy0_out>; // 反向链接MIPI DPHY            };        };    };};

关键注意点

 

 

compatible必须与 Sensor 驱动中的of_match_table一致,否则驱动无法匹配设备;

 

 

data-lanes必须明确(如 4 Lane <1 2 3 4>),MIPI 接口不配置会识别为其他类型;

 

 

 Sensor 注册时,需分配不同的camera-module-index,避免冲突(如 RK3588 支持 路 Sensor路 MIPI+1 路 DVP)。

 

 

2)驱动框架:基于 I2C+V4L2 Subdev

 

RK 平台 Camera 驱动遵循 Linux 标准框架,核心是CIS 驱动Sensor 驱动),基于 I2C 总线(Sensor 与主控通信)和 V4L2 Subdev(与上层框架交互),关键组成如下:

 

 

核心组件

 

 

作用

 

 

struct i2c_driver

 

 

I2C 驱动结构体,定义 probe(设备匹配)、remove(设备卸载)、匹配表等

 

 

struct v4l2_subdev_ops

 

 

V4L2 子设备操作集,包含 core(电源 / IOCTL)、video(流控制)、pad(格式)

 

 

关键 API

 

 

set_fmt(设输出格式)、get_fmt(获格式)、s_stream(启停流)等

 

 

比如i2c_driver的示例代码(简化):

 

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
static const struct of_device_id os04a10_of_match[] = {    { .compatible = "ovti,os04a10" }, // 与DTS匹配    {},};static struct i2c_driver os04a10_i2c_driver = {    .driver = {        .name = "os04a10",        .of_match_table = os04a10_of_match,    },    .probe = os04a10_probe, // 设备匹配成功后执行    .remove = os04a10_remove,};module_i2c_driver(os04a10_i2c_driver);

3. 必掌握:核心技术概念

 

搞懂这些概念,才能应对复杂场景(如 HDR、多摄):

 

 

1HDR 模式:高动态范围成像

 

RKISP 支持 帧(RK3568)或 帧(RV1126/RK3588HDR 合成,原理是采集不同曝光时间的帧(短帧 欠曝、中帧 正常、长帧 过曝),通过 ISP 合成高动态范围图像,数据链路如下:

 

 

Linux

2RAW 存储格式:紧凑 vs 非紧凑

 

RAW 是 Sensor 输出的原始数据,存储格式影响内存占用和处理效率:

 

 

非紧凑型10bit/12bit 数据按 16bit 存储(高位对齐),内存占用高,但处理简单,适用于 VICAP 采集(如 RV1126 DVP 仅支持非紧凑);

 

 

紧凑型12bit 数据按 8bit 紧凑存储(字节存 个像素),内存占用低,适用于 ISP 直接处理。

 

 

3)多摄同步(RK3588 专属)

 

RK3588 支持多摄同步,解决多 Sensor 数据时序不一致问题,主要有两种模式:

 

 

Master-Slave:从设备等待主设备的同步信号,仅收到信号才输出数据;

 

 

Master-Master:主设备发送同步信号,从设备独立输出,收到信号后同步(支持当前帧完成后同步或立即同步)。

 

 

核心知识点脑图

 

为了方便记忆,整理成脑图如下:

 

 

Linux

二、RK Camera 实战调试方法

 

开发中遇到“Camera 不识别”“预览闪烁”“图像发紫” 等问题,掌握以下调试方法,能快速定位问题。

 

 

1. 必备工具:media-ctl + v4l2-ctl

 

这两个工具是 RK Camera 调试的 左右手,前者管理媒体拓扑,后者操作视频设备。

 

 

1media-ctl:查看 配置拓扑

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 1. 查看media设备拓扑(X为0/1/2,需枚举)media-ctl -p -d /dev/mediaX# 示例输出:会显示Sensor→MIPI→ISP的链路,确认是否“ENABLED”# 2. 设置Sensor输出格式(如OS04A10设2688x1520,RAW12)media-ctl -d /dev/media0 --set-v4l2 '"os04a10 1-0036":0[fmt:SBGGR12_1X12/2688x1520]'# 3. 切换ISP数据链路(如从ISPP切到MainPath抓RAW)media-ctl -l '"rkisp-isp-subdev":2->"rkisp_mainpath":0[1]'

2v4l2-ctl:抓帧 设控制参数

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
# 1. 抓RAW图(设分辨率、格式,保存到/tmp)v4l2-ctl -d /dev/video0 --set-fmt-video=width=2688,height=1520,pixelformat=RG10 --stream-mmap=4  # 4个MMAP缓存--stream-count=1  # 抓1帧--stream-to=/tmp/cap.raw  # 保存路径--stream-skip=2 # 跳过前2帧(避免初始帧异常)# 2. 设置曝光和增益(需先找到Sensor的subdev节点,如/dev/v4l-subdev4)v4l2-ctl -d /dev/v4l-subdev4 --set-ctrl 'exposure=1216,analogue_gain=10'# 3. 查看支持的控制参数v4l2-ctl -d /dev/v4l-subdev4 --list-ctrls

2. Debug 信息:定位问题的 线索

 

遇到问题先看日志,RK 提供了多个 Debug 入口:

 

 

1)查看 proc 文件

 

proc 文件包含 ISP/VICAP 的实时状态,比如:

 

 

  •  
  •  
  •  
  •  
# 查看ISP状态(帧号、格式、模块开关)cat /proc/rkisp0# 查看VICAP状态(输入格式、帧率、中断统计)cat /proc/rkcif_mipi_lvds

示例输出关键信息:

 

 

Input Format:SGBRG10_1X10 Size:2688x1520@30fps:输入格式和帧率;

 

 

ErrCnt:0:无错误中断,若不为 0,可能是 MIPI 链路异常;

 

 

HDRTMO ONHDR TMO 模块已开启。

 

 

2)寄存器 Dump

 

若怀疑硬件配置问题,可 Dump ISP/VICAP 寄存器:

 

 

  •  
  •  
  •  
  •  
# RV1126 Dump ISP寄存器(地址0xffb50000,长度0x10000)io -4 -l 0x10000 0xffb50000 > /tmp/isp.reg# RK3568 Dump ISP寄存器io -4 -l 0x10000 0xfdff0000 > /tmp/isp.reg

3)开启驱动日志

 

  •  
  •  
  •  
  •  
  •  
  •  
# 开启ISP驱动日志(n=0~3,3级最详细)echo 3 > /sys/module/video_rkisp/parameters/debug# 开启ISPP驱动日志echo 3 > /sys/module/video_rkispp/parameters/debug# 查看日志dmesg | grep -i "rkisp"

3. 常见问题排查:实战案例

 

1)问题 1:预览闪烁

 

排查步骤

 

 

1.开启 AE 日志AE(自动曝光)异常是闪烁的常见原因,开启日志查看统计值:

 

 

  •  
  •  
export persist_camera_engine_log=0x1ff3 # 开启AE logrkisp_demo # 运行测试程序

1.分析日志

 

 

TmoMeanLumaTMO 合成后亮度)跳变,是 TMO 参数不匹配,需调整 IQ 参数;

 

 

MeanLuma稳定但画面闪烁,是 ISP 后处理模块问题,需联系瑞芯微工程师;

 

 

time(曝光时间)和gain(增益)同时变化,检查生效帧配置(如 sensor 的 time 通常 n+2 帧生效,需在 IQ 文件中设置time_delay=2)。

 

 

1.测试线性度:若 gain 线性度差,会导致亮度跳变,测试方法:

 

 

盖毛玻璃(均匀入光),固定 gain=1,抓 10ms/20ms/30ms 的 RAW 图;

 

 

统计亮度值,减去黑电平(镜头遮黑抓图),若亮度与曝光时间成直线,线性度正常。

 

 

2)问题 2:光源处紫色溢出

 

排查步骤

 

 

1.线性模式:检查 gain 值是否超 Sensor 手册限制(如驱动换算的 gain 寄存器值是否合法);

 

 

2.HDR 模式

 

 

查看内核日志是否有 MIPI 报错(dmesg | grep -i "mipi err"),若有是短帧偏移导致合成错位;

 

 

确认短帧曝光是否超限制(如某 sensor 短帧最大 2ms,若 IQ 配置 3ms,实际仅 2ms 生效,导致合成 ratio 异常)。

 

 

调试流程图

 

Linux

4. 实用技巧

 

单独更新驱动:无需重新编译内核,生成补丁后应用:

 

 

  •  
  •  
  •  
  •  
# 生成补丁(A=老版本commit,B=新版本commit)git format-patch A..B drivers/media/... -o tmp_patch# 应用补丁git am tmp_patch/*

查看驱动版本

 

 

  •  
cat /sys/module/video_rkisp/parameters/version

判断 ISP 加载状态

 

 

  •  
  •  
  •  
  •  
# 查看video节点名称,确认RKISP节点grep '' /sys/class/video4linux/video*/name# 查看拓扑是否正常media-ctl -p -d /dev/mediaX

三、总结与资源推荐

 

开发要点总结

 

1.硬件层面:明确芯片的 VI 模块能力(如 RK3588 的多摄同步),理清 Sensor→VICAP→ISP 的数据链路;

 

 

2.软件层面DTS 配置要注意compatibledata-lanes等关键参数,驱动遵循 I2C+V4L2 Subdev 框架;

 

 

3.调试层面:先用media-ctl/v4l2-ctl验证链路,再通过 proc 日志和寄存器定位问题,常见问题优先查 AE 日志和参数限制。

 

 

参考资源

 

官方文档:《Rockchip_Driver_Guide_VI_CN》(本文基于 v1.1.1 版本);

 

 

希望这篇文章能帮你快速上手 RK 平台 Camera 开发!如果有其他问题,欢迎在评论区交流~

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分