RK3588 Android 12平台OV50C40传感器RAW格式修复:恢复8192x6144原生分辨率
在RK3588平台与OV50C40高分辨率图像传感器的集成过程中,技术人员发现该传感器的RAW数据输出存在分辨率偏差问题。原始配置错误地设置为4096x3072,而硬件支持的应为8192x6144。该错误不仅导致相机输出未能达到预期分辨率,还引发了启动与拍摄功能的异常。为此,开发团队从驱动层、ISP算法配置层到Camera HAL层进行了系统性修正,最终成功解决了RAW格式输出异常的问题,并确保了相机功能的稳定性与性能达标。
本文将全面解析OV50C40传感器在RK3588平台上的修复思路与关键代码修改,为类似高分辨率图像传感器的适配提供实操参考。
修复核心思路
本次修复的核心目标在于还原OV50C40传感器的原生RAW分辨率8192x6144,并确保全链路参数一致性。修复过程不仅修正了分辨率配置,还对因分辨率不匹配导致的图像翻转、镜头阴影校正(LSC)、自动对焦(AF)、相位检测(PD)等问题进行了同步优化。最终实现了如下目标:
- RAW数据输出分辨率恢复为8192x6144;
- 相机启动与拍照功能运行稳定,无异常;
- LSC、AF、PD等相关图像处理功能适配正常。
修复涵盖驱动层、ISP算法层和HAL层的关键代码调整,实现从硬件到上层的全链路参数一致。
关键代码修改细节(含修复前后对比)
修复涉及RK3588平台中的ISP配置、Camera HAL配置以及内核传感器驱动三大模块。以下为各模块的核心修改点及代码对比。
一、ISP算法配置层:修正图像处理参数
文件路径:external/camera_engine_rkaiq/iqfiles/isp3x/ov50c40_HZGA06_ZE0082C1.
该配置文件是ISP算法的关键输入,需对分辨率及相关图像处理参数进行同步调整。
1. 传感器基础分辨率与翻转设置(关键)
修复前代码:
"sensor": { "width":8192,"height":6144,"CISFlip":1,"CISMirror":0},修复后代码:
"sensor":{ "width":8128, // 修正:匹配传感器实际有效像素 "height":6144, "CISFlip":0, // 修正:关闭翻转,解决画面异常 "CISMirror":0},修改说明:
- 将宽度值从8192调整为8128,以匹配传感器的有效像素输出;
- 关闭CISFlip,防止画面出现倒置。
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宽度 "LSC_VSegSize":384,"LSC_D65":"LSC_OV50C40_D65_8128x6144.bin"}修改说明:
- 将所有光照条件下使用的LSC校正文件统一为8128x6144格式;
- 调整LSC水平分段尺寸至508,以保证校正区域正确。
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 8128x6144 8192x6144 8128x6144
修改说明:
- 新增支持8128x6144分辨率的流配置,确保应用层可正确获取高分辨率输出;
- 修正传感器有效像素与支持分辨率,避免上层与底层配置冲突。
三、Kernel驱动层:恢复传感器原生驱动逻辑
文件路径:kernel-5.10/drivers/media/i2c/ov50c40.c
驱动层直接控制传感器硬件,需对分辨率模式、时序配置、总线格式等关键参数进行调整。
1. 分辨率模式与时序配置(核心)
修复前代码:
static const struct ov50c40_mode ov50c40_mode_4096x3072_30fps = { .width=4096, .height=3072, .hts=4224, .vts=3100, .mipi_freq_idx=1, .pix_clk=625000000,};const struct ov50c40_mode *ov50c40_get_default_mode(void) { return &ov50c40_mode_4096x3072_30fps;}修复后代码:
static const struct ov50c40_mode ov50c40_mode_8192x6144_15fps = { .width=8128, // 有效像素 .height=6144, .hts=8256, // 时序调整 .vts=6176, .mipi_freq_idx=2, // 高频率索引 .pix_clk=1250000000,};const struct ov50c40_mode *ov50c40_get_default_mode(void) { return &ov50c40_mode_8192x6144_15fps;}修改说明:
- 将默认模式改为8192x6144,确保硬件使用原生分辨率;
- 调整时序参数以适配高分辨率输出。
2. 总线格式与像素时钟修正
修复前代码:
#define OV50C40_PIX_CLK_1250M (1250 * 1000 * 1000)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) // 高分辨率所需时钟static const struct ov50c40_mbus_info mbus_info = { .code = MEDIA_BUS_FMT_SRGGB10_1X10, .pixeltype = V4L2_PIX_FMT_SRGGB10,};修改说明:
- 修正总线格式为SRGGB10,匹配OV50C40的色彩滤波阵列;
- 保持像素时钟为1250MHz,满足高分辨率带宽需求。
修复后验证效果
完成上述多层调整后,开发团队对OV50C40在RK3588平台上的表现进行了全面测试,验证结果如下:
- 基础功能:相机启动与拍照均无异常,无闪退或卡顿现象;
- 分辨率达标:RAW输出分辨率恢复为8192x6144,符合硬件规格;
- 图像处理功能正常:LSC、AF、PD等关键图像算法运行良好;
- 性能稳定:在高分辨率下画面输出流畅,无丢帧、拖影等问题。
总结
本次修复的要点在于实现全链路参数一致性:从驱动层到HAL层,所有配置均对齐为8192x6144(有效像素8128x6144)。代码调整不仅包括数值修正,还涉及多项图像处理参数的同步适配,防止局部更改引发连锁问题。
修复过程揭示了多个关键问题:分辨率模式默认值错误、有效像素未匹配、图像翻转异常、总线格式不兼容等,均是问题的核心诱因。
如需了解更多有关嵌入式图像传感器适配、RK3588平台驱动开发的技术细节,欢迎继续交流探讨。