高通Camera驱动实战:从dtsi节点到内核代码的配置与调试

张开发
2026/4/20 4:03:11 15 分钟阅读

分享文章

高通Camera驱动实战:从dtsi节点到内核代码的配置与调试
1. 高通Camera驱动开发入门指南第一次接触高通Camera驱动开发的朋友可能会觉得有点懵毕竟这涉及到硬件原理图、设备树配置、内核代码调试等多个环节。我自己刚开始做这块的时候也是踩了不少坑。今天我就用最直白的语言带大家走一遍完整的开发流程。简单来说高通Camera驱动开发的核心任务就是让SoC能够正确识别和控制Camera模组。这就像给两个人做介绍你得先让他们认识设备树配置然后建立沟通渠道I2C/CSI接口最后才能正常交流图像采集。整个过程主要涉及三个关键部分硬件连接确认搞清楚Camera模组是怎么连到主控上的dtsi节点配置告诉内核硬件是怎么连接的内核驱动调试确保驱动能正确初始化和控制模组我建议新手准备一个checklist把下面这些关键信息都列出来Camera模组的供电需求几路电压分别是多少伏I2C从机地址一般是7位地址比如0x20使用的CSI PHY通道0/1/2复位和时钟GPIO引脚号模组支持的时钟频率常见24MHz2. 硬件原理图关键点解析拿到硬件原理图后别急着写代码先把这几个关键连接关系捋清楚。我见过不少开发者因为没仔细看原理图导致后面调试浪费大量时间。2.1 CSI接口配置CSICamera Serial Interface是Camera模组传输图像数据的高速接口。在高通平台上通常会有多个CSI PHY通道。你需要确认使用的是CSI0、CSI1还是CSI2数据通道是几lane的1/2/4 lane有没有使用CPHY模式举个例子如果原理图上显示摄像头连接到了CSI0的4lane接口那在dtsi里就要配置csiphy-sd-index 0; csi-lane-assign 0x4320; // 4lane配置 csi-lane-mask 0x1F; // 使用全部lane2.2 I2C主控选择Camera模组的寄存器配置是通过I2C总线完成的。高通平台通常有多个I2C Master需要确认使用的是CCI0还是CCI1I2C时钟频率是多少通常400kHz从机地址是多少比如0x20这个配置不对会导致probe失败我在调试时就遇到过因为cci-master配错导致I2C通信完全没反应的情况。2.3 GPIO引脚确认GPIO主要涉及复位引脚RESET电源使能引脚PWDN时钟使能MCLK特别注意GPIO的电平极性有些模组是低电平复位有些是高电平。比如gpio-reset 1; // 使用gpios数组中的第二个GPIO gpio-req-tbl-flags 0 0; // 第一个是时钟第二个是复位 gpio-req-tbl-label CAMIF_MCLK0, CAM_RESET0;3. dtsi节点详细配置解析dtsi配置是高通Camera驱动开发的核心环节相当于给内核提供一份硬件连接说明书。下面我结合实例详细说明每个关键字段。3.1 基础标识配置qcom,cam-sensor0 { cell-index 0; // 摄像头索引号从0开始 compatible qcom,cam-sensor; // 驱动匹配关键字 reg 0x20; // I2C从机地址 };cell-index非常重要它必须与camera_config.xml中的配置一致否则驱动不会被正确加载。我曾经因为把这个值写错调试了一整天。3.2 电源管理配置Camera模组通常需要多路电源cam_vio-supply pm8150_1_s4; // I/O电压 cam_vana-supply pm8150_1_s5; // 模拟电压 cam_vdig-supply pm8150_1_s6; // 数字电压 regulator-names cam_vio, cam_vana, cam_vdig;电源配置不当会导致模组无法正常工作或图像异常。建议用万用表实测各电压是否正常。3.3 时钟配置时钟配置影响图像采集的稳定性clocks clock_camcc CAM_CC_MCLK0_CLK; clock-names cam_clk; clock-rates 24000000; // 24MHz如果时钟不稳定可能会出现图像条纹或帧率不稳的问题。4. 内核驱动代码关键点dtsi配置好后接下来要看内核驱动代码。这里我重点讲几个关键函数。4.1 probe函数流程probe函数是驱动初始化的入口static int cam_sensor_probe(struct platform_device *pdev) { // 1. 解析dtsi配置 rc cam_sensor_parse_dt(pdev); // 2. 初始化电源管理 rc cam_sensor_init_power_settings(s_ctrl); // 3. 配置I2C通信 rc cam_sensor_init_subdev(s_ctrl); // 4. 注册v4l2子设备 rc cam_register_subdev(s_ctrl); }4.2 电源管理实现电源管理要确保正确的上电时序static int cam_sensor_power_up(struct cam_sensor_ctrl_t *s_ctrl) { // 1. 先开数字电源 rc cam_sensor_core_power_up(sensor_power, soc_info); // 2. 再开模拟电源 rc cam_sensor_util_power_up(power_info, soc_info); // 3. 最后给时钟 rc msm_camera_clk_enable(soc_info, clk_info, clk_ptr, 1); }4.3 I2C通信调试I2C通信问题是最常见的static int32_t cam_sensor_i2c_read(struct cam_sensor_ctrl_t *s_ctrl, uint32_t addr, uint32_t *data, enum camera_sensor_i2c_type addr_type) { struct i2c_msg msgs[2]; // 配置I2C消息 msgs[0].addr s_ctrl-io_master_info.client-addr; msgs[0].flags 0; msgs[0].len addr_type; msgs[0].buf (uint8_t *)addr; // 发送读取请求 rc cam_qup_i2c_txfr(s_ctrl-io_master_info.client, msgs[0], 1); }5. 常见问题排查指南在实际项目中我遇到过各种奇怪的问题这里分享几个典型案例。5.1 Camera无法被识别可能原因dtsi中cell-index与camera_config.xml不匹配I2C地址配置错误电源未正常开启排查步骤用i2cdetect工具检查I2C总线是否能看到设备测量各电源电压是否正常检查内核日志是否有probe失败信息5.2 图像出现条纹或噪点可能原因时钟不稳定电源噪声过大CSI信号完整性差解决方法降低时钟频率试试检查电源滤波电容调整CSI驱动强度5.3 帧率不稳定可能原因内存带宽不足中断处理延迟传感器配置不当优化建议检查CMA内存配置优化ISP处理流水线调整传感器输出尺寸和格式6. 调试工具与技巧工欲善其事必先利其器。分享几个我常用的调试方法。6.1 内核日志分析使用dmesg查看内核日志时重点关注probe是否成功电源管理日志I2C通信日志CSI PHY初始化状态可以增加内核打印级别echo 8 /proc/sys/kernel/printk6.2 I2C工具使用i2c-tools是必备工具i2cdetect -y 4 # 扫描I2C总线上的设备 i2cget -y 4 0x20 0x00 # 读取寄存器 i2cset -y 4 0x20 0x01 0x00 # 写寄存器6.3 信号测量硬件调试时需要测量MIPI信号眼图时钟抖动电源纹波推荐使用示波器配合MIPI解码器进行信号分析。7. 实战经验分享最后分享几个我在实际项目中总结的经验上电时序很重要不同模组要求可能不同一定要仔细看规格书I2C通信失败时先确认上拉电阻是否合适通常4.7kΩ调试CSI信号时可以用pattern模式先验证硬件连接遇到图像异常时先尝试降低分辨率看是否改善电源噪声会影响图像质量建议用示波器检查各电源轨记得保存各种调试记录形成自己的知识库。Camera驱动调试是个经验活遇到的问题越多解决的效率就会越高。

更多文章