QCOM camera调试的重要参数
本文主要介绍QCOM camera调试的重要参数;
(1)Lane_assign 和lane_mask
现在摄像头基本都是mipi接口类型,因为前后摄都对应到平台这边不同的mipi接口,相应的数据lane需要一一对应;
lane assign:
lane_mask:
比如:
101 <LaneMask>0x1F</LaneMask>
102 <LaneAssign>0x4320</LaneAssign>
1
2
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 },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(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,
},
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 吐出数据的带宽;不同的平台的处理能力不一样,所以这个值不能超过平台规范定义的值;
vt_pixel_clk 主要是用于曝光时间计算,用于AEC算法的banding 纠正,计算公式 vt_pixel_clk = line_length_pclk * frame_length_lines * frame_rate
op_pixel_clk VFE时钟,表示每秒VFE处理数据量 op_pixel_clk = (sensor输出实际比特率)/ bits-per-pixel
比如,如果MIPI DDR 时钟值 (sensor MIPI 的时钟lane 频率) 为300Mhz, 同时sensor 使
用4 个lane 传输数据, 每一个lane 的数据率是 300*2 = 600Mhz(CLK_N、CLK_P这两根时钟线的上升沿/下降沿可以获取到数据). 因此, 总数据率为 600*4
= 2400Mhz. 对于10bit的bayer sensor, op_pixel_clk 值可设置为2400/10 = 240Mhz.
这些值可以从sensor 的寄存器设置中技算出来
(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)
1
2
settle_cnt(即稳定计数)– 必须根据sensor传感器输出特性配置该值,以确保传感器的 PHY 发送器与MSM 的 PHY 接收器无障碍同步;对于 28 nm 以及更小的 MSM 芯片,使用以下公式计算稳定计数:
settle_cnt = T(HS_SETTLE)_avg /T(TIMER_CLK),
1
其中 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
1
2
3
4
5
6
7
对于 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,
1
2
水平方向Binning: 同列相邻行的电荷叠加;
垂直方向Binning: 同行相邻列的电荷叠加;
Binning Mode 优势:增加感光面积,提高暗处对光感应的灵敏度;应用:增加物理感光像素单元,采用像素合并模式,提升暗处对光感应的灵敏度;
Binning Mode 劣势:降低输出分辨率;
额外补充:
sensor 开窗的不同模式:ROI, BIN,SKIP;
ROI :Region of interes在相机传感器分辨范围内定义一个或多个感兴趣的窗口区域,仅对这些窗口内的图像信息进行读出,只获取该局部区域的图像;
BIN :这种模式就是按照一定的规律,把想要的数据采集上来,把其余的数据扔掉;
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,
};
1
2
3
4
5
6
高通平台上两条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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
解释如下:
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