/* __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参数设置