2、RK平台AF硬件架构:RK ISP与AF硬件模块、PDAF与CDAF原理、RK AF控制器寄存器概览
2.1 RK ISP 与 AF 硬件模块
做 AF 调试,第一件事不是调参数,而是搞清楚硬件长什么样。RK 平台的 ISP 和 AF 模块是紧密耦合的,说白了,AF 是 ISP 内部的一个专用硬件加速器。
我刚开始接触 RK 平台时,总觉得 AF 是 sensor 的事。后来才发现,RK ISP 内部有一个独立的 AF 引擎,它直接接管了统计数据的采集和计算。
整个硬件链路大致是这样的:
- Sensor 输出 RAW 数据给 ISP
- ISP 内部经过 BLC、LSC 等预处理后,数据分两路:一路去图像处理管线,另一路去 AF 统计模块
- AF 统计模块 计算对比度、相位差等数据,写入寄存器
- AF 控制器 读取这些统计数据,结合算法,输出 lens 位置控制信号
- VCM(音圈马达) 驱动 lens 移动到目标位置
关键点:AF 统计数据和图像数据是并行处理的。AF 不会拖慢帧率,因为它用的是 ISP 管线中的旁路数据。
嗯,这里要注意:RK 不同芯片的 ISP 版本不同,AF 模块的寄存器地址和功能会有差异。比如 RK3588 的 ISP3.0 和 RK3399 的 ISP2.0,AF 统计窗口的配置方式就不一样。
2.2 PDAF 与 CDAF 原理
AF 算法就两大流派:CDAF(对比度检测)和 PDAF(相位检测)。RK 平台两者都支持,而且可以混合使用。
2.2.1 CDAF:传统但可靠
CDAF 的原理很简单:找图像对比度最大的位置。对比度越高,画面越清晰。
RK ISP 内部有一个 Focus Value(FV) 统计模块,它会计算每个像素邻域的梯度信息。FV 值越大,说明图像越锐利。
我曾经在一个低照度项目里,CDAF 怎么都搜不到峰值。后来发现是 ISP 的降噪强度太大,把高频细节全抹掉了。调低降噪后,FV 曲线一下就正常了。
| CDAF 特性 | 说明 |
|---|---|
| 优点 | 算法简单,硬件开销小,适用场景广 |
| 缺点 | 需要来回搜索,速度慢,低对比度场景容易失败 |
| RK 实现 | 支持多窗口 FV 统计,可配置 Sobel/Laplacian 算子 |
2.2.2 PDAF:快,但有条件
PDAF 靠的是 sensor 上的相位检测像素。这些像素成对出现,通过比较左右(或上下)像素的相位差,直接算出 lens 应该往哪个方向移动多少距离。
你想想看,PDAF 一次计算就知道方向,而 CDAF 得来回试探。这就是 PDAF 快的原因。
RK 平台对 PDAF 的支持分两种:
- On-Sensor PDAF:sensor 内部完成相位差计算,直接输出 defocus 值给 ISP
- ISP-based PDAF:sensor 输出 RAW 数据,ISP 内部的 PDAF 模块自己算相位差
我的经验:On-Sensor PDAF 延迟更低,但算法是黑盒,不好调。ISP-based PDAF 虽然延迟稍高,但你可以拿到原始相位数据,调试空间大很多。
2.2.3 混合 AF:取长补短
RK 的 AF 控制器支持混合模式:先用 PDAF 快速粗调,再用 CDAF 精调。这样既快又准。
我记得有个项目,纯 PDAF 在暗光下精度不够,纯 CDAF 又太慢。最后用了混合模式,PDAF 先拉到 80% 的精度,CDAF 再微调剩下的 20%,效果很好。
2.3 RK AF 控制器寄存器概览
AF 控制器说白了就是一堆寄存器。你写对了,AF 就工作;写错了,lens 乱跑或者干脆不动。
我整理了一份常用寄存器清单,这些是调试时最常碰到的:
| 寄存器名称 | 偏移地址 | 功能描述 |
|---|---|---|
| AF_CTRL | 0x0000 | AF 使能、模式选择(CDAF/PDAF/混合) |
| AF_WINx | 0x0010~0x001C | 统计窗口坐标和大小配置(最多 4 个窗口) |
| AF_FV | 0x0020 | 当前帧的 Focus Value 值(只读) |
| AF_PD_DATA | 0x0030 | PDAF 相位差数据(只读) |
| AF_LENS_POS | 0x0040 | 目标 lens 位置(写入后 AF 控制器自动驱动 VCM) |
| AF_STATUS | 0x0050 | AF 状态标志(忙/完成/错误) |
避坑指南:我曾经在配置 AF_WIN 时,窗口坐标写反了(Y 坐标写到了 X 的位置),结果 AF 一直在画面边缘搜焦,中间区域全是模糊的。查了两天才发现是坐标配置问题。所以,窗口配置一定要 double check。
寄存器操作示例(伪代码):
// 1. 使能 AF 模块
write_reg(AF_CTRL, 0x01);
// 2. 配置统计窗口(中心区域 640x480)
write_reg(AF_WIN0_X, 320); // 起始 X
write_reg(AF_WIN0_Y, 240); // 起始 Y
write_reg(AF_WIN0_W, 640); // 宽度
write_reg(AF_WIN0_H, 480); // 高度
// 3. 选择 CDAF 模式
write_reg(AF_CTRL, 0x03);
// 4. 读取 FV 值
uint32_t fv = read_reg(AF_FV);
// 5. 设置 lens 位置
write_reg(AF_LENS_POS, 200);
嗯,这里要补充一点:AF_LENS_POS 写入的值不是物理距离,而是 VCM 的 DAC 码值。不同 VCM 的 DAC 范围和线性度不一样,需要提前校准。
2.4 整体硬件架构图
下面这张图展示了 RK 平台 AF 的完整数据流和控制流。我建议你把它打印出来贴在工位上,调试时对照着看,思路会清晰很多。
从这张图可以清楚看到:数据从 Sensor 出来,经过 ISP 预处理,一路去图像管线,另一路去 AF 统计模块。AF 控制器读取统计数据后,计算出 lens 应该去的位置,然后通过 VCM 驱动 lens 移动。lens 的物理位置又会反馈给 Sensor,形成闭环。
调试建议:遇到 AF 不工作时,先按这个链路逐级排查:Sensor 输出是否正常?ISP 预处理是否 bypass 了?AF 统计模块是否有数据?AF 控制器是否使能?VCM 驱动电压是否到位?这样排查效率最高。