高通Camera 驱动调试要点(一)

本文主要介绍QCOM camera调试的重要参数;

(1)Lane_assign 和lane_mask

  现在摄像头基本都是mipi接口类型,因为前后摄都对应到平台这边不同的mipi接口,相应的数据lane需要一一对应;

  lane assign:

  lane_mask:

比如:

101       <LaneMask>0x1F</LaneMask>
102       <LaneAssign>0x4320</LaneAssign>

  0x1F:只有0~4表示有效,对应bit位置为1表示该位的lane或者clock有效,0x1F即表示该mipi接口上的4条data线和clk线都有效;
  0x4320:表示sensor这边几条data线对应到平台这边mipi接口的第几路接口端口映射;bit0~3表示lane0对应平台这边mipi的第0接口,bit12~15表示lane 3对应平台这边mipi的第4接口,那第1个接口就是为时钟clk对接的;

(2)combo_mode

  如该平台这边只有一个mipi phy设备,有时候就需要前后摄共用这个phy,此时combo_mode就要设为1,或者在双摄的情况下:主副摄会与前摄共用,这个值也会设为1,下面是两个camera分配情况:

  比如只有一个PHY interface 的msm8909平台就可以这样配置:

//前摄配置

151 static struct csi_lane_params_t csi_lane_params = {
152   .csi_lane_assign = 0x004,
153   .csi_lane_mask = 0x18,
154   .csi_if = 1, // not used
155   .csid_core = {0},
156   .csi_phy_sel = 0,
157 };

432   .csiphy_params = {
433     .lane_cnt = 1,
434     .settle_cnt = 0x1b,//0x1b,
436     .combo_mode = 1,
438   },

//后摄配置

198 static struct csi_lane_params_t csi_lane_params = {
199   .csi_lane_assign = 0x4320,
200   .csi_lane_mask = 0x7,
201   .csi_if = 1, // not used
202   .csid_core = {0},
203   .csi_phy_sel = 0,
204 };

334   .csiphy_params = {
335     .lane_cnt = 2,
336     .settle_cnt = 0x18,
338     .combo_mode = 1,
340   },

(3)pixel_clk

  像素时钟(pixel clk): 是经过主时钟MCLK(EXTCLK) 经过PLL得到的,决定了该sensor突出数据的速度;相关PLL设定需要查看sensor 寄存器的data sheet,以s5k2ya为例:

  如下为一个sensor的clk相关的配置:

static struct sensor_lib_out_info_t sensor_out_info[] = {
{
/* full size @ 24 fps*/
.x_output = 4208,
.y_output = 3120,
.line_length_pclk = 4572,
.frame_length_lines = 3142,
.vt_pixel_clk = 360000000,
.op_pixel_clk = 360000000,
.binning_factor = 1,
.max_fps = 24.01,
.min_fps = 7.5,
.mode = SENSOR_DEFAULT_MODE,
},

  vt_pixel_clk(video timing clk value) – Virtual clock value used for calculating shutter time,and used by AEC for correcting banding artifacts
vt_pixel_clk = line_length_pclk * frame_length_lines * frame rate

  平台根据写入不同的曝光行来控制帧率,比如在暗处希望牺牲一点帧率,让Gain值更高,就用这个公式来计算,最后计算的 frame_length_lines 写入相应寄存器;

  注意一点的是不同的平台需要一个最小的blanking time,所以frame_length_lines是要大于真是有效数据行y_output,而且差值一般16对齐;

  op_pixel_clk – Represents how much data comes out of the camera over MIPI lanes to set the VFE clock op_pixel_clk = (total data rate from sensor)/bits-per-pixel

if the MIPI DDR clock value (speed of the clock lane of the MIPI camera
sensor) is 300 MHz, and the sensor transmits on 4 lanes, each lane has a 600 MHz data rate.Thus, the total data rate is 2400 MHz. For 10 bits per pixel Bayer data, this translates to the op_pixel_clk value of 2400/10 = 240 MHz. These values must be filled in accordance with the sensor specifications.

  这个时钟决定了sensor mipi data lane 吐出数据的带宽;不同的平台的处理能力不一样,所以这个值不能超过平台规范定义的值;

(4)settle_cnt

  settle_cnt(即稳定计数)–表示mipi开始切换到高速模式的一个稳定时间,必须根据传感器输出特性配置该值,以确保传感器的 PHY 发送器与 MSM 的 PHY 接收器无障碍同步;

  settle_cnt – For CSI_Tx (the sensor) and CRI_Rx (the device) to work properly, a period for syncing between them is required. This time is set here as number of timer clock ticks. It has to be between the MIN and MAX values calculated by the formulas:

MIN [Settle count * T(Timer clock)] > T(HS_SETTLE)_MIN
MAX [Settle count * T(Timer clock)] < T(HS-PREPARE)+T(HS_ZERO) - 4*T(Timer clock)

  settle_cnt(即稳定计数)– 必须根据sensor传感器输出特性配置该值,以确保传感器的 PHY 发送器与 MSM 的 PHY 接收器无障碍同步;对于 28 nm 以及更小的 MSM 芯片,使用以下公式计算稳定计数:

settle_cnt = T(HS_SETTLE)_avg /T(TIMER_CLK),

  其中 T(HS_SETTLE)_avg = (T(HS_SETTLE)_min + T(HS_SETTLE)_max) / 2,如传感器数据表所指示:

  其中 T(HS_SETTLE)_avg = (T(HS_SETTLE)_min + T(HS_SETTLE)_max) / 2,如传感器数据表所指示。

  TIMER_CLK 指摄像头传感器所连接的 PHY 接口的工作频率。(例如,PHY0 的CAMSS_PHY0_CSI0PHYTIMER_CLK)。该值在 kernel/arch/arm/boot/dts/msm/
msmXXXX-camera.dtsi 文件中设置,其中 XXXX 指正在使用 MSM 芯片组。另
外,也可在摄像头数据流传输期间确认,方法是通过 adb shell 检查相应的时钟信
息。例如,可通过命令提示窗口发出以下命令以确认 PHY0 定时器时钟值:

adb root
adb remount
adb shell
cd /sys/kernel/debug/clk/gcc_camss_csi0phytimer_clk
cat measure
200000146

  对于 45 nm MSM 芯片,使用与 28 nm MSM 芯片相似的公式,其中的 T(TIMER_CLK)替换为 T(DDR_CLK)。

  – DDR_CLK 指摄像头传感器的 MIPI CLK 通道的工作频率,该值由通过传感器摄像头驱动程序设置的摄像头传感器 PLL 配置确定。
  – T(DDR_CLK) 为工作频率等于 DDR_CLK 时的时钟周期持续时间,以纳秒为单位表示。例如,DDR_CLK 200 MHz 的 T(DDR_CLK) 为 (1 * (10^9)) / (200 * (10^6)) =5 ns。

  有关 T(HS_SETTLE) 的定义,可参见针对 D-PHY(版本 1.1)的 MIPI(R)联盟规范。为了防止上述系数在传感器工作时所处的不同数据流传输模式间发生变化,必须为摄像头传感器驱动程序中每个唯一的数据流传输模式单独配置 settle_cnt。

(5)Binning Mode

  Camera Binning Mode:像素合并模式,将相邻的像素单元电荷通过物理的方法叠加在一起作为一个像素输出信号;

 935         .binning_factor = 1,
 936         .binning_method = 0,

  水平方向Binning: 同列相邻行的电荷叠加;
  垂直方向Binning: 同行相邻列的电荷叠加;

  Binning Mode 优势:增加感光面积,提高暗处对光感应的灵敏度;应用:增加物理感光像素单元,采用像素合并模式,提升暗处对光感应的灵敏度;
  Binning Mode 劣势:降低输出分辨率;

额外补充:

  sensor 开窗的不同模式:ROI, BIN,SKIP;

  1. ROI :Region of interes在相机传感器分辨范围内定义一个或多个感兴趣的窗口区域,仅对这些窗口内的图像信息进行读出,只获取该局部区域的图像;
  2. BIN :这种模式就是按照一定的规律,把想要的数据采集上来,把其余的数据扔掉;
  3. SKIP:就是把相邻的像素合成一个像素,然后再输出。

(6)I2C CLK

  The available I2C frequency modes are defined in kernel/include/media/msm_cam_sensor.h:standard (100 kHz), fast (400 kHz), and Custom mode.

enum i2c_freq_mode_t {
I2C_STANDARD_MODE,
I2C_FAST_MODE,
I2C_CUSTOM_MODE,
I2C_MAX_MODES,
};

  高通平台上两条Camera I2C设备总线是专门为Camera用的,配置不同的i2c频率的参数值定义在dtsi里面;

479 &i2c_freq_100Khz {
480     qcom,hw-thigh = <78>;
481     qcom,hw-tlow = <114>;
482     qcom,hw-tsu-sto = <28>;
483     qcom,hw-tsu-sta = <28>;
484     qcom,hw-thd-dat = <10>;
485     qcom,hw-thd-sta = <77>;
486     qcom,hw-tbuf = <118>;
487     qcom,hw-scl-stretch-en = <0>;
488     qcom,hw-trdhld = <6>;
489     qcom,hw-tsp = <1>;
490 };

CCI clock = (src clock) / (hw_thigh + hw_tlow)  //src clock 19.2MHZ

解释如下:

  • qcom,hw-thigh : should contain high period of the SCL clock in terms of CCI
    clock cycle
  • qcom,hw-tlow : should contain high period of the SCL clock in terms of CCI
    clock cycle
  • qcom,hw-tsu-sto : should contain setup time for STOP condition
  • qcom,hw-tsu-sta : should contain setup time for Repeated START condition
  • qcom,hw-thd-dat : should contain hold time for the data
  • qcom,hw-thd-sta : should contain hold time for START condition
  • qcom,hw-tbuf : should contain free time between a STOP and a START condition
  • qcom,hw-scl-stretch-en : should contain enable or disable clock stretching
  • qcom,hw-trdhld : should contain internal hold time for SDA
  • qcom,hw-tsp : should contain filtering of glitches

i2c burst mode:

TODO

(0)

相关推荐