高通camera驱动分析

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_typeseq_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{
/* mask of modes supported: 2D, 3D */
int modes_supported;               //支持camera的模式
/* sensor position: front, back */
enum camb_position_tposition; //sensor的位置
/* sensor mount angle*/
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中:
/*MOUNT ANGLE >= to this value is considered invalid in sensor lib */
#define SENSOR_MOUNTANGLE_360360         //360度
/* Sensor mount angle. */
#define SENSOR_MOUNTANGLE_00 //0度
#define SENSOR_MOUNTANGLE_9090 //90度
#define SENSOR_MOUNTANGLE_180180         //180度

#define SENSOR_MOUNTANGLE_270270         //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_toutput_format; //输出格式
sensor_connection_mode_tconnection_mode; //连接模式
sensor_raw_output_traw_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中,如下:

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

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