rk3588 android12 OV50C40传感器RAW格式异常修复:还原8192x6144原生分辨率 电子说
在RK3588平台适配OV50C40高分辨率图像传感器的过程中,我们发现传感器RAW格式输出分辨率出现异常,被错误配置为4096x3072,而非硬件原生的8192x6144,直接导致相机拍照分辨率未达硬件规格,还伴随部分配置不匹配引发的相机启动、拍照异常问题。本次通过驱动层、ISP算法配置层、Camera HAL层的全链路参数修正,彻底解决了该RAW格式分辨率错误问题,修复后相机可正常打开,拍照功能完全达标,各项关联功能也适配正常。
本文将详细拆解本次OV50C40传感器的修复思路与核心代码修改点,为高分辨率图像传感器在RK3588平台的适配提供可落地的参考。

核心修复思路
本次修复围绕还原OV50C40传感器8192x6144原生RAW分辨率展开,核心原则是全链路参数统一匹配原生分辨率,同时修正因分辨率不匹配引发的传感器翻转、镜头阴影校正(LSC)、自动对焦(AF)、相位检测(PD)等关联配置异常,最终实现:
1.RAW格式输出分辨率恢复为8192x6144;
2.相机正常打开、拍照功能无异常;
3.传感器对焦、LSC、PD等辅助功能适配正常。
修复涉及三个核心层级的代码修改,实现从硬件驱动到算法配置、上层HAL的全链路参数对齐。
关键代码修改细节(含修复前后对比)
本次修复的代码文件集中在RK3588平台的相机适配相关目录,涵盖ISP配置、Camera HAL配置、Kernel传感器驱动三大模块,以下为各模块的核心修改点及代码对比。
一、ISP算法配置层:修正传感器与算法核心参数
文件路径:
external/camera_engine_rkaiq/iqfiles/isp3x/ov50c40_HZGA06_ZE0082C1.json
作为ISP算法的核心配置文件,此处需同步分辨率参数,并修正所有关联的算法配置,确保与原生分辨率匹配。
1. 传感器基础分辨率+翻转配置(核心)
修复前代码:
"sensor": { "width": 8192, "height": 6144, "CISFlip": 1, "CISMirror": 0},
修复后代码:
"sensor": { "width": 8128, // 修正:硬件实际有效像素宽度(8192为标称值,8128为有效输出) "height": 6144, "CISFlip": 0, // 修正:关闭翻转,解决画面上下颠倒问题 "CISMirror": 0},
修改说明:
•宽度从8192调整为8128,匹配传感器硬件实际输出的有效像素;
•关闭CISFlip翻转(1→0),解决分辨率调整后画面翻转的异常问题。
2. LSC镜头阴影校正参数适配
修复前代码:
"LSC": { "LSC_Enable": 1, "LSC_Resolution": "8192x6144", "LSC_HSegSize": 512, "LSC_VSegSize": 384, "LSC_D65": "LSC_OV50C40_D65_8192x6144.bin"}
修复后代码:
"LSC": { "LSC_Enable": 1, "LSC_Resolution": "8128x6144", // 修正:匹配有效像素分辨率 "LSC_HSegSize": 508, // 修正:8128/16=508,原512适配8192,分辨率不匹配会导致LSC失效 "LSC_VSegSize": 384, "LSC_D65": "LSC_OV50C40_D65_8128x6144.bin" // 修正:关联对应分辨率的LSC参数表}
修改说明:
•所有光照条件(D65/A/CWF等)的LSC参数文件名同步改为8128x6144,确保算法加载正确的校正表;
•水平分段尺寸从512改为508,计算公式为「有效宽度/16」,解决LSC校正区域错位问题。
3. 自动对焦(AF)配置优化
修复前代码:
"AF": { "FullRangeTbl": [0,16,32,48,64], "FineSearchStep": 2, "TrigThers": 0.2, "BrightnessPauseEn": 1, "PointLightThers": 0.1}
修复后代码:
"AF": { "FullRangeTbl": [0,8,16,24,32,40,48,56,64], "FullRangeTbl_Len": 9, // 新增:明确数组长度,避免算法解析异常 "FineSearchStep": null, // 移除:无效参数,导致对焦步长计算错误 "TrigThers": 0.075, // 修正:降低触发阈值,提升对焦灵敏度 "BrightnessPauseEn": 0, // 关闭:亮度暂停检测,避免对焦频繁中断 "PointLightThers": 0.3 // 提升:点光源检测阈值,减少误触发}
二、Camera HAL层:更新上层流配置与传感器信息
文件路径:
hardware/rockchip/camera/etc/camera/camera3_profiles_rk3588.xml
HAL层作为应用与底层驱动的中间层,需同步更新分辨率相关的流配置和传感器信息,确保上层应用识别正确的硬件规格。
核心:分辨率流配置修正
修复前代码:
33333333 33333333 4096x3072 4096x3072
修复后代码:
33333333 33333333 33333333 8128x6144 8192x6144 8128x6144
修改说明:
•新增8128x6144分辨率的BLOB/YCbCr流配置,让上层应用支持原生高分辨率输出;
•修正sensor-info中的有效阵列/像素阵列尺寸,解决上层识别分辨率与底层不匹配的问题。
三、Kernel驱动层:修正传感器硬件驱动参数
文件路径:kernel-5.10/drivers/media/i2c/ov50c40.c
驱动层是传感器硬件的直接控制层,需修正分辨率模式、像素时钟、总线格式等核心硬件参数,还原原生分辨率的硬件驱动逻辑。
1. 分辨率模式+时序配置(核心)
修复前代码:
// 错误的4096x3072高帧率模式(被错误设为默认)static const struct ov50c40_mode ov50c40_mode_4096x3072_30fps = { .width = 4096, .height = 3072, .hts = 4224, .vts = 3100, .mipi_freq_idx = 1, // 低频率索引 .pix_clk = 625000000,};// 被注释的原生8192x6144模式// static const struct ov50c40_mode ov50c40_mode_8192x6144_15fps = {// .width = 8192,// .height = 6144,// .hts = 8320,// .vts = 6176,// .mipi_freq_idx = 2,// .pix_clk = 1250000000,// };// 默认模式赋值错误const struct ov50c40_mode *ov50c40_get_default_mode(void) { return &ov50c40_mode_4096x3072_30fps;}
修复后代码:
// 注释错误的4096x3072模式,还原原生8192x6144模式// static const struct ov50c40_mode ov50c40_mode_4096x3072_30fps = {// .width = 4096,// .height = 3072,// .hts = 4224,// .vts = 3100,// .mipi_freq_idx = 1,// .pix_clk = 625000000,// };// 还原并修正原生8192x6144模式(有效像素8128)static const struct ov50c40_mode ov50c40_mode_8192x6144_15fps = { .width = 8128, // 修正:有效像素宽度 .height = 6144, .hts = 8256, // 修正:时序匹配8128宽度 .vts = 6176, .mipi_freq_idx = 2, // 高频率索引,适配高分辨率带宽 .pix_clk = 1250000000,};// 默认模式改为原生分辨率const struct ov50c40_mode *ov50c40_get_default_mode(void) { return &ov50c40_mode_8192x6144_15fps;}
2. 像素时钟+总线格式修正
修复前代码:
// 像素时钟计算错误#define OV50C40_PIX_CLK_1250M (1250 * 1000 * 1000)// 总线格式错误(SGRBG10不符合传感器规格)static const struct ov50c40_mbus_info mbus_info = { .code = MEDIA_BUS_FMT_SGRBG10_1X10, .pixeltype = V4L2_PIX_FMT_SGRBG10,};
修复后代码:
// 修正像素时钟宏定义(保持数值,补充注释)#define OV50C40_PIX_CLK_1250M (1250 * 1000 * 1000) // 适配8192x6144分辨率的像素时钟// 修正总线格式为SRGGB10(匹配OV50C40色彩滤波阵列)static const struct ov50c40_mbus_info mbus_info = { .code = MEDIA_BUS_FMT_SRGGB10_1X10, .pixeltype = V4L2_PIX_FMT_SRGGB10,};
修改说明:
•总线格式从SGRBG10改为SRGGB10,匹配OV50C40传感器的原生色彩滤波阵列(R-G-G-B排列),解决画面色彩失真问题;
•像素时钟保持1250MHz,适配8192x6144高分辨率的带宽需求。
修复后验证效果
本次全链路参数修正完成后,对OV50C40传感器在RK3588平台的功能进行了全面实测,核心验证结果如下:
1.基础功能:相机可正常打开,拍照、预览功能无异常,无闪退、卡死等问题;
2.分辨率达标:RAW格式输出分辨率成功还原为传感器原生的8192x6144(有效像素8128x6144),拍照分辨率符合硬件规格;
3.关联功能正常:LSC镜头阴影校正、自动对焦、PD相位检测等功能均正常工作,对焦触发灵敏、画面无阴影、相位检测精准;
4.性能稳定:8128x6144高分辨率下,帧率输出稳定,无丢帧、花屏、拖影等画质问题。
总结
1.本次修复核心是全链路分辨率参数对齐:从驱动层的硬件分辨率模式,到ISP算法层的LSC/AF/PD配置,再到HAL层的流配置,全部同步为OV50C40原生的8192x6144(有效8128x6144);
2.代码修改需兼顾“数值修正”和“关联配置适配”:比如分辨率调整后,需同步修正LSC分段尺寸、AF触发阈值、总线格式等,避免单一参数修改引发新异常;
3.修复前后的代码对比清晰展示了核心问题点:分辨率模式赋值错误、有效像素未匹配、翻转配置异常、总线格式不兼容是本次问题的核心诱因。
更多嵌入式相机传感器适配、RK3588平台硬件驱动开发的技术细节,欢迎一起交流探讨~
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !