第一次接触MTK平台的PDAF驱动移植时,我被各种专业术语搞得一头雾水。后来才发现,理解PDAF(相位检测自动对焦)的核心原理,就像理解人眼如何聚焦一样简单。当你看近处物体时,眼球肌肉会自动调节晶状体曲率——PDAF的工作原理也类似,只不过用像素传感器代替了视网膜。
MTK平台支持的PDAF实现方式主要分三种:基于原始RAW数据的处理、通过CAMSV协处理器处理,以及双像素DualPD技术。我在MT6765芯片上实测发现,DualPD方案的对焦速度比传统方案快40%,特别是在暗光环境下。这就像从单眼视物升级到双眼立体视觉,通过比较左右像素的相位差,能更精准计算出镜头需要移动的距离。
在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/拿到OV13855的规格书后,要特别注意这几个参数:
有次我漏看了输出格式配置,导致图像出现条纹噪点。后来在kd_imgsensor_define.h里补充了这行才解决:
c复制#define OV13855_PDAF_TYPE PDAF_SUPPORT_RAW_DUALPD
在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, // 是否启用像素合并
};
PD calibration data的烧录是个精细活。有次我把增益值填反了,导致近距离对焦完全失效。正确的流程应该是:
关键参数映射关系如下表:
| INI文件参数 | 驱动中对应字段 | 典型值 |
|---|---|---|
| PD_Pitch | pd_pitch | 1.0um |
| PD_Distance | pd_distance | 2.4mm |
| PD_Gain | pd_gain | 0x80 |
上周刚解决一个典型问题:对焦时镜头会来回抖动。通过逻辑分析仪抓取I2C信号发现,问题出在PD数据的采样时机不对。修改sensor_setting.h中的这两个寄存器值后问题消失:
c复制{0x380e, 0x01}, // PD数据起始行
{0x380f, 0xFF}, // PD数据结束行
常见问题排查清单:
记得有次调试时,对焦在强光下总是不准。后来发现是PD像素的曝光补偿没做好,在set_pdaf_mode()函数里加了这行才解决:
c复制write_cmos_sensor(0x3e08, 0x20); // PD像素曝光补偿
测试阶段我习惯用这套组合拳:
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
最终效果评估要关注三个指标:
在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标记能快速回退到稳定版本。当看到镜头能干净利落地完成对焦时,那种成就感比喝十杯咖啡都提神。