主要是参考泰山派移植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=y2kernel/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_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 吴才成 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 = <0>; #address-cells = <1>; #size-cells = <0>; dphy0_in: endpoint@1 { reg = <1>; remote-endpoint = <&ov8858_out>; >当然,你也可以通过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图片太大,上传不了
主要是参考泰山派移植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=y2kernel/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_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 吴才成 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 = <0>; #address-cells = <1>; #size-cells = <0>; dphy0_in: endpoint@1 { reg = <1>; remote-endpoint = <&ov8858_out>; >当然,你也可以通过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图片太大,上传不了