泰山派移植OV8858驱动并添加自动聚焦功能

主要是参考泰山派移植OV8858驱动并添加自动聚焦功能_泰山派ov8858-CSDN博客文章浏览阅读2.9k次,点赞17次,收藏29次。本文介绍在泰山派RK3566开发板上移植OV8858 MIPI摄像头驱动的过程,包括设备树配置、4-lane CSI模式设置、ISP参数匹配及DW9714马达的自动聚焦功能集成。通过替换原OV5695摄像头,实现了800万像素、30fps高清视频采集,并详细解析了复位控制、链路配置和视频流获取方法。https://blog.csdn.net/qq_53686293/article/details/153208692https://blog.csdn.net/qq_53686293/article/details/153208692这里有比较详细的讲解,我这里只做步骤讲解,部分会有具体的说明。但是呢,我遇到了一些问题,顺便整理一下。

改动清单

#文件改动
1kernel/arch/arm64/configs/rk3566.config加CONFIG_VIDEO_OV8858=y、CONFIG_VIDEO_DW9714=y
2kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-csi-ov8858.dtsi新建:ov8858@36+dw9714@0c+ 4-lane 链路
3kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dtsinclude 换成 ov8858 的
4同上 dtsireset-gpios用GPIO_ACTIVE_LOW
5kernel/drivers/media/i2c/ov8858.c复位时序 0/1 互换(3 处)
6external/camera_engine_rkaiq/rkaiq/hwi/isp20/CamHwIsp20.cppsetLensVcmCfg()补af_otp[0]空指针判断
7同上get_sensor_info()补 AWB OTP golden 值校验

第一步:

在kernel/arch/arm64/boot/dts/rockchip/下创建tspi-rk3566-csi-ov8858.dtsi,

/********************************************************************* * 立创开发板不靠卖板赚钱,以培养中国工程师为己任 * 泰山派软硬件资料与相关扩展板软硬件资料官网全部开源 * 开发板官网:www.lckfb.com * 立创论坛:oshwhub.com/forum * 关注B站:【立创开发板】,掌握我们的最新动态! ********************************************************************* * 文件名:tspi-rk3566-csi-v10 * 描述:mipi 摄像头 * 更新: * 时间 作者 联系 说明 * 2023-09-13 吴才成 1378913492@qq.com v1.0.0 *********************************************************************/ //phy u序列 &combphy1_usq { status = "okay"; }; //phy P序列 &combphy2_psq { status = "okay"; }; //dphy硬件 &csi2_dphy_hw { status = "okay"; }; //摄像头D-PHY接口 &csi2_dphy0 { status = "okay"; /* * dphy0 only used for full mode, * full mode and split mode are mutually exclusive */ ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = &lt;0&gt;; #address-cells = &lt;1&gt;; #size-cells = &lt;0&gt;; dphy0_in: endpoint@1 { reg = &lt;1&gt;; remote-endpoint = &lt;&amp;ov8858_out&gt;; >当然,你也可以通过menuconfig,

./build.sh kernel-config

输入/

然后搜索ov8858

这里我已经打开了

另一个也是,去搜索即可

第五步:

编译

./build.sh kernel

编完检查驱动是否真的编进去了:

ls -l kernel-6.1/drivers/media/i2c/ov8858.o kernel-6.1/drivers/media/i2c/dw9714.o ls -l kernel-6.1/arch/arm64/boot/Image

看到.o文件、Image时间是刚才 → 才算真的编进去了。
如果.o不存在,说明配置没生效(回去检查rk3566.config)。

第六步,这里是我额外遇到的问题:

到这里摄像头已经能出图了。但如果直接使用rkaiq_3A_server,会遇到两个问题:

  • rkaiq_3A_server一启动就Segmentation fault
  • 修好崩溃后,画面能用,但整幅严重偏绿(白纸拍出来也是绿的)

这两个问题的修改都在 Rockchip 的 AIQ(camera_engine_rkaiq)里,不在驱动和设备树。

错误一:af_otp[0] 空指针

位置:external/camera_engine_rkaiq/rkaiq/hwi/isp20/CamHwIsp20.cpp
函数:CamHwIsp20::setLensVcmCfg()

for (int i = 0; i < mod_info.af.dir_cnt; i++) { if (mod_info.af.af_otp[i].vcm_dir == AF_OTP_DIR_HORIZONTAL) af_otp[0] = &mod_info.af.af_otp[i]; // 只有方向=水平才填 af_otp[0] else if (mod_info.af.af_otp[i].vcm_dir == AF_OTP_DIR_UP) af_otp[1] = &mod_info.af.af_otp[i]; else if (mod_info.af.af_otp[i].vcm_dir == AF_OTP_DIR_DOWN) af_otp[2] = &mod_info.af.af_otp[i]; } start_ma = af_otp[0]->vcm_start; // ← 方向不是 0 时,这里是 NULL rated_ma = af_otp[0]->vcm_end;

修改:没有水平方向的数据,就保持默认值,不要解引用空指针。

if (af_otp[0] == nullptr) { LOGW_AF("no horizontal VCM calibration in module info, keep default vcm range"); } else { start_ma = af_otp[0]->vcm_start; rated_ma = af_otp[0]->vcm_end; range = rated_ma - start_ma; if (extend_range_ratio != 0) { start_ma = start_ma - (int)(range * extend_range_ratio); rated_ma = rated_ma + (int)(range * extend_range_ratio); if (start_ma < 0) start_ma = 0; if (rated_ma > 1023) rated_ma = 1023; } }

错误二:AWB 把 R/B 增益乘成 0,画面全绿

原因:驱动kernel/drivers/media/i2c/ov8858.c上报的 AWB OTP 信息里,golden 值全是 0:

inf->awb.flag = 1; inf->awb.r_value = rg; inf->awb.b_value = bg; inf->awb.gr_value = 0x200; inf->awb.gb_value = 0x200; inf->awb.golden_r_value = 0; // ← 全 0 inf->awb.golden_b_value = 0; inf->awb.golden_gr_value = 0; inf->awb.golden_gb_value = 0;

AIQ 的 OTP 补偿算的是golden / current,golden 为 0 → 补偿系数 0 → 增益被清零。

关键点:AIQ 有两套 HWI 实现,C 版有校验,C++ 版没有。

修改:在 C++ 版读模块信息的地方补上同样的校验。

vi external/camera_engine_rkaiq/rkaiq/hwi/isp20/CamHwIsp20.cpp
// CamHwIsp20.cpp : get_sensor_info() sensor_info->len_name = std::string(minfo->base.lens); if (minfo->awb.flag && (minfo->awb.golden_r_value == 0 || minfo->awb.golden_b_value == 0 || minfo->awb.golden_gr_value == 0 || minfo->awb.golden_gb_value == 0)) { LOGE_CAMHW_SUBM(ISP20HW_SUBM, "@%s awb otp info is abnormal, ignore it", sensor_info->device_name.c_str()); minfo->awb.flag = 0; }

改完怎么编译

# 改源码(就是上面两处) # 重新编库 make camera-engine-rkaiq-rebuild # 产物 buildroot/output/latest/build/camera-engine-rkaiq-1.0/rkaiq/all_lib/MinSizeRel/librkaiq.so

这个 buildroot 包是SITE_METHOD = local,源码直接取自external/camera_engine_rkaiq,
所以改源码重编是生效的、持久的。

上板(先备份,库坏了整个摄像头就用不了):

cp /lib/librkaiq.so /userdata/librkaiq.so.bak cp /userdata/librkaiq.so /lib/librkaiq.so sync killall rkaiq_3A_server /usr/bin/rkaiq_3A_server &

如果有问题,回滚:

killall rkaiq_3A_server cp /userdata/librkaiq.so.bak /lib/librkaiq.so sync

第七步:验证

驱动有没有加载

dmesg | grep -iE "ov8858|dw9714"

期望:

ov8858 4-0036: Detected OV008858 sensor, REVISION 0xb2 dw9714 4-000c: check dw9714 connection OK! dw9714 4-000c: probing successful rockchip-csi2-dphy csi2-dphy0: dphy0 matches m00_b_ov8858 4-0036:bus type 5

抓帧看画面

然后按照参考文章:先运行60帧,然后抓取一帧

v4l2-ctl -d /dev/video0 --stream-mmap=4 --stream-skip=60 --stream-count=1 \ --stream-to=/userdata/white.yuv

对着白纸拍,转成 PNG 看:白色物体应该接近中性灰白,而不是绿色。

拷贝文件到中,虚拟机linux里。

然后虚拟机里进入到所在目录里,输入

ffmpeg -f rawvideo -pixel_format nv12 -video_size 3264x2448 -i white.yuv -frames:v 1 white.png

即可看到png

图片太大,上传不了

相关新闻

百度网盘免费发放500G空间了,大家记得及时领取

百度网盘免费发放500G空间了,大家记得及时领取

话不多说&#xff0c;直接上图免费网盘空间500G是有30天时效性的&#xff0c;不过每个自然月都是可领取的&#xff0c;大家过期之后记得重新领取即可。比较适合短期应急使用&#xff0c;全程免费&#xff0c;官方长期活动。

2026/10/20 20:03:02 阅读更多 →
快慢指针找环:为什么重置指针后能精确找到环入口?

快慢指针找环:为什么重置指针后能精确找到环入口?

很多同学在接触“快慢指针找环”这个经典问题时&#xff0c;都是靠背代码过关的。第一阶段&#xff1a;慢指针每次走一步&#xff0c;快指针每次走两步&#xff0c;如果两个指针相遇了&#xff0c;说明链表有环&#xff1b;第二阶段&#xff1a;把某个指针重置到链表头&#xf…

2026/10/20 20:03:02 阅读更多 →
书匠策AI实操指南:从选题到答辩的课程论文全流程

书匠策AI实操指南:从选题到答辩的课程论文全流程

每次课程论文季&#xff0c;朋友圈都会哀嚎一片。找文献找到眼瞎&#xff0c;列提纲列到怀疑人生&#xff0c;写到结论时突然发现引言和正文对不上&#xff0c;这种事情几乎人人遇到过。我见过太多同学卡在第一步&#xff0c;题目拍脑袋定&#xff0c;框架东拼西凑&#xff0c;…

2026/10/20 20:03:02 阅读更多 →

最新新闻

YOLO26目标检测训练到RK3588部署:ONNX与RKNN适配实践

YOLO26目标检测训练到RK3588部署:ONNX与RKNN适配实践

YOLO26 目标检测的训练到瑞芯微平台适配&#xff0c;这条链路我最近刚完整跑通一遍。先说结论&#xff1a;真正卡人的地方不在训练本身&#xff0c;而在从 PyTorch 模型走向 RKNN 运行时的那几步——ONNX 导出、算子兼容、INT8 量化&#xff0c;每一个都埋着不少雷。我是在给一…

2026/10/20 20:43:28 阅读更多 →
梯度增强PINN:攻克Allen-Cahn方程多陡峭界面难题

梯度增强PINN:攻克Allen-Cahn方程多陡峭界面难题

Allen-Cahn方程是我调过的最“拧巴”的PDE之一。它表达式极简&#xff0c;一个∂u/∂t ε∂u/∂x u - u&#xff0c;但解的画面完全不简单&#xff1a;能量驱动下的相分离会让解在空间里劈出好几条尖锐的界面&#xff0c;这些界面随时间演化、移动、合并。所谓“多非常陡峭区…

2026/10/20 20:43:28 阅读更多 →
计算机教材内容策划与写作:从概念到工程实践

计算机教材内容策划与写作:从概念到工程实践

抱歉&#xff0c;我无法处理这个请求。

2026/10/20 20:43:28 阅读更多 →
从图像到数据:HaoCurve曲线提取实战与避坑指南

从图像到数据:HaoCurve曲线提取实战与避坑指南

简介&#xff1a;HaoCurve&#xff08;薅曲线&#xff09;是一套面向科研人员、工程师与数据分析者的MATLAB曲线绘制工具源码&#xff0c;适合需要在MATLAB环境中快速生成、编辑和分析数据曲线图的用户&#xff0c;尤其对希望深入理解绘图脚本实现、进行二次开发的进阶使用者更…

2026/10/20 20:43:28 阅读更多 →
CLI编码代理失败过程解剖:从轨迹日志到根因分析

CLI编码代理失败过程解剖:从轨迹日志到根因分析

读到一篇很有意思的论文&#xff0c;标题叫《Failure as a Process: An Anatomy of CLI Coding Agent Trajectories》。这两年命令行AI编程工具越来越多&#xff0c;从最初的“能写一段函数”到现在能在真实仓库里自己定位问题、改代码、跑测试&#xff0c;甚至提交补丁。但大多…

2026/10/20 20:43:28 阅读更多 →
小橘子V4.790:本地可调试塔防策略模拟器

小橘子V4.790:本地可调试塔防策略模拟器

简介&#xff1a;本资源是《向僵尸开炮》游戏的自动化对局辅助工具——小橘子V4.790版本完整部署包&#xff0c;面向游戏AI开发者、自动化测试工程师及休闲游戏技术爱好者&#xff0c;用于快速实现人机对战环境下的策略执行、界面识别与操作模拟。压缩包共741个文件&#xff0c…

2026/10/20 20:42:25 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →