1、Sensor slave配置

结构体msm_camera_sensor_slave_info定义在media/msm_cam_sensor.h中:

struct msm_camera_sensor_slave_info {

char sensor_name[32];  //sensor名称

char eeprom_name[32];  //eeprom名称

char actuator_name[32];  //actuator名称

enum msm_sensor_camera_id_t  camera_id;

//camera

id号

uint16_t  slave_addr;  //从地址

enum msm_camera_i2c_reg_addr_type  addr_type;  //camera i2c寄存器地址类型

struct msm_sensor_id_info_t  sensor_id_info;  //sensor 芯片id信息

struct msm_sensor_power_setting_array  power_setting_array;  //上电序列

uint8_t is_init_params_vaild;  //初始化参数是否有效

struct msm_sensor_init_params  sensor_init_params;  //sensor初始化参数

};

1.1、枚举类型msm_sensor_camera_id_t的定义如下:

enum msm_sensor_camera_id_t {

CAMERA_0, //camera id 号0

CAMERA_1, //camera id 号1

CAMERA_2, //camera id 号2

CAMERA_3, //camera id 号3

MAX_CAMERAS, //支持的最大id号

};

1.2、枚举类型msm_camera_i2c_reg_addr_type的定义如下:

enum msm_camera_i2c_reg_addr_type{

MSM_CAMERA_I2C_BYTE_ADDR  = 1,

//1字节型

MSM_CAMERA_I2C_WORD_ADDR, //2字型

MSM_CAMERA_I2C_3B_ADDR, //3字节型

};

1.3、结构体msm_sensor_id_info_t的定义如下:

struct msm_sensor_id_info_t{

uint16_t sensor_id_reg_addr;  //对应sensor

id号的寄存器地址

uint16_t sensor_id; //sensor id号

};

1.4、结构体 msm_sensor_power_setting_array的定义如下:

enum msm_sensor_power_seq_type_t{

SENSOR_CLK,

SENSOR_GPIO,

SENSOR_VREG,

SENSOR_I2C_MUX,

};

struct msm_sensor_power_setting{  //上电序列

enum msm_sensor_power_seq_type seq_type;

uint16_t seq_val;

long config_val;

uint16_t delay;

void *data[10];

};

struct  msm_sensor_power_setting_array{

struct msm_sensor_power_setting *power_setting;

uint16_t  size;

struct msm_sensor_power_setting  *power_down_setting;

uint16_t  size_down;

};

1.5、结构体msm_sensor_init_params的定义如下:

enum camb_position_t{

BACK_CAMERA_B, //后摄

FRONT_CAMERA_B, //前摄

INVALID_CAMERA_B, //非法

}

struct  msm_sensor_init_params{

int modes_supported;  //支持camera的模式

enum camb_position_t position; //sensor的位置

uint32_t sensor_mount_angle; //sensor安装的角度

};

举例:

以下是imx230_lib.c中对sensor初始化参数的设置。

支持模式的值是在枚举类型camerab_mode_t中:

enum camerab_mode_t{

CAMERA_MODE_2D_B = (1<<0), //2D

CAMERA_MODE_3D_B = (1<<1), //3D

CAMERA_MODE_INVALID = (1<<2), //非法

};

2D模式:平面图像模式。

3D模式:拍照出使裸眼观看就具有立体感的图像的模式,需要使用双摄像头。

sensor安装角度的值是宏定义,在sensor_lib.h中:

#define SENSOR_MOUNTANGLE_360 360  //360度

#define SENSOR_MOUNTANGLE_0 0 //0度

#define SENSOR_MOUNTANGLE_90 90 //90度

#define SENSOR_MOUNTANGLE_180 180  //180度

#define SENSOR_MOUNTANGLE_270 270  //270度

2.、Sensor 输出设置

2.1 、Sensor输出格式设置

输出格式:Bayer/YUV.

连接模式:parallel/MIPI. msm8974只支持MIPI.

Raw图格式:8/10/12 bits.

imx230分别设置为Bayer、MIPI、10bit。

结构体sensor_output_t 定义在sensor_lib.h中:

typedef struct{

sensor_output_format_t output_format; //输出格式

sensor_connection_mode_t connection_mode; //连接模式

sensor_raw_output_t raw_output; //raw图格式

}sensor_output_t;

其中sensor_output_format_t, sensor_connection_mode_t,

sensor_raw_output_t为枚举类型,定义如下:

typedef enum{

SENSOR_BAYER, //Bayer格式

SENSOR_YCBCR //YUV格式(Y,Cb,Cr)

}sensor_output_format_t;

typedef enum{

SENSOR_PARALLEL, //并行

SENSOR_MIPI_CSI,  //MIPI CSI

SENSOR_MIPI_CSI_1, //CSI1

SENSOR_MIPI_CSI_2, //CSI2

}sensor_connection_mode_t;

typedef enum{

SENSOR_8_BIT_DIRECT,  //8-bit

SENSOR_10_BIT_DIRECT, //10-bit

SENSOR_12_BIT_DIRECT, //12-bit

}sensor_raw_output_t;

10-bit

RAW图数据是通过数据包的格式进行传输的,打包之后的数据格式为8-bit。下表是对RAW10数据包格式限制条件的说明,每一个数据包的长度必须是表中数值的整数倍,bit位传输顺序服从CSI-2规则,LSB优先。

2.2 、Sensor像素格式信息

结构体sensor_pix_fmt_info_t定义在sensor_lib.h中:

struct sensor_pix_fmt_info_t {

uint32_t fourcc;

};

像素格式的值V4L2_PIX_FMT_SRGGB10是宏定义在linux/videodev2.h中,如下:

#define  v4l2_fourcc(a,b,c,d) \

((__u32)(a) | ((__u32)(b) << 8) | ((__u32)(c) <<

16) | ((__u32)(d) << 24) //为什么这么做?

#define V4L2_PIX_FMT_SBGGR8 v4l2_fourcc('B','A','8','1')

//BGGR 8bit

#define V4L2_PIX_FMT_SGBRG8 v4l2_fourcc('G','B','R','G')

//GBRG 8bit

#define V4L2_PIX_FMT_SGRBG8 v4l2_fourcc('G','R','B','G')

//GRBG 8bit

#define V4L2_PIX_FMT_SRGGB8 v4l2_fourcc('R','G','G','B')

//RGGB 8bit

#define V4L2_PIX_FMT_SBGGR10 v4l2_fourcc('B','G','1','0')

//BGGR 10bit

#define V4L2_PIX_FMT_SGBRG10 v4l2_fourcc('G','B','1','0')

//GBRG 10bit

#define V4L2_PIX_FMT_SGRBG10 v4l2_fourcc('B','A','1','0')

//GRBG 10bit

#define V4L2_PIX_FMT_SRGGB10 v4l2_fourcc('R','G','1','0')

//RGGB 10bit

#define V4L2_PIX_FMT_SBGGR12 v4l2_fourcc('B','G','1','2')

//BGGR 12bit

#define V4L2_PIX_FMT_SGBRG12 v4l2_fourcc('G','B','1','2')

//GBRG 12bit

#define V4L2_PIX_FMT_SGRBG12 v4l2_fourcc('B','A','1','2')

//GRBG 12bit

#define V4L2_PIX_FMT_SRGGB12 v4l2_fourcc('R','G','1','2')

//RGGB 12bit

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

#define MSM_V4L2_PIX_FMT_META

v4l2_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;

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的值是宏定义的,如下:

#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参数设置

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_type addr_type; //地址类型

enum msm_camera_i2c_data_type data_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设置

sensor工作时更新曝光设定需要操作许多寄存器(曝光时间,每帧行数,增益),这些必须在同一帧完成更新。这些寄存器都有双buffer,并具有按组更新的功能。表现为所有相关寄存器一起完成更新。

地址0x0104就是寄存器GRP_PARAM_HOLD的地址,当其寄存器的值设为1时,写入的寄存器数据被暂存的buffer寄存器中。

3.3 、Grouphold off设置

当寄存器GRP_PARAM_HOLD的值为0时,所需要寄存器的值会被同时更新,参数的变化会在同一帧生效。

3.4、 启动输出设置

MIPI数据包必须以在SoT(Start of Transmission)和EoT(End of

Transmission)之间发送。根据参考手册7.1,在正确的时间设定寄存器MODE_SEL(地址0x0100)为1时,开始进行数据输出。

启动数据输出流程分为两种情况:

情况1:在上电之后

(1)准备上电序列时序

(2)PLL锁相环参数设置

(3)初始化设置

(4)设置读取模式(起始/结束位置,大小,曝光时间,gain值)

(5)设置MIPI接口参数

(6)设置寄存器MODE_SEL的值为1,准备数据输出

在经过MIPI唤醒时间和初始化时间之后,开始输出第一帧图像数据。

情况2:在经过一次数据输出之后

(1)设置寄存器MODE_SEL的值为0,进入待命状态

(2)等待MIPI的FE package

(3)设置下一次数据输出模式

(4)设置寄存器MODE_SEL的值为1,准备数据输出

在经过MIPI唤醒时间和初始化时间之后,开始输出第一帧图像数据。

3.5、停止输出配置

在正确的时间设定MODE_SEL为0时,结束数据传输。

4、曝光设置

4.1 、曝光寄存器地址

结构体msm_sensor_exp_gain_info_t定义在sensor_lib.c中:

struct msm_sensor_exp_gain_info_t {

uint16_t coarse_int_time_addr; //粗曝光时间寄存器地址

uint16_t global_gain_addr; //模拟增益寄存器地址

uint16_t vert_offset; //曝光行偏置

};

粗曝光时间单位为lines,用于计算曝光时间,计算关系如下:

Tsh = Tline * (COARSE_INTEG_TIME + FINE_INTEG_TIME /

LINE_LENGTH_PCK)

其中细曝光时间单位为pixels,是定值,其寄存器为只读寄存器。Tline为行曝光时间,为时间单位。计算如下:

Tline = LINE_LENGTH_PCK * VTPXCK_period

曝光行偏置用于设定以下关系:

COARSE_INTEG_TIME ≤ frame_length_lines – vert_offset

4.2、 AEC参数设置

结构体sensor_aec_data_t定义在sensor_lib.h中:

typedef enum {

SENSOR_MODE_SNAPSHOT, //快照模式

SENSOR_MODE_RAW_SNAPSHOT, //raw图快照模式

SENSOR_MODE_PREVIEW, //预览模式

SENSOR_MODE_VIDEO, //视频录像模式

SENSOR_MODE_VIDEO_HD, //高清视频录像模式

SENSOR_MODE_HFR_60FPS, //60帧率HFR模式

SENSOR_MODE_HFR_90FPS, //90帧率 HFR模式

SENSOR_MODE_HFR_120FPS, //120帧率HFR模式

SENSOR_MODE_HFR_150FPS, //150帧率HFR模式

SENSOR_MODE_ZSL, //零秒快拍

SENSOR_MODE_INVALID, //非法

} sensor_mode_t;

typedef struct {

sensor_mode_t op_mode; //sensor 模式

uint32_t pixels_per_line;

//每一帧每一行多少个pixels

uint32_t lines_per_frame;

//每一帧多少行

uint32_t pclk; //vt_pixel_clk

uint32_t max_fps; //最大帧率

float digital_gain; //数字增益

float stored_digital_gain;

float max_gain; //最大数字增益

uint32_t max_linecount; //最大曝光行数

} sensor_aec_data_t;

4.3 、曝光增益gain值设置

AEC算法中模拟增益gain用于曝光计算,实际上必须把gain转换成寄存器gain去设置sensor。以下是imx230的gain转换函数:

模拟增益real_gain值的范围是1至8,

对应到reg_gain的范围为0到448。real_gain与reg_gain的关系为:

real_gain = 512 / (512 - reg_gain)

结构体sensor_exposure_info_t定义在sensor_lib.h中:

typedef struct {

uint16_t reg_gain; //寄存器gain值

uint16_t line_count; //曝光行数

float digital_gain;

float sensor_real_gain; //sensor的模拟gain值

float sensor_digital_gain;  //sensor的数字gain值

} sensor_exposure_info_t;

5、镜头参数设置

结构体sensor_lens_info_t定义在sensor_lib.c中:

typedef struct {

float focal_length; //焦距

float pix_size; //像素大小

float f_number;  //光圈

float total_f_dist;

float hor_view_angle; //水平视角

float ver_view_angle; //垂直视角

} sensor_lens_info_t;

6、Chromatix参数

每一种分辨率都必须有对应的chromatix库文件。这里对应2种分辨率,设置的是相应的库文件名称。

结构体sensor_lib_chromatix_t定义在sensor_lib.h中:

struct sensor_lib_chromatix_t {

char *common_chromatix;

char *camera_preview_chromatix;

char *camera_snapshot_chromatix;

char *camcorder_chromatix;

char *liveshot_chromatix;

};

其数据成员都是字符型指针,用来记录不同分辨率下不同模式的库文件名称。

7. MIPI接收器配置

7.1 、CSI lane参数配置

结构体 csi_lane_params_t定义在media/msm_camera.h中:

struct csi_lane_params_t {

uint16_t csi_lane_assign;  //端口映射设置

uint8_t csi_lane_mask; //标识哪一个lane被使用

uint8_t csi_if; //未使用

uint8_t csid_core[2];  //csid硬件选择

uint8_t csi_phy_sel;  //csi-phy设备选择

};

csi_lane_assign —— 有时候用户的MIPI

lanes可能使用不同与MSM参考设置的端口映射。比如,sensor的lane0连接到MSM的数据lane4等。对于这种情况,csi_lane_assign参数能设置正确的端口映射。csi_lane_assign是一个16bit的值,每位的含义参见下表。lane1用于MIPI时钟,客户不可用它来映射到任何数据lane。

csi_lane_mask —— 用于表示哪些lane被使用,这是一个8位值,每一位含义如下:

Bit position Represents

7:5 保留

4 数据lane4是否使用:

- 0 :不

- 1 :是

3 数据lane3是否使用:

- 0 :不

- 1 :是

2 数据lane2是否使用:

- 0 :不

- 1 :是

1 数据lane1是否使用:

- 0 :不

- 1 :是

注意:该位必须设置为1

0 数据lane0是否使用:

- 0 :不

- 1 :是

比如0x1F表示4条数据lane和时钟都被使用。

csi_if —— 暂不使用。

csid_core ——

设置哪个CSID硬件被该sensor使用。两个并发的sensor不能使用同一个CSID硬件。

csi_phy_sel ——

设置哪个CSI-PHY硬件被该sensor使用。对于每一个sensor来说必须是独一无二的,除非有额外的MIPI桥连接两个sensor到同一个PHY接口上。

7.2 、虚拟通道设置

CSI2传输的数据包包头部分的起始1byte为数据标志符(Data Identifier,

DI),由VC[7:6](Virtual Channel)和DT[5;0](Data

Type)组成。通过不同的VC和DT值来标志不同的数据流,占2个bit位的虚拟通道VC允许最多4个数据流交叉传输,其取值范围为0~3.

下表表示不同的TD的取值及对应的数据格式。

结构体

msm_camera_csid_vc_cfg用于保存虚拟通道的设置信息,在media/msm_camera.h中定义:

struct msm_camera_csid_vc_cfg {

uint8_t cid; //通道号

uint8_t dt; //数据类型

uint8_t decode_format; //解码格式

};

imx230的设置如下:

其数据类型和解码格式的值是宏定义的,其中数据类型的宏定义是根据上述DT表得来的。如下:

#define CSI_EMBED_DATA 0x12

#define CSI_RESERVED_DATA_0 0x13

#define CSI_YUV422_8 0x1E

#define CSI_RAW8 0x2A

#define CSI_RAW10 0x2B

#define CSI_RAW12 0x2C

#define CSI_DECODE_6BIT 0

#define CSI_DECODE_8BIT 1

#define CSI_DECODE_10BIT 2

#define CSI_DECODE_DPCM_10_8_10 5

7.3 、数据流设置

typedef struct _sensor_stream_info_t {

uint16_t vc_cfg_size;

struct msm_camera_csid_vc_cfg *vc_cfg;

//虚拟通道设置

struct sensor_pix_fmt_info_t

*pix_fmt_fourcc;//像素格式

} sensor_stream_info_t;

typedef struct _sensor_stream_info_array_t {

sensor_stream_info_t

*sensor_stream_info;

uint16_t size;

} sensor_stream_info_array_t;

7.4、 CSID和CSI-PHY参数设置

struct msm_camera_csid_lut_params {

uint8_t num_cid; //虚拟通道个数

struct msm_camera_csid_vc_cfg *vc_cfg;  //虚拟通道参数

};

struct msm_camera_csid_params {

uint8_t lane_cnt; //使用lane的数目

uint16_t lane_assign;

uint8_t phy_sel;

struct msm_camera_csid_lut_params lut_params;

};

struct msm_camera_csiphy_params {

uint8_t lane_cnt;

uint8_t settle_cnt;

uint16_t lane_mask;

uint8_t combo_mode;

uint8_t csid_core;

};

struct msm_camera_csi2_params {

struct msm_camera_csid_params csid_params; //CSID参数

struct msm_camera_csiphy_params csiphy_params;

//CSI-PHY参数

};

lane_cnt ——有多少数据 lane 用于数据传输. 该值必须在 sensor 最大能力范围内,而且sensor

寄存器设置必须与该 lane 数匹配.

settle_cnt ——该值须和 sensor 的特性匹配, 保证 sensor 的 MIPI 传输和 MSM 的

MIPI 接收能同步.

客户可以对不同的分辨率模式使用不同CSI 参数设置。imx230采用两种分辨率,但是使用相同的CSI设置。

8、imx230_ofilm_open_lib

在imx230_lib.c中,最后将所有的参数设置都放入sensor_lib_t类型的结构体sensor_lib_ptr中,定义函数imx230_ofilm_open_lib()来返回sensor_lib_ptr的地址,供外界调用。

结构体sensor_lib_t涵盖了关于camera设置的几乎全部信息。如下:

typedef struct {

struct msm_camera_sensor_slave_info

*sensor_slave_info;

struct msm_sensor_init_params

*sensor_init_params;

char* actuator_name;

char* eeprom_name;

sensor_output_t *sensor_output;

struct msm_sensor_output_reg_addr_t

*output_reg_addr;

struct msm_sensor_exp_gain_info_t

*exp_gain_info;

sensor_aec_data_t *aec_info;

uint16_t snapshot_exp_wait_frames;

uint16_t sensor_num_frame_skip;

uint16_t sensor_num_HDR_frame_skip;

uint32_t

sensor_max_pipeline_frame_delay;

uint16_t exposure_table_size;

sensor_lens_info_t

*default_lens_info;

struct csi_lane_params_t

*csi_lane_params;

struct msm_camera_csid_vc_cfg

*csi_cid_params;

sensor_stream_info_array_t

*sensor_stream_info_array;

uint16_t csi_cid_params_size;

struct sensor_lib_reg_settings_array

*init_settings_array;

struct msm_camera_i2c_reg_setting

*start_settings;

struct msm_camera_i2c_reg_setting

*stop_settings;

struct msm_camera_i2c_reg_setting

*groupon_settings;

struct msm_camera_i2c_reg_setting

*groupoff_settings;

struct sensor_res_cfg_table_t

*sensor_res_cfg_table;

struct sensor_lib_reg_settings_array

*res_settings_array;

struct sensor_lib_out_info_array

*out_info_array;

struct sensor_lib_csi_params_array

*csi_params_array;

struct sensor_lib_crop_params_array

*crop_params_array;

struct sensor_lib_chromatix_array

*chromatix_array;

struct sensor_lib_meta_data_info_array

*meta_data_out_info_array;

sensor_exposure_table_t

*exposure_func_table;

sensor_exposure_info_t exposure_info;

uint8_t sync_exp_gain;

sensor_video_hdr_table_t

*video_hdr_awb_lsc_func_table;

uint8_t scale_tbl_cnt;

int32_t

(*get_scale_tbl)(msm_sensor_dimension_t *);

uint32_t

*sensor_supported_scene_mode;

uint32_t

*sensor_supported_effect_mode;

uint32_t

sensor_max_immediate_frame_delay;

void *data;

} sensor_lib_t;

android4.3.0 camera,4.3、高通camera驱动简析相关推荐

  1. 【高通SDM660平台 Android 10.0】(21) --- 高通Camera persist使用手册

    在网上看到一位兄弟针对高通平台 camera 相关属性总结的特别好,特意转载过来备份下,以供后续调试使用. 原文: <高通Camera persist使用手册> 基于MSM8996平台PL ...

  2. 高通camera调试

    高通camera驱动分析 ./qcom/proprietary/mm-still/codec_v1/omx/jpeg_encoder/Android.mk:15:CHROMATIX_VERSION : ...

  3. 高通Camera数字成像系统简介

    转载: https://deepinout.com/qcom-camx-chi/qcom-camx-system-intro.html 整理:小驰笔记 相机的硬件层,作为整个框架的最底层,通过硬件模块 ...

  4. 高通Camera 软件工程师的成长之路

    本文以个人的工作学习经历来描述一 Camera 软件工程师的披荆斩棘之路,时间从大学开始,以至任职于高通 Camera 软件工程师结束,杂以本人学习过程当中的一系列学习笔记和博客文章,绝对是干货满满, ...

  5. 高通Camera IFE时钟配置

    本文主要分享高通camera驱动中minHorizontalBlanking(最小水平消隐)和minVerticalBlanking(最小垂直消隐)配置项的计算方法: IFE时钟频率由以下sensor ...

  6. 【Android驱动】高通Camera代码probe流程

    参看博客: Android camera架构: 基于qualcomm平台的camera 驱动详解_Winston-CSDN博客_高通camera驱动架构 Android Camera MSM HAL: ...

  7. 高通 camera CTS Verify FOV calibration debug

    高通 camera CTS Verify FOV calibration debug 背景 分析 如何修改 总结 背景 CTS 手动测试中 有Camera FOV calibration的测试. MT ...

  8. 高通 Camera HAL3:项目开发技术点总结

    做高通 Camera HAL3开发的一些技术点的总结.整理. 做个记录,方便后续查阅. 1.目录.so.配置文件 productName是项目名 out Target路径:\out\target\pr ...

  9. 高通 Camera HAL3:CAMX、CHI-CDK 详解

    网上关于高通CameraHAL3的介绍文档不多,之前做高通CameraHAL3的一些总结.整理,杂乱了一点,将就着看吧. 一.初步认知 高通CameraHAL3的架构很庞大,代码量也很巨大. 先对CA ...

  10. 高通平台开发系列讲解(外设篇)高通Camera软件架构

    文章目录 一.高通Camera软件架构 1.1.Camera App 1.2.Camera Framework 1.3.Camera Service 1.4.Camera Provider 1.5.C ...

最新文章

  1. 用Matplotlib跟踪疫情实时监控2019-nCoV
  2. linux处理机调度实验报告,处理机调度试验
  3. matlab用循环批量生成多个变量,神奇的eval()函数
  4. 交换机入门配置:IP和远程登录功能
  5. [CF]Round514
  6. PDA手持终端WinCE系统连接SqlServer数据库
  7. python步长为负时的情况
  8. yjv是电缆还是电线_2019最新电缆载流量对照表,不用每次都百度了!
  9. ICCV 2019 中国论文数量超美国,商汤57篇论文入选!
  10. dplayer js控制 自动全屏_vue 中使用video.js 实现m3u8视频播放格式
  11. C语言实验报告(通用)
  12. 华为USG6000基本内容总结
  13. 什么是ANC主动降噪技术?
  14. 安卓导入自定义下载矢量图标
  15. DMA PL330相关总结
  16. java祖冲之加密算法_对称加密和非对称加密
  17. 【Python异常】 NPM创建Vue项目遇到ERROR command failed: npm install --loglevel error
  18. Linux软件raid删除
  19. 【QMK键盘】简单的QMK固件键盘环境搭建
  20. linux内核hz,linux内核中的HZ介绍

热门文章

  1. 【ios开发/Xcode】实现简易省会问答
  2. linux下比较文件并输出,Linux使用diff命令比较文件找出文件之间相同的部分
  3. Java内部类手机专卖店_Java(20)内部类
  4. libcurl远程获取文件大小源码
  5. 与 Scott Guthrie 一道感受技术激情 1月13日于北京
  6. mybatis批量更新的两种实现方式
  7. djangorestframework怎么这么好用!
  8. codevs1258 关路灯(☆区间dp)
  9. ASCII、Unicode、GBK和UTF-8字符编码的区别联系
  10. 使用Node.js快速搭建WebSocket server