摄像头驱动指南

(一)内核驱动

1. GPIO

kernel/Documentation/devicetree/bindings/media/video/

gpios = <&msmgpio 15 0>, 
<&msmgpio 90 0>,
<&msmgpio 89 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;

qcom,gpio-req-tbl-num = <0 1 2>;
qcom,gpio-req-tbl-flags = <1 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK",
"CAM_RESET1",
"CAM_STANDBY";
qcom,gpio-set-tbl-num = <1 1>;
qcom,gpio-set-tbl-flags = <0 2>;
qcom,gpio-set-tbl-delay = <1000 30000>;

实现I2C的功能

gpios = <&msm_gpio 29 0>, 
<&msm_gpio 30 0>;
qcom,gpio-tbl-num = <0 1>;
qcom,gpio-tbl-flags = <1 1>;
qcom,gpio-tbl-label = "CCI_I2C_DATA0",
"CCI_I2C_CLK0";

2. 时钟

设置时钟源

clocks = <&clock_gcc clk_mclk0_clk_src>, 
<&clock_gcc clk_gcc_camss_mclk0_clk>;
clock-names = "cam_src_clk", "cam_clk";

3. 供电

PMIC供电

cam_vdig-supply = <&pm8916_s4>; 
cam_vana-supply = <&pm8916_l17>;
cam_vio-supply = <&pm8916_l6>;
cam_vaf-supply = <&pm8916_l10>;

CAM_VANA – Supply voltage (模拟)
CAM_VDIG – Supply voltage (数字)
CAM_VAF – Supply voltage (Actuator 电压)
CAM_VIO – Input/output voltage (IO数字)

也可以通过GPIO控制外部的LDO供电

gpios = <&msm_gpio 27 0>, 
<&msm_gpio 28 0>,
<&msm_gpio 33 0>,
<&msm_gpio 114 0>,
<&msm_gpio 110 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;
qcom,gpio-vdig = <3>;
qcom,gpio-vana = <4>;
qcom,gpio-req-tbl-num = <0 1 2 3 4>;
qcom,gpio-req-tbl-flags = <1 0 0 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK",
"CAM_RESET",
"CAM_STANDBY",
"CAM_VDIG",
"CAM_VANA";

4. YUV I2C 地址配置(bayer的配置在用户空间中)

(二)用户空间驱动

1. sensor初始化参数

包括支持模式,安装位置和安装角度

2. sensor输出配置

bayer或者YUV

连接模式MIPI或者parallel

输出的sensor尺寸会有要求,具体需要看sensor手册,比如说长宽需要是多少的倍数,起始点的横纵坐标是多少的倍数

sensor尺寸的要求

3. bayer slave配置

  1. I2C slave地址以及地址类型

  2. sensor id寄存器地址,写入sensor_id_info数据结构

  3. 上下电设置,写入mm_sensor_power_setting结构体

4. 输出尺寸表

vt_pixel_clk = line_length_pclk * frame_length * frame rate

用于曝光时间的计算,可以用来AEC算法的antibanding校正

op_pixel_clk VFE时钟

op_pixel_clk = (sensor 输出实际比特率)/bits-per-pixel

如果MIPI DDR时钟值(MIPI lane的频率)为300Mhz,同时sensor使用4个lane传输数据,每个lane的数据率为300 * 2 = 600Mhz,因此总数据率为600* 4 = 2400Mhz,对于10bit的bayer sensor,op_pixel_clk 的值可设置为2400 / 10 = 240Mhz。实际测试下来,这个时钟值可以大不能小

5. chromatix参数

6. sensor寄存器地址

  1. 曝光寄存器

vert_offset - 曝光行数上限的边界值,曝光行数任何情况下都应该小于frame_length_lines减去vert_offset

  1. 输出控制寄存器地址

7. MIPI接收器配置

  1. CSI-PHY config 设置lane参数
  2. csi_lane_assign对sensor和MSM的lan进行映射,调整顺序
  3. CSI-D配置 这个没太懂,一般应该都是CSI_RAW10

8. 寄存器设定

通过I2C来配置

  1. 初始化设定

  2. grouphold on设定

    sensor工作时更新曝光设定需要操作很多寄存器(曝光时间,每帧行数,增益),他们必须要在同一帧内完成,这些寄存器都有双buffer,并具有按组更新的功能。表现为所有相关寄存器一起完成更新。当设定grouped parameter hold为1时,写入的寄存器数据被暂存到buffer寄存器中。

  3. grouphold off设定

    当设定group parameter hold为0时,曝光寄存器的值会被同时更新,参数的变化会在同一帧生效,相当于一个触发器。

  4. 分辨率设定

  5. 曝光设定 主要编写real_to_register_gain和register_to_real_gain()函数

  6. 启动输出设定

    MIPI数据包必须在start of transmission 和 end of transmission之间发送

    这个地方相当于启动camera

  7. 停止输出设定

    应该要把clock和data lane置为LP11的状态,如果没有正确执行会导致相机和高通平台同步问题

(三)可能出现的问题

当相邻两证的时间戳相差较远,会出现SOF IRQ 超时的问题,这个地方高通出现过fd泄露的问题

当VFE时钟的设置小于sensor的MIPI时钟,会出现VFE overflow

当声明的传感器输出尺寸和传感器输出尺寸不匹配时,会发生CAMIF错误。

为了排除CSID故障,必须启用所有CSID IRQ以检查CSID是否收到mipi数据或错误位IRQ。

为了对DPHY进行故障排除,必须启用DPHY调试日志以检查硬件寄存器CAMSS_A_CSI_PHY_X_MIPI_CSIPHY_INTERRUPT_STATUSY是否收到任何IRQ错误。

(四)注意点

  1. VI/ISP 的工作时钟 。 如上图中的 VI 最大工作时钟是 6 00MHz ,模式 3 840 * 2160 * 60fps 的像素时钟是 4 98MHz ,还是能够支持的;如果是模式 3 840 * 2160 * 100fps , 那么像素时钟需要 8 30Mhz , 超出了芯片的处理能力 。 VI 时钟 通过 vi_p0_cksel(pipe0) 寄存器来控制 , 高分辨率高帧率下如果出现 mipi 解析数据无异常 , 但出现 vi 中断不对的情况 , 可以确认下这 组 寄存器的配置 。

  2. 通信数据速率。上述 sensor 端的帧率和位宽方面已提过,一般来说新的 soc 平台不会因为 mipi 或 lvds 的接受速率受限而无法对接,但是对于大分辨率较高帧率的 sensor ,还是存在这方面的风险。

  3. 输入时钟。 Sensor 依赖于外部时钟驱动,输入时钟区分为芯片平台提供和晶振提供,需要与硬件确认。如果是芯片平台提供的时钟,需要查找《 SoC 用户指南》的时钟复位配置寄存器,配置为需要的频率;如果是晶振提供,那与硬件确认晶振提供的时钟频率是什么,是否合乎需求。

  4. 注意主从模式,主要区别是sensor的行列同步信号,是有sensor内部产生还是外部产生来达到控制帧率的目的,主从模式在硬件设计以及软件配置方面有差别。

如果需要详细了解,请参考《Camera Sensor Driver Development and Troubleshooting