camera sensor i2c数据传输时序及其分析

本文深入解析镁光相机传感器使用I2C总线进行数据交互的机制,包括写模式和读模式的具体步骤及源码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 以上时序摘自镁光的一款camera sensor.

1写模式:

 

首先开始信号,主机发送从机地址(0-7位)/写(第8位),等待从机发送ACK信号,应答之后发送word16位的消息为sensor寄存器地址,分八位传输中间有ACK信号。同理接着发送16位value对应刚才寄存器地址。(见下面源码)

 

static int mt9t013_i2c_write_w(unsigned short saddr,
       unsigned short waddr, unsigned short wdata)
{
 int rc = -EIO;
 unsigned char buf[4];

 memset(buf, 0, sizeof(buf));
 buf[0] = (waddr & 0xFF00) >> 8;
 buf[1] = (waddr & 0x00FF);
 buf[2] = (wdata & 0xFF00) >> 8;
 buf[3] = (wdata & 0x00FF);

 rc = mt9t013_i2c_txdata(saddr, buf, 4);

 if (rc < 0)
  pr_err("i2c_write_w failed, addr = 0x%x, val = 0x%x!\n",
         waddr, wdata);

 return rc;
}

 

2读模式:

 

和写模式一样 先addr后data.见上图。

<think>我们正在讨论高通平台上相机传感器(Camera Sensor)的启动流程(bring-up procedure)。这是一个涉及硬件和软件多个层面的复杂过程。以下将分步骤详细说明,并尽量保证信息的准确性和实用性。 ### 1. **硬件准备与检查** - **硬件连接**:确认Sensor与MIPI CSI接口连接正确,包括电源、I2C控制总线、MIPI数据线、时钟、复位信号等[^1]。 - **电气特性**:使用万用表等工具检查供电电压(如AVDD、DVDD、IOVDD)是否在规格范围内,并确保电源的纹波符合要求。 - **时钟信号**:确认Sensor的主时钟(MCLK)是否由PMIC或平台时钟源提供,且频率正确(通常为24MHz)。 ### 2. **软件环境配置** - **内核版本**:确保使用高通支持的内核版本(如Linux Kernel 4.9/4.14/4.19等),并已包含Camera驱动框架及Sensor驱动。 - **设备树(DT)配置**:在设备树中正确声明Sensor节点,包括: - I2C地址、寄存器位宽(如8位或16位)。 - MIPI CSI通道数、数据速率(data rate)。 - 复位(reset)和电源使能(power enable)GPIO引脚。 - 时钟配置(如MCLK频率)。 - 示例片段: ```dts &i2c_freq_100Khz { status = "ok"; camera_sensor: camera-sensor@1a { compatible = "vendor,sensor-model"; reg = <0x1a>; vdd-supply = <&camera_vdd_2v8>; vddio-supply = <&camera_vddio_1v8>; reset-gpios = <&tlmm 78 GPIO_ACTIVE_LOW>; clocks = <&camcc CAM_CC_MCLK0>; clock-names = "mclk"; port { sensor_out: endpoint { remote-endpoint = <&csiphy0_ep>; data-lanes = <1 2 3 4>; }; }; }; }; ``` ### 3. **驱动代码集成** - **添加Sensor驱动**:若Sensor不在默认驱动列表中,需自行添加或移植驱动。通常位于`drivers/media/platform/qcom/camera/sensor/`。 - 关键操作: - 实现`struct camera_sensor_ctrl_t`中的函数(如`power_up`、`power_down`、`apply_settings`)。 - 配置寄存器初始化序列(通过I2C写入),通常由厂商提供(如`.cfg`或`.h`文件)。 - 在`msm_camera_dt_util.c`中注册设备树节点解析逻辑。 ### 4. **寄存器初始化序列(Register Settings)** - 从Sensor厂商获取初始化和输出格式配置(如分辨率、帧率、MIPI Lane数量等)。这些配置通常以数组形式提供: ```c static struct camera_sensor_reg_array init_regs[] = { {0x0100, 0x00, 0x00}, // 软复位 {0x0103, 0x01, 0x00}, // 启动初始化 // ... 更多寄存器配置 }; ``` - 验证序列的正确性:可通过逻辑分析仪或I2C Sniffer抓取实际通信数据。 ### 5. **CSIPHY/CSID配置** - 确保MIPI CSI物理层(CSIPHY)和CSI解码器(CSID)已正确配置: - 数据速率(Data Rate)、通道数(Lane Count)需与Sensor输出一致。 - 在设备树中检查CSIPHY和CSID节点的兼容性及状态。 ### 6. **Camera HAL层适配** - 在HAL(硬件抽象层)中配置Sensor参数: - 修改`vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/mct/pipeline`中的XML文件(如`sensor_lib.xml`)。 - 添加或更新对应Sensor的Chromatix(图像调优参数)路径。 - 测试HAL能否正确加载并解析Sensor信息。 ### 7. **验证与调试** - **日志分析**:通过`dmesg`查看内核日志,关注`msm_camera`相关错误。 - **I2C通信检查**:使用`i2cdetect`确认I2C地址可访问,`i2cdump`读取寄存器值。 - **图像输出测试**:使用`camxhal3test`或`QCameraDemo`等工具预览图像。 - **常见问题**: - 无图像输出:检查MIPI信号是否锁定(CSIPHY状态寄存器)。 - 花屏/错位:检查MIPI Lane映射、数据速率或初始化序列。 ### 8. **性能调优** - 根据实际需求调整帧率、曝光时间、增益等参数。 - 优化功耗:关闭未使用的Lane或降低时钟频率。 ### 引用说明 [^1]: 高通文档《Camera Bring-up Guide for Linux/Android》提供了详细的硬件接口定义和软件配置步骤。 §§相关问题§§ 1. 如何调试高通平台上Camera SensorI2C通信失败? 2. Camera Sensor的MIPI信号锁定失败(No Lock)可能有哪些原因? 3. 在高通平台中,如何调整Camera Sensor的帧率和分辨率? 4. Camera HAL层的作用是什么?如何修改HAL参数?</think>### 高通平台Camera Sensor启动流程 在高通平台(如Snapdragon)上点亮Camera Sensor的完整流程涉及硬件、驱动、内核及HAL层适配,以下是关键步骤: #### 1. **硬件准备与验证** - **电气连接检查** 确认MIPI CSI数据线、I2C控制总线、时钟(MCLK)、复位(RESET)和电源(AVDD/DVDD/IOVDD)连接正确。使用示波器验证: - MCLK频率(通常24MHz)是否稳定 - I2C信号波形是否正常 - 电源纹波是否符合Sensor规格(一般<50mV) - **Sensor规格书核对** 获取Sensor数据手册,确认: - 寄存器位宽(8/16位) - I2C地址(通常0x20或0x30) - 启动时序(Power-On Reset时序) #### 2. **设备树(DT)配置** 在`kernel/msm-xxx/arch/arm64/boot/dts/qcom/`中添加设备树节点: ```dts &i2c_freq_400Khz { // I2C配置 status = "ok"; camera_sensor: camera-sensor@1a { compatible = "vendor,sensor-model"; // 如"ovti,ov13855" reg = <0x1a>; // I2C地址 vdd-supply = <&camera_vdd_2v8>; // 电源域 vio-supply = <&camera_vio_1v8>; reset-gpio = <&tlmm 78 GPIO_ACTIVE_LOW>; // RESET引脚 clocks = <&camcc CAM_CC_MCLK0>; // MCLK源 clock-names = "mclk"; port { sensor_out: endpoint { data-lanes = <0 1 2 3>; // MIPI通道数 link-frequencies = /bits/ 64 <800000000>; // MIPI速率 }; }; }; }; ``` > 关键点:`data-lanes`必须与硬件布线一致,`link-frequencies`需匹配Sensor输出能力[^1]。 #### 3. **内核驱动开发** - **驱动文件位置** `kernel/msm-xxx/drivers/media/platform/qcom/camera/sensor/` - **核心结构体** ```c static struct camera_sensor_ctrl_t sensor_ctrl = { .sensor_name = "sensor_model", .i2c_conf = { .i2c_freq_mode = I2C_FAST_MODE, .slave_addr = 0x1a, }, .power_setup_array = sensor_power_setup, // 电源序列函数 .sensor_output_settings = sensor_settings, // 分辨率/帧率配置 }; ``` - **寄存器初始化** 从厂商获取初始化序列(通常为`.cfg`文件),转换为C数组: ```c static struct camera_sensor_reg_array init_regs[] = { {0x0100, 0x00, 0x00}, // 软复位 {0x0103, 0x01, 0x00}, // 启动初始化 {0x0300, 0x04, 0x00}, // MIPI通道配置 // ... 其他寄存器 }; ``` #### 4. **CSIPHY/CSID配置** - 在设备树中确保CSI接收端匹配: ```dts &cam_csiphy0 { status = "ok"; compatible = "qcom,csiphy-v1.2"; clocks = <&camcc CAM_CC_CPHY_RX_CLK_SRC>; }; ``` - 验证MIPI信号锁定: ```bash adb shell "echo 1 > /sys/kernel/debug/camera/csiphy0/lane_map" adb shell dmesg | grep "csiphy" # 检查"Lanes in use"状态 ``` #### 5. **Camera HAL适配** - **配置XML文件** 在`vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/mct/pipeline/`中添加Sensor XML: ```xml <sensor_module name="sensor_model"> <sensor_lib name="libsensor_model"> <!-- 驱动库名 --> <resolution value="4208x3120"/> <!-- 支持分辨率 --> <fps range="30"/> <!-- 帧率范围 --> </sensor_module> ``` - **Chromatix调参** 将厂商提供的3A算法参数(如`chromatix_sensor_model.h`)放入`mm-camera2/media-controller/modules/sensors/chromatix/` #### 6. **启动验证与调试** - **基础检查**: ```bash adb shell "cat /proc/i2c" # 确认I2C设备注册 adb shell dmesg | grep "sensor" # 检查内核加载日志 ``` - **图像测试工具**: ```bash adb shell camxhal3test -c 0 -s 4 # 预览测试(0号摄像头,4K模式) ``` - **常见问题排查**: - **无I2C通信**:检查GPIO复用配置(`pinctrl`) - **MIPI信号不同步**:调整`data_lanes`顺序 - **花屏**:验证初始化寄存器序列时序 > 完整流程需参考高通文档《Camera Bring-up Guide for Linux/Android》[^2]和Sensor厂商提供的硬件设计指南(HDK)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值