解决香橙派没有适配ov13855的3A算法

OrangePi 5 开发板补齐 OV13855 JSON 和 3A 算法全过程笔记

先放上前后对比图片

3A算法启动前

3A算法启动后


之前偏绿是因为缺少 RKAIQ/3A 和正确 IQ 文件,启动 3A 后,颜色、曝光、白平衡明显改善。


相机实现自动白平衡,自动曝光等功能,最重要的是ov13855_CMK-OT2016-FV1_default.json 文件和
rkaiq_3A_server程序.

这两个文件都属于 瑞芯微 (Rockchip) 平台的摄像头处理框架 RKAIQ (Rockchip AIQ)。它们共同负责摄像头的图像信号处理(ISP)和 3A 算法(自动曝光、自动白平衡、自动对焦)的运行。

1. ov13855_CMK-OT2016-FV1_default.json

这是一个 摄像头效果配置文件 (通常被称为 IQ 文件Tuning 文件)。

  • 文件名解析
    • ov13855:代表摄像头的传感器型号(OmniVision 13855,一款1300万像素的传感器)。
    • CMK-OT2016-FV1:代表摄像头模组的厂家和型号,以及搭配的镜头信息。
    • .json:文件格式,内部存储了大量的配置参数。
  • 主要作用
    • 参数库:它存储了针对该特定摄像头硬件(感光芯片 + 镜头)调试出的最优参数。
    • 3A 初始化:包含 AE(自动曝光)的亮度目标、AWB(自动白平衡)的色温曲线、AF(自动对焦)的搜索步长等。
    • 图像增强:包含降噪(NR)、锐化、去畸变(LSC)、色彩校正(CCM)等 ISP 模块的配置参数。
    • 适配性:如果没有这个文件或者文件不匹配,摄像头虽然可能出图,但会出现画面偏色、亮度异常、对焦模糊等问题。

2. rkaiq_3A_server

这是一个 用户态服务程序(Daemon/Server),是整个摄像头引擎的核心运行实体。

  • 主要作用
    • 算法引擎:它负责运行 3A 算法逻辑。它从内核(ISP 驱动)获取统计数据(如画面亮度、色彩分布),计算出下一步的曝光时间、增益和白平衡参数。
    • 加载配置 :在启动时,它会去扫描系统目录(通常是 /etc/iqfiles/),根据当前接入的摄像头型号加载上述的 .json 配置文件。
    • 硬件通信:它充当了上层应用(如拍照 App)与底层硬件驱动之间的桥梁。它通过 V4L2 接口将计算好的参数下发给 ISP 硬件控制器。
    • 实时调试:它通常还支持调试功能,可以配合 PC 端的瑞芯微调试工具(RKISP Tuner)实时修改图像效果。

两者的关系

简单来说:

  • ov13855...json 是"乐谱":记录了声音(图像)应该如何表现。
  • rkaiq_3A_server 是"演奏者":他读取乐谱,并根据实际情况(环境光线变化)实时调整演奏方式,最终产生清晰、准确的视频画面。

常见应用场景:

如果你在开发基于 RK3568、RK3588 等芯片的嵌入式设备,当你更换了不同型号的摄像头模组时,就需要将对应的 .json 文件放到指定位置,并确保 rkaiq_3A_server 正常运行,否则摄像头将无法达到最佳显示效果。


0. 问题背景

开发板使用 OV13855 摄像头,设备树中已经有:

dts 复制代码
ov13855@36 {
    compatible = "ovti,ov13855";
    status = "okay";
};

但板子中最初只有:

text 复制代码
/etc/iqfiles/ov13850_CMK-CT0116_default.json

缺少 OV13855 对应 IQ 文件:

text 复制代码
ov13855_CMK-OT2016-FV1_default.json

同时板子中最初也没有:

text 复制代码
rkaiq_3A_server

所以问题不是单纯缺 JSON,而是:

text 复制代码
缺 OV13855 IQ 文件
+
缺 RKAIQ/3A 用户态程序

一、确认运行时设备树中确实有 OV13855

1. 导出运行时设备树

一开始在 /boot/dtb/rockchip/overlay 目录执行:

bash 复制代码
sudo dtc -I fs -O dts /proc/device-tree > running.dts

报错:

text 复制代码
bash: running.dts: Permission denied

报错原因

sudo 只作用于 dtc,但 > 重定向是普通用户执行的;并且当前目录 /boot/dtb/rockchip/overlay 普通用户无写权限。

解决方式

切换到用户目录导出:

bash 复制代码
cd ~

sudo dtc -I fs -O dts /proc/device-tree > running.dts

然后查 OV13855:

bash 复制代码
grep -n "ov13855" running.dts

查模组名和镜头名:

bash 复制代码
grep -n "camera-module-name\|camera-module-lens-name" running.dts

确认设备树中有:

dts 复制代码
compatible = "ovti,ov13855";
rockchip,camera-module-name = "CMK-OT2016-FV1";
rockchip,camera-module-lens-name = "default";

因此 IQ 文件名应为:

text 复制代码
ov13855_CMK-OT2016-FV1_default.json

二、确认 OV13855 是通过 overlay 启用的

这个部分我单独写了一篇笔记记录:

查看启动配置:

bash 复制代码
cat /boot/orangepiEnv.txt

orangepiEnv.txt里面的内容是我通过orangepi-config修改的

输出中有:

text 复制代码
fdtfile=rockchip/rk3588s-orangepi-5.dtb
overlays=i2c3-m0 lcd2 ov13855-c3 pwm15-m2

说明当前系统启动时加载了:

text 复制代码
rk3588-ov13855-c3.dtbo

所以运行时设备树是:

text 复制代码
基础 DTB
+ i2c3-m0 overlay
+ lcd2 overlay
+ ov13855-c3 overlay
+ pwm15-m2 overlay
= /proc/device-tree 中的最终运行时设备树

三、从 .img 镜像中查找 OV13855 JSON

原因:我ubuntu里面下载的SDK版本里面没有OV13855 JSON

思路:找一个发布时间比较近的ubuntu镜像,在.img文件中尝试提取OV13855 JSON(不一定有)

1. 绑定镜像

虚拟机中执行:

bash 复制代码
IMG="Orangepi5_1.2.2_ubuntu_jammy_desktop_gnome_linux5.10.160.img"

sudo losetup -Pf --show "$IMG"

输出:

text 复制代码
/dev/loop1

查看分区:

bash 复制代码
lsblk /dev/loop1

你的镜像只有一个分区:

text 复制代码
/dev/loop1p1

2. 挂载镜像

bash 复制代码
sudo mkdir -p /mnt/opiroot

sudo mount -o ro /dev/loop1p1 /mnt/opiroot

3. 查找 JSON

精确查找:

bash 复制代码
sudo find /mnt/opiroot -iname "ov13855_CMK-OT2016-FV1_default.json"

扩大查找:

bash 复制代码
sudo find /mnt/opiroot -iname "*ov13855*.json"

查所有 IQ 文件:

bash 复制代码
sudo find /mnt/opiroot -path "*iqfiles*" -type f -iname "*.json"

后来你在 SDK 中找到了:

text 复制代码
ov13855_CMK-OT2016-FV1_default.json

四、把 OV13855 JSON 拷到开发板

在开发板上确认 /etc/iqfiles 存在:

bash 复制代码
ls /etc/iqfiles

然后复制 JSON:

bash 复制代码
sudo mkdir -p /etc/iqfiles

sudo cp ov13855_CMK-OT2016-FV1_default.json /etc/iqfiles/

sudo chmod 644 /etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json

sync

验证:

bash 复制代码
ls -lh /etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json

你后来的输出是:

text 复制代码
-rw-r--r-- 1 root root 346K May 15 09:34 /etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json

说明 JSON 已经放好。


五、检查开发板是否有 3A 程序

在开发板上查:

bash 复制代码
sudo find / -name "rkaiq_3A_server" 2>/dev/null

没有结果。

继续查:

bash 复制代码
sudo find / -iname "*rkaiq*" 2>/dev/null
sudo find / -iname "*aiq*" 2>/dev/null
sudo find / -iname "*3a*" 2>/dev/null

也没有有效的 RKAIQ/3A 程序。

再查 RKISP:

bash 复制代码
sudo find / -iname "*rkisp*" 2>/dev/null

结果能看到:

text 复制代码
/usr/lib/librkisp.so
/sys/devices/platform/fdcc0000.rkisp
/sys/devices/platform/fdcb0000.rkisp
/sys/module/video_rkisp
/dev/v4l/by-path/platform-rkisp1-vir0-video-index*

进程检查:

bash 复制代码
ps -ef | grep -Ei "rkaiq|aiq|3a|rkisp"

只有 grep 本身。

开发板上没有找到rkaiq_3A_serve

分析

这说明:

text 复制代码
RKISP 内核驱动存在
但 RKAIQ/3A 用户态程序不存在

所以只放 JSON 不够,必须补上:

text 复制代码
rkaiq_3A_server
librkaiq.so

你上传的搜索结果也显示,板端未找到 rkaiq_3A_serverrkaiqaiq,但存在 rkisp 相关内核设备和节点。


六、从 .img 镜像中提取 rkaiq_3A_server

虚拟机中执行:

bash 复制代码
sudo find /mnt/opiroot -name "rkaiq_3A_server"

找到:

text 复制代码
/mnt/opiroot/usr/bin/rkaiq_3A_server

确认架构:

bash 复制代码
file /mnt/opiroot/usr/bin/rkaiq_3A_server

输出:

text 复制代码
ELF 64-bit LSB pie executable, ARM aarch64

说明它可以在 OrangePi 5 上运行。

查看依赖:

bash 复制代码
readelf -d /mnt/opiroot/usr/bin/rkaiq_3A_server | grep NEEDED

输出包含:

text 复制代码
Shared library: [librkaiq.so]
Shared library: [libpthread.so.0]
Shared library: [libdl.so.2]
Shared library: [libstdc++.so.6]
Shared library: [libm.so.6]
Shared library: [libgcc_s.so.1]
Shared library: [libc.so.6]
Shared library: [ld-linux-aarch64.so.1]

在开发板上查找依赖

重点缺的是:

text 复制代码
librkaiq.so

七、复制 3A 程序到开发板

虚拟机执行:

bash 复制代码
scp /mnt/opiroot/usr/bin/rkaiq_3A_server orangepi@开发板IP:/home/orangepi/

开发板执行:

bash 复制代码
sudo cp ~/rkaiq_3A_server /usr/bin/

sudo chmod +x /usr/bin/rkaiq_3A_server

八、解决 librkaiq.so 缺失问题

1. 开发板检查依赖

bash 复制代码
ldd /usr/bin/rkaiq_3A_server

最初报错:

text 复制代码
librkaiq.so => not found

报错原因

rkaiq_3A_server 是动态链接程序,运行时需要 librkaiq.so,但开发板系统中没有这个库。

2. 在镜像中查找库

虚拟机执行:

bash 复制代码
sudo find /mnt/opiroot -name "librkaiq.so*"

找到后复制到开发板:

bash 复制代码
scp /mnt/opiroot/实际路径/librkaiq.so* orangepi@开发板IP:/home/orangepi/

3. 开发板安装库

bash 复制代码
sudo cp ~/librkaiq.so* /lib/aarch64-linux-gnu/

sudo chmod 644 /lib/aarch64-linux-gnu/librkaiq.so*

sudo ldconfig

再次检查:

bash 复制代码
ldd /usr/bin/rkaiq_3A_server

后来的输出变为:

text 复制代码
librkaiq.so => /lib/aarch64-linux-gnu/librkaiq.so

说明依赖已经解决。


九、启动 rkaiq_3A_server 时遇到参数错误

你执行:

bash 复制代码
sudo /usr/bin/rkaiq_3A_server -a /etc/iqfiles

报错:

text 复制代码
/usr/bin/rkaiq_3A_server: invalid option -- 'a'
ERR: Usage: /usr/bin/rkaiq_3A_server to start 3A engine
         --silent,  optional, subpress debug log


命令行前面是一个蓝色实心的圆说明指令执行成功;如果是一个红色空心圆,里面是红×说明执行失败.

报错原因

这个版本的 rkaiq_3A_server 不支持:

bash 复制代码
-a /etc/iqfiles

它只支持直接启动,或者加:

bash 复制代码
--silent

它大概率默认从固定路径读取 IQ 文件,例如:

text 复制代码
/etc/iqfiles/

十、正确启动 3A 程序

前台启动

bash 复制代码
sudo /usr/bin/rkaiq_3A_server

如果程序不退出,说明正在运行。

后台启动

bash 复制代码
sudo /usr/bin/rkaiq_3A_server &

静默后台启动

bash 复制代码
sudo /usr/bin/rkaiq_3A_server --silent &

带日志启动,推荐排错用

bash 复制代码
sudo sh -c '/usr/bin/rkaiq_3A_server > /tmp/rkaiq.log 2>&1 &'

查看日志:

bash 复制代码
cat /tmp/rkaiq.log

检查进程:

bash 复制代码
ps -ef | grep -i rkaiq

如果看到:

text 复制代码
/usr/bin/rkaiq_3A_server

说明 3A 服务已经运行。


十一、最终验证 ISP / 3A 是否生效

1. 检查 OV13855 IQ 文件

bash 复制代码
ls -lh /etc/iqfiles/ov13855_CMK-OT2016-FV1_default.json

2. 检查 3A 进程

bash 复制代码
ps -ef | grep -i rkaiq

3. 检查 media 链路

bash 复制代码
media-ctl -p | grep -iE "ov13855|rkisp|rkcif|mipi|csi"

4. 检查日志

bash 复制代码
dmesg | grep -Ei "ov13855|rkisp|rkcif|mipi|csi|rkaiq|iq"

5. 测试采集画面

bash 复制代码
gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=1280,height=720 ! videoconvert ! autovideosink

使用3A算法后

使用3A算法前

之前偏绿是因为缺少 RKAIQ/3A 和正确 IQ 文件,启动 3A 后,颜色、曝光、白平衡明显改善。


十二、当前最终状态总结

已经完成:

text 复制代码
1. 确认运行时设备树中有 OV13855
2. 确认模组名是 CMK-OT2016-FV1
3. 找到对应 IQ 文件 ov13855_CMK-OT2016-FV1_default.json
4. 拷贝 IQ 文件到 /etc/iqfiles/
5. 从 .img 中提取 rkaiq_3A_server
6. 从 .img 中提取并安装 librkaiq.so
7. 解决 ldd 中 librkaiq.so not found 问题
8. 明确当前 rkaiq_3A_server 不支持 -a 参数

现在正确启动命令是:

bash 复制代码
sudo /usr/bin/rkaiq_3A_server --silent &

然后验证:

bash 复制代码
ps -ef | grep -i rkaiq
gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=1280,height=720 ! videoconvert ! autovideosink

核心结论:

text 复制代码
OV13855 设备树有了,IQ JSON 有了,3A 程序和依赖库也补齐了。
接下来只需要用正确方式启动 rkaiq_3A_server,并验证画面效果。
相关推荐
是垚不是土1 小时前
PostgreSQL 运维工程师 “一本通“ :安装、配置、备份与监控
linux·运维·数据库·postgresql·运维开发
Irene19911 小时前
在 Linux 命令中,- 开头的东西几乎都是“参数/选项“,用来告诉命令“具体怎么做“
linux
IT大白鼠1 小时前
Linux账号和权限管理
linux·运维·服务器
zzzyyy5381 小时前
Linux 下 从 ELF 可执行文件 到 进程虚拟地址空间的加载、映射与运行底层原理
linux·运维
故事和你912 小时前
洛谷-【图论2-1】树4
开发语言·数据结构·c++·算法·动态规划·图论
故事和你912 小时前
洛谷-【图论2-1】树1
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
不会C语言的男孩2 小时前
C++ SLTL编程
java·开发语言·c++
码农-阿杰2 小时前
Java 线程等待唤醒机制深度解析:synchronized、ReentrantLock、LockSupport 底层实现对比
java·开发语言·c++
hweiyu002 小时前
Linux命令:ip6tables
linux·运维·服务器