【高通SDM660平台】Camera 驱动 Bringup 实战:从 DTS 配置到 Vendor 模块集成
1. 高通SDM660平台Camera驱动Bringup概述当你拿到一块基于高通SDM660平台的新硬件时Camera驱动的Bringup工作可能会让你感到有些头疼。作为一个在这个领域摸爬滚打多年的工程师我想分享一些实战经验帮助你快速点亮Camera功能并完成基础调试。Camera驱动的Bringup主要分为三个关键步骤DTS配置、Vendor模块集成和功能验证。DTSDevice Tree Source是描述硬件配置的重要文件它定义了Camera相关的传感器、供电、时钟、GPIO和I2C等关键信息。Vendor模块则包含了Sensor库、Chromatix效果参数、马达与闪光灯驱动等专有实现。最后通过编译和初步调试来验证Camera功能是否正常工作。2. DTS配置详解2.1 DTS文件结构与作用在高通SDM660平台中Camera相关的DTS文件主要分布在kernel/msm-4.4/arch/arm64/boot/dts/qcom目录下。这里需要注意arm64目录实际上是arm目录的软链接所以无论你使用哪种架构修改的都是同一套文件。关键的DTS文件包括sdm660.dtsi基础平台配置引入其他Camera相关DTS文件sdm660-camera.dtsi平台Camera硬件配置sdm660-pinctrl.dtsiGPIO引脚控制配置sdm660-camera-sensor-mtp.dtsi具体传感器配置2.2 Sensor节点配置在sdm660-camera-sensor-mtp.dtsi文件中我们需要为每个Camera传感器配置独立的节点。以下是一个典型的后置摄像头配置示例cci { qcom,camera0 { cell-index 0; // 摄像头索引号必须唯一 compatible qcom,camera; reg 0x0; // 寄存器地址通常与索引号一致 qcom,csiphy-sd-index 0; // 使用的CSI PHY接口 qcom,csid-sd-index 0; // 使用的CSI接口 qcom,mount-angle 90; // 传感器安装角度 // 外设引用 qcom,led-flash-src led_flash0; // 闪光灯 qcom,actuator-src actuator0; // 马达 qcom,eeprom-src eeprom0; // EEPROM // 供电配置 cam_vio-supply pm660_l11; // I/O电压 cam_vana-supply cam_avdd_gpio_regulator; // 模拟电压 cam_vdig-supply cam_rear_dvdd_gpio_regulator; // 数字电压 cam_vaf-supply cam_vaf_gpio_regulator; // 自动对焦电压 // GPIO配置 gpios tlmm 32 0, // MCLK tlmm 46 0; // RESET qcom,gpio-reset 1; // 第二个GPIO是RESET引脚 // 其他参数 qcom,sensor-position 0; // 0后置1前置 qcom,sensor-mode 0; // 0后置2D1前置2D qcom,cci-master 0; // 使用的I2C主控制器 status ok; // 启用该设备 }; };2.3 供电配置详解Camera模块通常需要多种电压供电包括AVDD模拟电压为感光区和ADC供电DVDD数字电压为ISP供电VDDIOI/O电压为I2C接口供电VAF自动对焦马达供电供电可以通过PMIC电源管理IC或GPIO控制。以下是GPIO供电的配置示例soc { cam_avdd_gpio_regulator: cam_avdd_fixed_regulator { compatible regulator-fixed; regulator-name cam_avdd_gpio_regulator; regulator-min-microvolt 2800000; // 2.8V regulator-max-microvolt 2800000; enable-active-high; // 高电平使能 gpio tlmm 51 0; // 使用GPIO51控制 vin-supply pm660l_bob; // 输入电源 }; };2.4 闪光灯与马达配置闪光灯和马达是Camera的重要外设它们的配置也包含在DTS中// 闪光灯配置 soc { led_flash0: qcom,camera-flash0 { cell-index 0; compatible qcom,camera-flash; qcom,flash-source pm660l_flash0 pm660l_flash1; qcom,torch-source pm660l_torch0 pm660l_torch1; qcom,switch-source pm660l_switch0; status ok; }; }; // 马达配置 cci { actuator0: qcom,actuator0 { cell-index 0; reg 0x0; compatible qcom,actuator; qcom,cci-master 0; // 使用的I2C主控制器 cam_vaf-supply cam_vaf_gpio_regulator; // 马达供电 qcom,cam-vreg-name cam_vaf; qcom,cam-vreg-min-voltage 2800000; qcom,cam-vreg-max-voltage 3000000; qcom,cam-vreg-op-mode 100000; }; };3. Vendor模块集成3.1 Sensor库文件移植Sensor库文件通常由传感器厂商提供需要放置在vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/libs目录下。以IMX350传感器为例将库文件放入imx350目录确保Android.mk中定义了正确的模块名LOCAL_MODULE : libmmcamera_imx350在device-vendor.mk中添加模块MM_CAMERA libmmcamera_imx3503.2 Chromatix效果参数Chromatix包含了Camera的3AAE/AF/AWB和ISP效果参数这些参数对图像质量至关重要。Chromatix文件需要放在vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/chromatix目录下按照版本号如0310和传感器型号组织。每个Chromatix模块都会编译成独立的库例如libchromatix_imx350_sunny_preview.so预览模式参数libchromatix_imx350_sunny_video.so视频模式参数libchromatix_imx350_sunny_hfr_60.so60fps高速模式参数同样需要在device-vendor.mk中添加所有这些模块。3.3 XML配置文件修改Camera的配置主要通过XML文件实现最重要的两个文件是imx350_sunny.xml定义Chromatix模块与使用场景的映射关系sdm660_camera.xml定义Camera模块的硬件配置以sdm660_camera.xml为例关键配置包括CameraModuleConfig CameraId0/CameraId !-- 与DTS中的cell-index对应 -- SensorNameimx350/SensorName !-- 传感器型号 -- ActuatorNamedw9800/ActuatorName !-- 马达型号 -- EepromNamesony_imx350/EepromName !-- EEPROM型号 -- ChromatixNameimx350_chromatix/ChromatixName !-- Chromatix配置 -- PositionBACK/Position !-- 摄像头位置 -- MountAngle90/MountAngle !-- 安装角度 -- CSIInfo CSIDCore0/CSIDCore !-- CSI接口 -- LaneMask0x1F/LaneMask !-- 使用的数据通道 -- /CSIInfo /CameraModuleConfig3.4 马达与闪光灯驱动马达和闪光灯驱动也需要作为独立模块集成马达驱动通常位于vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/actuator/libs闪光灯驱动位于vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/flash/libs以DW9800马达为例需要在device-vendor.mk中添加MM_CAMERA libactuator_dw98004. 编译与调试4.1 编译检查清单完成所有配置后在编译前建议检查以下内容DTS配置所有传感器的cell-index是否唯一供电配置是否正确电压值、GPIO引脚I2C主控制器分配是否冲突GPIO引脚定义是否正确Vendor配置所有必需的库文件是否已添加XML文件中的传感器名称与实际是否一致Chromatix版本号是否正确0310 for SDM6604.2 常见问题排查在实际调试中你可能会遇到以下问题Camera无法打开检查DTS中的status是否为ok确认供电是否正常测量各电压点检查I2C通信是否正常使用i2c-tools调试图像异常确认Chromatix参数是否正确加载检查MIPI时钟和数据线配置验证传感器初始化序列是否正确自动对焦失效确认马达驱动是否正确加载检查VAF供电是否正常验证I2C通信是否正常4.3 调试技巧使用以下命令查看Camera模块加载情况adb shell cat /proc/kmsg | grep -i camera检查I2C通信adb shell i2cdetect -y 0 # 探测I2C总线0上的设备获取Camera HAL日志adb logcat -s mm-camera在实际项目中我遇到过因为GPIO配置错误导致Camera无法启动的情况。通过仔细检查DTS中的GPIO编号和pinctrl配置最终发现问题是一个GPIO被其他模块占用。这种问题通常会在内核日志中留下线索所以养成查看内核日志的习惯非常重要。