x_output和y_output是sensor输出图像的重要参数,分别代表了图像的宽度和高度,单位是pixel。上层camera app最终就是从这里获取的sensor输出图像的宽度和高度信息,然后根据此信息裁剪出各种尺寸的图片。
Camera app照相所支持的图片尺寸在mct_pipeline.c(路径:vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/mct/pipeline)中定义,如下图:
因此imx230的x_output和y_output参数设置是不能小于上图中的最大尺寸,同时要与实际sensor输出图像的尺寸一致。
Imx230中控制sensor输出图像尺寸的寄存器关系如下图:
由关系图可以看出,最终控制sensor图像输出尺寸的是寄存器X_OUT_SIZE和Y_OUT_SIZE,所以x_output和y_output的值要与这两个寄存器的值一致。
一般sensor提供商所提供的这些寄存器的设置,都是由寄存器X_ADD_STA ,Y_ADD_STA, X_ADD_END和Y_ADD_END所确定的尺寸就是sensor最后输出的尺寸,这样后面的bining、sub-sampling、digtal crop、scaling 处理都可以省去以节约拍照时间。
2.4 、Sensor输出寄存器地址设置
结构体 msm_sensor_output_reg_addr_t的定义如下:
struct msm_sensor_output_reg_addr_t {
uint16_t
x_output;
//寄存器X_OUT_SIZE地址
uint16_t
y_output;
//寄存器Y_OUT_SIZE地址
uint16_t
line_length_pclk;
//寄存器LIN_LENGTH_PCK地址
uint16_t
frame_length_lines;
//寄存器FRM_LENGTH_LINES地址
};
2.5、 图像裁剪设置
图像裁剪设置主要用到的结构体为sensor_crop_parms_t和sensor_crop_params_arry, sensor_crop_params_t用于保存裁剪的位置信息。定义在sensor_lib.h中:
struct sensor_crop_parms_t {
uint16_t
top_crop;
//距离顶部的距离
uint16_t
bottom_crop;
//距离底部的距离
uint16_t
left_crop;
//距离左侧的距离
uint16_t
right_crop; //距离右侧的距离
} ;
struct sensor_lib_crop_params_array{
struct sensor_crop_parms_t *crop_params;
//结构体指针
uint16_t
size;
//结构数组长度
};
imx230对于2种分辨率的图像不裁剪。
2.6 、分辨率切换设置
imx230使用2种分辨率,枚举类型sensor_res_cfg_type_t说明了进行分辨率切换时所需要进行的操作,在sensor_lib.h中定义如下:
typedef enum {
SENSOR_SET_STOP_STREAM,//停止数据传输
SENSOR_SET_START_STREAM,//开始数据传输
SENSOR_SET_NEW_RESOLUTION,//设置新的分辨率
SENSOR_SEND_EVENT,//发送事件
SENSOR_SET_CSIPHY_CFG,//CSIPHY参数设置
SENSOR_SET_CSID_CFG,//CSID参数设置
SENSOR_LOAD_CHROMATIX,//加载chromatix参数
} sensor_res_cfg_type_t;
imx230_res_cfg[]数组序列对应着切换分辨率的操作顺序:
停止数据传输 ----> 设置新的分辨率 ----> CSIPHY参数设置 ----> CSID参数设置
----> 加载chromatix参数 ----> 发送事件 ----> 开始数据传输.
3、Camera I2C寄存器设置
I2C寄存器的设置都会用到这两种结构体:msm_camera_i2c_reg_array 和msm_camera_i2c_reg_setting。其定义在media/msm_camera.h中:
struct msm_camera_i2c_reg_array {
uint16_t
reg_addr;
//寄存器地址
uint16_t
reg_data;
//寄存器数据
};
struct msm_camera_i2c_reg_setting {
struct msm_camera_i2c_reg_array *reg_setting;
//结构体指针
uint16_t
size;
//结构数组长度
enum msm_camera_i2c_reg_addr_typeaddr_type;
//地址类型
enum msm_camera_i2c_data_typedata_type;
//数据类型
uint16_t
dalay;
//延时
};
其中枚举类型msm_camera_i2c_reg_addr_type在1.2中已经作过介绍了。 msm_camera_i2c_data_type的定义如下:
enum msm_camera_i2c_data_type {
MSM_CAMERA_I2C_BYTE_DATA = 1,
MSM_CAMERA_I2C_WORD_DATA,
MSM_CAMERA_I2C_SET_BYTE_MASK,
MSM_CAMERA_I2C_UNSET_BYTE_MASK,
MSM_CAMERA_I2C_SET_WORD_MASK,
MSM_CAMERA_I2C_UNSET_WORD_MASK,
MSM_CAMERA_I2C_SET_BYTE_WRITE_MASK_DATA,
};
3.1、寄存器初始化设置
表现为在相机启动时一组一次性写入的寄存器。init_reg_array[],res0_reg_array[]和res1_reg_arry[]定义在头文imx230_lib.h中。分别对应excel表RegisterSetting中的全局设置和不同分辨率设置的数据。
寄存器初始化流程为:
上电 —> 外部时钟输入 —> XCLR关闭—> 外部时钟寄存器设置 —> 全局寄存器设置 —> Load Setting
之后寄存器设置根据不同分辨率具有不同的设置。
Load Setting —> 模式设置 —> 输出格式设置 —> 时钟设置 —> Data rate设置 —> 曝光时间设置 —> Gain值设置 —> HDR设置 —> DPC2D设置 —> LSC设? —> Stats 设置
3.2 、Grouphold on设置