三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

019、瑞芯微RK3588/RK3568 ISP架构:Rockchip ISP的3A框架与调试实战

019、瑞芯微RK3588/RK3568 ISP架构:Rockchip ISP的3A框架与调试实战

019、瑞芯微RK3588/RK3568 ISP架构:Rockchip ISP的3A框架与调试实战

上周在产线上盯一个RK3588的项目,客户反馈夜间行车记录仪画面偏色,红色车灯直接过曝成白色,而且暗部噪点像下雪。我第一反应是AE和AWB的联动出了问题,但拿到log一看,3A统计值全在正常范围,这就邪门了。后来翻到ISP的tunning参数,发现是Crosstalk矩阵在低照度下被强制拉高,把红色通道的串扰放大,再加上NR的强度没跟上,噪点全被当成细节保留下来。这种问题,你不看芯片内部的数据流,光靠调3A参数是永远调不出来的。

瑞芯微的ISP架构,跟高通、联发科最大的区别在于它的模块化程度。RK3588用的是双ISP pipeline,每个pipeline可以独立跑一组3A,也可以做binning合成。RK3568则是单ISP,但支持多路复用。这个差异直接决定了你的软件架构怎么设计——如果你在RK3588上做双摄,两个sensor各占一个pipeline,那3A的同步就得靠硬件trigger,不能像RK3568那样用软件轮询。我见过有团队在RK3588上把两个sensor挂到同一个pipeline,结果帧率直接砍半,因为ISP的带宽被分掉了。

Rockchip的3A框架,核心是RkAiq(Rockchip AIQ)。它不像高通的CamX那样有完整的plugin机制,也不像海思的ISP那样有独立的3A server。RkAiq是一个库,直接链接到你的camera hal进程里。这意味着你的3A线程和ISP配置线程是共享同一个进程空间的,一旦某个模块崩溃,整个camera服务就挂了。所以调试的时候,我习惯先把RkAiq的log级别开到最大,用rk_aiq_set_log_level这个接口,别嫌log多,它能把每个模块的中间统计值都打出来,比你在应用层瞎猜强一百倍。

3A的启动顺序是个大坑。Rockchip的文档里写的是AE先跑,然后AWB,最后AF。但实际量产中,如果你在sensor出流的第一帧就启动AE,你会发现曝光值会震荡好几帧才收敛。原因在于RK3588的ISP里,AE统计模块默认是关闭的,你得先配置好统计窗口和权重,再让ISP跑起来。我一般是在sensor stream on之前,就把AE的统计窗口设成全画面,权重用中心偏重,然后等第二帧的统计值出来再启动AE算法。这样能省掉至少三帧的收敛时间。

AWB的调试,Rockchip的框架里有个叫rk_aiq_awb_stat_cfg的结构体,里面有个zone的配置。默认是5x5的网格,但如果你做的是车载项目,前挡风玻璃的偏色会影响AWB,这时候你得把玻璃区域对应的zone权重降下来。别用全局的AWB增益去补偿,那样会把整个画面的色温都带偏。我做过一个项目,客户要求车内和车外同时拍,AWB死活调不好,后来我把统计区域分成上下两块,上面用日光色温的预设,下面用白炽灯色温的预设,然后根据AE的亮度值做线性插值,效果立竿见影。

AF这块,RK3588的对比度AF算法在低对比度场景下容易拉风箱。我建议直接用PDAF,Rockchip的ISP支持sensor的相位对焦数据融合。但注意,PDAF的校准数据是存在sensor的OTP里的,如果你的模组厂没烧录,那AF就会乱跳。调试的时候,先用rk_aiq_af_get_calib_info看看校准数据读出来没有,没有的话赶紧找模组厂要,别自己瞎调搜索步长。

调试工具方面,Rockchip的IQ工具是RkISP10Tool,但说实话,这个工具在RK3568上能用,在RK3588上经常连不上。我后来都是直接用adb推/etc/iqfiles/下的xml文件,改完重启camera服务。这里有个坑,RK3588的IQ文件是加密的,你得用瑞芯微提供的rk_aiq_tool解密后才能改。别用十六进制编辑器硬改,改完ISP直接不工作,报iq load failed

NR和Sharpen的调试,我建议先关掉一切,看raw图。用rk_aiq_capture_raw抓raw,然后在PC上用工具分析噪点水平。RK3588的NR模块有四个等级,从NR_LEVEL_LOWNR_LEVEL_HIGH,但实际效果跟sensor的增益是强相关的。ISO 800以下用LOW,ISO 1600以上必须用HIGH,否则暗部细节全没了。Sharpen的强度要跟NR联动,NR开高了,Sharpen就得降下来,不然会出现白边。

最后说一个量产踩过的坑。RK3568的ISP支持HDR,但HDR的合成是在sensor端做的,ISP只做tone mapping。如果你的sensor不支持HDR,千万别在ISP里开hdr_mode,否则画面会发灰,因为ISP的tone mapping曲线是按HDR输入设计的。我见过有工程师为了省成本,用普通sensor硬开HDR,结果客户验收时直接退货。

经验之谈,瑞芯微的ISP调试,核心是理解它的统计模块。AE、AWB、AF的统计都是独立的,但它们的配置是互相影响的。你调AE的时候,AWB的统计窗口也会跟着变,因为AE改变了曝光时间,画面的亮度分布就变了。所以调试顺序一定是先固定AWB和AF,只调AE,等AE收敛了,再调AWB,最后调AF。别想着一步到位,那是不可能的。

还有一点,RK3588的ISP有两个pipeline,如果你只用一个,另一个会进入低功耗模式。这时候如果你去读它的寄存器,读出来的是全零。别慌,这不是bug,是芯片的电源管理策略。你需要在dts里把另一个pipeline的电源一直开着,或者用rk_aiq_set_pipeline_mode把它设成standby而不是off。

调试ISP,最忌讳的就是只看效果不看数据。瑞芯微的ISP架构虽然模块化,但每个模块的输入输出都是可追踪的。你只要把rk_aiq_set_log_level开到RK_AIQ_LOG_LEVEL_DEBUG,然后抓一帧raw,再抓一帧yuv,对比一下就知道是哪个模块出了问题。别凭感觉调参数,那是在浪费产线的时间。

← 返回列表