主要是参考泰山派移植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_OV8858y、CONFIG_VIDEO_DW9714y2kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-csi-ov8858.dtsi新建ov885836dw97140c 4-lane 链路3kernel/arch/arm64/boot/dts/rockchip/tspi-rk3566-user-v10-linux.dtsinclude 换成 ov8858 的4同上 dtsireset-gpios用GPIO_ACTIVE_LOW5kernel/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 吴才成 1378913492qq.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; port0 { reg lt;0gt;; #address-cells lt;1gt;; #size-cells lt;0gt;; dphy0_in: endpoint1 { reg lt;1gt;; remote-endpoint lt;amp;ov8858_outgt;; >当然你也可以通过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 的 AIQcamera_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 值全是 0inf-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 / currentgolden 为 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-mmap4 --stream-skip60 --stream-count1 \ --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图片太大上传不了