高通camera驱动分析 (3)

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设置

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

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