高通camera驱动分析 (2)

/* __u32为unsigned int 型 */
#define  v4l2_fourcc(a,b,c,d) \
((__u32)(a) | ((__u32)(b) << 8) | ((__u32)(c) << 16) | ((__u32)(d) << 24)//为什么这么做?

/* %20Bayer.htm */
#define V4L2_PIX_FMT_SBGGR8v4l2_fourcc(\'B\',\'A\',\'8\',\'1\') //BGGR 8bit
#define V4L2_PIX_FMT_SGBRG8v4l2_fourcc(\'G\',\'B\',\'R\',\'G\') //GBRG 8bit
#define V4L2_PIX_FMT_SGRBG8v4l2_fourcc(\'G\',\'R\',\'B\',\'G\') //GRBG 8bit
#define V4L2_PIX_FMT_SRGGB8v4l2_fourcc(\'R\',\'G\',\'G\',\'B\') //RGGB 8bit
#define V4L2_PIX_FMT_SBGGR10v4l2_fourcc(\'B\',\'G\',\'1\',\'0\') //BGGR 10bit
#define V4L2_PIX_FMT_SGBRG10v4l2_fourcc(\'G\',\'B\',\'1\',\'0\') //GBRG 10bit
#define V4L2_PIX_FMT_SGRBG10v4l2_fourcc(\'B\',\'A\',\'1\',\'0\') //GRBG 10bit
#define V4L2_PIX_FMT_SRGGB10v4l2_fourcc(\'R\',\'G\',\'1\',\'0\') //RGGB 10bit
#define V4L2_PIX_FMT_SBGGR12v4l2_fourcc(\'B\',\'G\',\'1\',\'2\') //BGGR 12bit
#define V4L2_PIX_FMT_SGBRG12v4l2_fourcc(\'G\',\'B\',\'1\',\'2\') //GBRG 12bit
#define V4L2_PIX_FMT_SGRBG12v4l2_fourcc(\'B\',\'A\',\'1\',\'2\') //GRBG 12bit
#define V4L2_PIX_FMT_SRGGB12v4l2_fourcc(\'R\',\'G\',\'1\',\'2\') //RGGB 12bit

像素格式的值MSM_V4L2_PIX_FMT_META是宏定义在media/msm_cam_sensor.h中:

#define MSM_V4L2_PIX_FMT_METAv4l2_fourcc(\'M\',\'E\',\'T\',\'A\')

2.3 、Sensor输出尺寸设置

结构体sensor_lib_out_info_t用于保存sensor所支持的不同分辨率的信息。imx230_lib.c中使用结构体sensor_lib_out_info_t定义了一个sensor_out_info[]。sensor_out_info[0]保存最大分辨率信息,sensor_out_info[1]保存1/4最大分辨率的信息。

2.3.1、 各参数含义解释

结构体sensor_lib_out_info_t的定义如下:
struct sensor_lib_out_info_t {
uint16_t  x_output; //sensor 输出宽度(pixels)
uint16_t  y_output; //sensor输出高度(pixels)
uint16_t  line_lenth_pclk; //每一帧每一行多少个pixels
uint16_t  frame_length_lines; //每一帧多少行
uint32_t  vt_pixel_clk;         //sensor 扫描速率(pixels per sec)
uint32_t  op_pixel_clk;         //sensor实际输出速率(pixels per sec)
uint16_t  bining_factor; /*?: 1 if average is taken, >1 if sum is taken(applies only for if this resolution has binnig) */
float min_fps;//sensor支持的最小帧率
float max_fps;//sensor支持的最大帧率
uint32_t  mode; //分辨率所对应的模式
};

使用Chromatix软件进行tuning设置Image Width和Image Height的值时分别参考此处x_output和y_output。

line_length_pckl 和frame_length_lines 是指包含blanking的宽度值和高度值。
line_lenth_pclk和frame_length_lines决定帧的大小。

什么是blanking?

每一帧图像的每一行输出是遵循CSI2的通用帧格式。每一行的行尾(Packet Footer,PF)到下一行行头(Packet Header,PH)的期间称为“line blanking”。同样的,每一帧的帧尾(Frame End,FE)到下一帧帧头(Frame Start,FS)的期间称为“frame blanking”。

vt_pixel_clk时钟用于内部图像处理,计算曝光时间和帧率等。
曝光时间计算见4.1。
帧率:frame rate = vt_pixel_clk / (line_lenth_pclk * frame_length_lines).

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

比如,如果 MIPI DDR 时钟值 (sensor MIPI 的时钟 lane 频率) 为 300Mhz, 同时 sensor 使用4 个 lane 传输数据, 每一个 lane 的数据率是 300*2 = 600Mhz. 因此, 总数据率为 600*4= 2400Mhz. 对于 10bit 的 bayer sensor, op_pixel_clk 值可设置为 2400/10 = 240Mhz.这些值可以从 sensor 的寄存器设置中计算出来。

其中的mode的值是宏定义的,如下:
/* HFR模式不用于常规的camera,camcorder */
#define SENSOR_DEFAULT_MODE (1 << 0)//默认模式
#define SENSOR_HFR_MODE (1 << 1)        //高帧率模式,用于捕捉慢动作视频
#define SENSOR_HDR_MODE (1 << 2)//高动态范围图像模式

结构体sensor_lib_out_info_array的定义如下:
struct sensor_lib_out_info_array {
struct sensor_lib_out_info_t*out_info; //指向sensor_lib_out_info_t结构体的指针
uint16_t size;        //sensor_lib_out_info_t结构体数组长度
};

ARRAY_SIZE的宏定义如下:
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))//获取数组长度。

2.3.2 、x_output & y_output参数设置

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsdsz.html