Camera 基础

Android Camera | 高通Camx AF对焦调试全攻略

平台:高通 Camx | 覆盖:PDAF/CDAF/HAF 三种对焦方案 | 含状态机+日志字段+4个常见case

AF(自动对焦)是 Camera 调优中最复杂的模块之一。用户对"对不上焦"、"对焦慢"、"跑焦"的容忍度极低——一张模糊的照片基本等于废片。

这篇文章基于高通 Camx 框架,梳理 AF 对焦的完整流程和调试方法。重点是实战日志分析和异常 case 排查,不只是讲原理。

一、AF 对焦基本原理

1.1 三种核心对焦方案

方案
原理
速度
适用
PDAF
相位检测
快
需要 sensor 支持 PDAF 像素
CDAF
反差检测
慢
所有 sensor 都支持
HAF
混合对焦
快+准
主流方案(高通)

PDAF(Phase Detection Auto Focus)

通过 sensor 上特殊的像素(遮光像素)获取左右眼图像的相位差,直接计算出对焦距离。优点是速度快,缺点是需要 sensor 支持。

CDAF(Contrast Detection Auto Focus)

通过评估图像的清晰度(对比度)来判断是否对焦准确。优点是不需要特殊像素,缺点是速度慢——需要反复移动对焦马达寻找最清晰的点。

HAF(Hybrid Auto Focus)

结合 PDAF 和 CDAF,先用 PDAF 快速接近对焦位置,再用 CDAF 微调。这是目前主流手机采用的方案。

1.2 AF 关键概念

• Focus Position:对焦马达位置,通过 VCM(音圈马达)控制

• Confidence:PDAF 计算的置信度,越高越可信

• Progress:对焦进度,100 表示对焦完成

• Range Near/Far:对焦搜索范围

二、Camx AF 对焦流程

2.1 整体流程

App 发送对焦请求
  ↓
Camera2 Framework
  ├── 设置 AF trigger
  ├── 设置 AF region(对焦区域)
  └── 设置 AF mode(AUTO/MACRO/CONTINUOUS)
  ↓
Camx HAL
  ├── STATS 节点:接收 sensor 统计数据
  ├── AF 算法节点(af_haf.cpp):计算对焦位置
  │     ├── PDAF 计算 → 得到相位差 → 计算 defocus 距离
  │     └── CDAF 计算 → 评估对比度 → 微调位置
  ├── AEC 节点:AE 收敛后再触发 AF
  └── Actuator 节点:控制 VCM 马达移动
  ↓
Driver
  └── 写 VCM 寄存器 → 马达移动到目标位置

2.2 AF 状态机

INACTIVE → ACTIVE_SCAN → FOCUSED_LOCKED
                       ↘ NOT_FOCUSED_LOCKED

• INACTIVE:AF 未激活

• ACTIVE_SCAN:正在搜索对焦位置

• FOCUSED_LOCKED:对焦成功并锁定

• NOT_FOCUSED_LOCKED:对焦失败并锁定

调试技巧:
看到 NOT_FOCUSED_LOCKED 频繁出现,说明对焦逻辑有 bug。如果一直停在 ACTIVE_SCAN,说明搜索过程卡住了。 

三、AF 调试日志分析(重点)

3.1 开启 AF Debug 日志

修改文件:camxoverridesettings.txt

logVerboseMask=0x08000000

推送方式

adb push camxoverridesettings.txt vendor/etc/camera/
adb shell reboot
说明:0x08000000
 是 STATS_AF 模块的 verbose 日志 mask。开启后会输出 AF 算法的详细过程日志。 

3.2 典型对焦过程日志

搜索命令

logcat | grep "STATS_AF"

典型日志输出

CamX: [VERB][STATS_AF] af_haf.cpp:2036: af_haf_focus_converge HAF_CONVERGE_STATUS: 2
CamX: [VERB][STATS_AF] af_haf.cpp:2043: af_haf_focus_converge Output:
    progress = 100,
    next_pos = 311,
    range_near = 0,
    range_far = 399,
    confidence = 100
CamX: [VERB][STATS_AF] af_haf.cpp:2049: af_haf_focus_converge AF_HAF_SEARCH_DONE:

日志字段解读

字段
含义
正常值
HAF_CONVERGE_STATUS
对焦收敛状态
2=收敛成功
progress
对焦进度
100=完成
next_pos
VCM 下一步目标位置
马达行程范围内的值
range_near
搜索范围下限
0
range_far
搜索范围上限
399(取决于 VCM 型号)
confidence
PDAF 置信度
越高越好,100 为最高
AF_HAF_SEARCH_DONE
搜索完成标志
出现表示一轮对焦结束

四、4 个常见对焦问题排查

问题1:对焦不收敛

现象:HAF_CONVERGE_STATUS 持续为 0 或 1(搜索中),progress 一直不到 100。

排查方向

• 检查 PDAF 标定数据是否正确

• 检查 VCM 驱动 IC 配置是否正确

• 检查 AF 搜索范围是否合理

问题2:Confidence 偏低

现象:confidence 持续偏低(< 50)。

排查方向

• PDAF 像素标定有问题

• sensor 的 PDAF 像素被遮挡

• 环境光线太暗

问题3:next_pos 异常

现象:next_pos 在 0 或 399(极限位置)徘徊。

排查方向

• VCM 行程配置不对

• AF 搜索范围设置太窄

问题4:对焦速度慢

现象:从触发对焦到 FOCUSED_LOCKED 耗时过长(> 1s)。

排查方向

• AE 是否先收敛(AF 依赖 AE 收敛)

• PDAF 标定数据精度

• VCM 响应速度(驱动电流是否足够)

五、实用调试技巧

5.1 确认 VCM 是否正常工作

方法1:dump VCM 寄存器

adb shell "echo 0x0A00 > /sys/kernel/debug/camera/sensor/vcm_reg && cat /sys/kernel/debug/camera/sensor/vcm_reg"

方法2:日志确认

logcat | grep -i "actuator|vcm|dac"

5.2 确认 PDAF 数据是否正常

logcat | grep -i "pdaf|phase"

正常情况下应该能看到 PDAF 数据统计日志。如果没有,说明 PDAF 配置有问题。

速查表

问题
关键日志
排查方向
对焦不收敛
HAF_CONVERGE_STATUS=0/1
PDAF 标定、VCM 驱动
Confidence 偏低
confidence<50
PDAF 标定、光线
next_pos 异常
next_pos=0/399
VCM 行程、搜索范围
对焦慢
耗时>1s
AE 收敛、PDAF 精度

AF 调试的关键是看懂日志。每条日志字段背后都对应着一个具体的算法步骤,结合现象对照排查,效率会高很多。

如果你在 AF 调试中遇到具体问题,欢迎在评论区留言交流。


关注公众号「小驰行动派」

Caemra一站式学习平台:www.camerahub.cn

更多Camera开发实战内容

欢迎加入知识星球「小驰成长圈」

120+ Camera工程师 · 340+ 实战内容 · 已运营1565天

小驰成长圈 知识星球

微信扫码 · 加入星球

读到这里,说明你是真做 Camera 的 加个关注、进个圈子,后面调试卡壳时,有个能直接问的人。
小驰行动派公众号 公众号 · 小驰行动派 每周 HAL / Camx / Sensor 干货
小驰行动派知识星球 知识星球 · 小驰行动派 资料包 + 随时答疑
系统学 Camera 开发 →
分享到: 复制链接
← 上一篇 Android Camera稳定性排查实战指南(Qcom Camx)

相关文章

推荐课程

想系统学习 Camera 开发?看看这些课程

评论 (0)

暂无评论,快来抢沙发吧