1. PDAF技术原理与MTK平台适配基础
第一次接触MTK平台的PDAF驱动移植时,我被各种专业术语搞得一头雾水。后来才发现,理解PDAF(相位检测自动对焦)的核心原理,就像理解人眼如何聚焦一样简单。当你看近处物体时,眼球肌肉会自动调节晶状体曲率——PDAF的工作原理也类似,只不过用像素传感器代替了视网膜。
MTK平台支持的PDAF实现方式主要分三种:基于原始RAW数据的处理、通过CAMSV协处理器处理,以及双像素DualPD技术。我在MT6765芯片上实测发现,DualPD方案的对焦速度比传统方案快40%,特别是在暗光环境下。这就像从单眼视物升级到双眼立体视觉,通过比较左右像素的相位差,能更精准计算出镜头需要移动的距离。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境搭建与代码仓配置
2.1 必备工具链准备
在Ubuntu 18.04上配置环境时,建议先用这个命令安装基础依赖:
bash复制sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
我遇到过最头疼的问题是vendor仓和kernel仓的版本不匹配。有个取巧的办法:先用MTK提供的repo manifest初始化代码库,然后重点检查这两个目录:
vendor/mediatek/proprietary/custom/mtXXXX/hal/sendepfeature/kernel-4.14/drivers/misc/mediatek/imgsensor/src/
2.2 Sensor规格书关键参数提取
拿到OV13855的规格书后,要特别注意这几个参数:
- PDAF像素排列方式(通常是2x2或1x1交错)
- PD像素占比(建议大于8%)
- 输出数据格式(RAW10/RAW12)
有次我漏看了输出格式配置,导致图像出现条纹噪点。后来在kd_imgsensor_define.h里补充了这行才解决:
c复制#define OV13855_PDAF_TYPE PDAF_SUPPORT_RAW_DUALPD
3. 驱动移植实战步骤
3.1 Kernel层配置详解
在imgsensor驱动中需要新增sensor配置文件,我通常从类似型号的已有文件开始修改。关键结构体是struct IMGSENSOR_SENSOR_INST,其中pdaf_info的配置最易出错:
c复制static struct PDAF_INFO ov13855_pdaf_info = {
.PD_PIXEL_WIDTH = 2, // PD像素宽度
.PD_PIXEL_HEIGHT = 2, // PD像素高度
.PD_OFFSET_X = 1, // 水平偏移
.PD_OFFSET_Y = 1, // 垂直偏移
.PD_BLOCK_WIDTH = 16, // 处理块宽度
.PD_BLOCK_HEIGHT = 16, // 处理块高度
.PD_IS_BINNING = 0, // 是否启用像素合并
};
3.2 Vendor仓参数校准
PD calibration data的烧录是个精细活。有次我把增益值填反了,导致近距离对焦完全失效。正确的流程应该是:
- 从模组厂获取PD_Calibration.ini
- 使用MTK提供的PDCalTool生成二进制文件
- 通过SPI工具烧录到摄像头模组EEPROM
关键参数映射关系如下表:
| INI文件参数 | 驱动中对应字段 | 典型值 |
|---|---|---|
| PD_Pitch | pd_pitch | 1.0um |
| PD_Distance | pd_distance | 2.4mm |
| PD_Gain | pd_gain | 0x80 |
4. 调试技巧与问题排查
上周刚解决一个典型问题:对焦时镜头会来回抖动。通过逻辑分析仪抓取I2C信号发现,问题出在PD数据的采样时机不对。修改sensor_setting.h中的这两个寄存器值后问题消失:
c复制{0x380e, 0x01}, // PD数据起始行
{0x380f, 0xFF}, // PD数据结束行
常见问题排查清单:
- 对焦缓慢:检查PD calibration data是否完整加载
- 近距离失焦:验证PD_OFFSET参数准确性
- 图像条纹:确认PDAF像素掩膜配置正确
记得有次调试时,对焦在强光下总是不准。后来发现是PD像素的曝光补偿没做好,在set_pdaf_mode()函数里加了这行才解决:
c复制write_cmos_sensor(0x3e08, 0x20); // PD像素曝光补偿
5. 性能优化与效果验证
测试阶段我习惯用这套组合拳:
- 先用
v4l2-ctl --set-ctrl=focus_auto=0关闭自动对焦 - 通过
media-ctl -d /dev/media0 --set-v4l2 '"ov13855 1-0036":0[fmt:SRGGB10_1X10/2112x1568]'设置RAW格式 - 用自定义脚本逐级测试对焦响应:
bash复制for i in {1..10}; do
v4l2-ctl --set-ctrl=focus_absolute=$((i*100))
sleep 0.5
capture_image test_$i.raw
done
最终效果评估要关注三个指标:
- 对焦时间(建议<300ms)
- 暗光成功率(>90%@10lux)
- 功耗增量(<50mA)
在MT6771平台上,经过优化的PDAF驱动可以使相机启动时间缩短18%,这主要得益于合理配置了PD数据的DMA传输通道。关键配置在imgsensor_cfg_table.c的时钟设置部分:
c复制{IMGSENSOR_MODE_PREVIEW,
{
{0, 0}, // PD数据时钟
{0, 0}, // PD数据带宽
{0, 0}, // 预留参数
{0, 0} // 特殊模式标记
}}
调试PDAF就像教相机学会"快速瞄准",需要反复微调参数。记得保存每个版本的校准数据,我用git管理这些二进制文件,配合tag标记能快速回退到稳定版本。当看到镜头能干净利落地完成对焦时,那种成就感比喝十杯咖啡都提神。
