rk3588 android12 OV50C40传感器RAW格式异常修复:还原8192x6144原生分辨率

电子说

1.4w人已加入

描述

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

本文将详细拆解本次OV50C40传感器的修复思路与核心代码修改点,为高分辨率图像传感器在RK3588平台的适配提供可落地的参考。

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平台硬件驱动开发的技术细节,欢迎一起交流探讨~

审核编辑 黄宇

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分