RK3588安卓12平台Camera对焦调试:手把手搞定DW9763 VCM马达驱动移植与DTS配置
RK3588安卓12平台Camera对焦调试DW9763 VCM马达驱动移植与DTS配置实战指南在嵌入式Android平台的Camera开发中VCMVoice Coil Motor马达驱动的移植与调试是一个关键环节。作为自动对焦功能的核心执行部件VCM马达的性能直接影响着Camera模组的对焦速度和精度。本文将基于Rockchip RK3588平台内核5.10和Android 12系统深入讲解DW9763这款常见VCM马达的驱动移植过程从硬件原理到DTS配置从驱动实现到上层适配提供一套完整的实战解决方案。1. VCM马达基础与DW9763特性VCM马达本质上是一种基于电磁感应原理的直线电机其工作原理类似于扬声器的音圈。当电流通过线圈时在永磁场中产生洛伦兹力带动镜头组件直线移动。DW9763作为一款典型的数字控制VCM驱动器具有以下核心特性控制模式支持Direct Mode和SACSmooth Auto-focus Control模式分辨率10位DAC输出提供1024级位置控制电流范围最大驱动电流120mA启动电流可配置通信接口标准I2C协议地址0x0C关键寄存器功能寄存器地址名称功能描述0x02SAC模式控制设置SAC模式等级1-40x03位置控制10位DAC值控制马达位置0x04周期控制设置SAC模式下的移动时间0x05状态寄存器包含忙状态位在实际应用中SAC模式因其平滑的运动特性而被广泛采用。DW9763支持多种SAC等级SAC1最平缓的运动曲线适合精细对焦SAC2平衡速度与平稳性SAC3/SAC4更快的响应速度适合快速对焦场景2. 驱动移植关键步骤2.1 硬件抽象层设计在Linux内核中VCM驱动通常实现为V4L2子设备。对于DW9763我们需要重点关注以下几个核心结构static const struct v4l2_subdev_ops dw9763_subdev_ops { .core dw9763_core_ops, }; static const struct v4l2_subdev_core_ops dw9763_core_ops { .ioctl dw9763_ioctl, }; static const struct v4l2_ctrl_ops dw9763_ctrl_ops { .g_volatile_ctrl dw9763_get_ctrl, .s_ctrl dw9763_set_ctrl, };关键实现点位置映射算法将逻辑位置0-1023转换为实际DAC值static int dw9763_position_to_dac(struct dw9763_device *dev_vcm, u32 pos) { u32 dac; /* 线性映射pos0对应最大电流pos1023对应最小电流 */ dac dev_vcm-start_ma * DW9763_DAC_PER_MA; dac (DW9763_MAX_DAC - dac) * pos / DW9763_MAX_POS; return clamp_val(dac, 0, DW9763_MAX_DAC); }运动控制状态机确保马达运动完成后再接受新指令static int dw9763_wait_idle(struct i2c_client *client) { int ret; u8 status; int timeout 100; /* 最大等待10ms */ do { ret i2c_smbus_read_byte_data(client, DW9763_REG_STATUS); if (ret 0) return ret; if (!(ret DW9763_STATUS_BUSY)) return 0; udelay(100); } while (--timeout); return -ETIMEDOUT; }2.2 DTS节点配置详解RK3588平台对VCM驱动提供了丰富的DTS属性支持以下是DW9763的典型配置dw9763: dw97630c { compatible dongwoon,dw9763; reg 0x0c; rockchip,vcm-max-current 120; /* 单位mA */ rockchip,vcm-start-current 20; /* 启动电流 */ rockchip,vcm-rated-current 90; /* 额定工作电流 */ rockchip,vcm-step-mode 3; /* SAC3模式 */ rockchip,vcm-t-src 0x20; /* 运动时间参数 */ rockchip,vcm-t-div 1; /* 时钟分频 */ rockchip,camera-module-index 0; /* 对应摄像头模组索引 */ };关键参数说明vcm-step-modeSAC模式选择值1-4对应SAC1-SAC4vcm-t-src控制马达运动时间值越大运动越慢vcm-t-div时钟分频系数影响运动曲线平滑度注意启动电流不宜设置过大否则可能导致马达启动过冲。建议根据模组规格书中的推荐值设置。2.3 与Sensor的绑定配置VCM需要与对应的Camera Sensor绑定才能正常工作绑定方式如下ov13855: ov1385536 { compatible ovti,ov13855; reg 0x36; ... lens-focus dw9763; /* 关键绑定语句 */ ... };绑定后Camera HAL层可以通过media controller框架查询到VCM与Sensor的关联关系。3. Android上层适配3.1 HAL层配置在Android的Camera HAL中需要正确配置AFAuto Focus支持模式。修改camera3_profiles.xmlSettings SupportedHardwareLevel levelFULL/level /SupportedHardwareLevel Control afAvailableModes valueOFF/value valueAUTO/value valueMACRO/value valueCONTINUOUS_VIDEO/value valueCONTINUOUS_PICTURE/value /afAvailableModes /Control /Settings3.2 效果文件配置在ISP效果配置JSON文件中需要启用AF相关参数{ af: { enable: true, scan_range: [0, 1023], step_size: 10, settle_time_ms: 50 } }4. 调试技巧与问题排查4.1 常用调试命令手动控制马达位置# 将马达移动到中间位置 v4l2-ctl -d /dev/v4l-subdev3 --set-ctrl focus_absolute512查询当前状态v4l2-ctl -d /dev/v4l-subdev3 --get-ctrl focus_absoluteI2C寄存器调试# 读取状态寄存器(0x05) i2cget -y 3 0x0c 0x054.2 常见问题解决方案问题1马达无反应检查I2C通信是否正常确认电源供电通常需要2.8V-3.3V验证DTS中的reg地址是否正确问题2对焦不准确调整vcm-t-src参数优化运动曲线检查start-current和rated-current是否匹配模组规格确认镜头移动范围与逻辑位置映射关系问题3马达运动有噪声尝试降低SAC模式等级如从SAC3改为SAC2增加vcm-t-div值平滑运动曲线检查机械结构是否有干涉在实际项目中DW9763的移植往往需要结合具体摄像头模组进行参数微调。建议在初期调试时先用示波器观察VCM驱动波形确保电流变化符合预期。同时不同批次的马达可能存在个体差异量产时需要做好参数容差设计。