Home | History | Annotate | Download | only in media
      1 #ifndef __LINUX_MSM_CAM_SENSOR_H
      2 #define __LINUX_MSM_CAM_SENSOR_H
      3 
      4 #ifdef MSM_CAMERA_BIONIC
      5 #include <sys/types.h>
      6 #endif
      7 #include <linux/types.h>
      8 #include <linux/v4l2-mediabus.h>
      9 #include <linux/i2c.h>
     10 
     11 #define I2C_SEQ_REG_SETTING_MAX   5
     12 #define I2C_SEQ_REG_DATA_MAX      20
     13 #define MAX_CID                   16
     14 
     15 #define MSM_SENSOR_MCLK_8HZ   8000000
     16 #define MSM_SENSOR_MCLK_16HZ  16000000
     17 #define MSM_SENSOR_MCLK_24HZ  24000000
     18 
     19 #define GPIO_OUT_LOW          (0 << 1)
     20 #define GPIO_OUT_HIGH         (1 << 1)
     21 
     22 #define CSI_EMBED_DATA        0x12
     23 #define CSI_RESERVED_DATA_0   0x13
     24 #define CSI_YUV422_8          0x1E
     25 #define CSI_RAW8              0x2A
     26 #define CSI_RAW10             0x2B
     27 #define CSI_RAW12             0x2C
     28 
     29 #define CSI_DECODE_6BIT         0
     30 #define CSI_DECODE_8BIT         1
     31 #define CSI_DECODE_10BIT        2
     32 #define CSI_DECODE_DPCM_10_8_10 5
     33 
     34 #define MAX_SENSOR_NAME 32
     35 
     36 #define MAX_ACT_MOD_NAME_SIZE 32
     37 #define MAX_ACT_NAME_SIZE 32
     38 #define NUM_ACTUATOR_DIR 2
     39 #define MAX_ACTUATOR_SCENARIO 8
     40 #define MAX_ACTUATOR_REGION 5
     41 #define MAX_ACTUATOR_INIT_SET 12
     42 #define MAX_ACTUATOR_REG_TBL_SIZE 8
     43 
     44 #define MOVE_NEAR 0
     45 #define MOVE_FAR  1
     46 
     47 #define MAX_EEPROM_NAME 32
     48 
     49 enum msm_camera_i2c_reg_addr_type {
     50 	MSM_CAMERA_I2C_BYTE_ADDR = 1,
     51 	MSM_CAMERA_I2C_WORD_ADDR,
     52 	MSM_CAMERA_I2C_3B_ADDR,
     53 };
     54 
     55 enum msm_camera_i2c_data_type {
     56 	MSM_CAMERA_I2C_BYTE_DATA = 1,
     57 	MSM_CAMERA_I2C_WORD_DATA,
     58 	MSM_CAMERA_I2C_SET_BYTE_MASK,
     59 	MSM_CAMERA_I2C_UNSET_BYTE_MASK,
     60 	MSM_CAMERA_I2C_SET_WORD_MASK,
     61 	MSM_CAMERA_I2C_UNSET_WORD_MASK,
     62 	MSM_CAMERA_I2C_SET_BYTE_WRITE_MASK_DATA,
     63 };
     64 
     65 enum msm_sensor_power_seq_type_t {
     66 	SENSOR_CLK,
     67 	SENSOR_GPIO,
     68 	SENSOR_VREG,
     69 	SENSOR_I2C_MUX,
     70 };
     71 
     72 enum msm_sensor_clk_type_t {
     73 	SENSOR_CAM_MCLK,
     74 	SENSOR_CAM_CLK,
     75 	SENSOR_CAM_CLK_MAX,
     76 };
     77 
     78 enum msm_sensor_power_seq_gpio_t {
     79 	SENSOR_GPIO_RESET,
     80 	SENSOR_GPIO_STANDBY,
     81 	SENSOR_GPIO_VANA,
     82 	SENSOR_GPIO_VDIG,
     83 	SENSOR_GPIO_VIO,
     84 	SENSOR_GPIO_VCM,
     85 	SENSOR_GPIO_OIS_LDO_EN,
     86 	SENSOR_GPIO_OIS_RESET,
     87 	SENSOR_GPIO_MAX,
     88 };
     89 
     90 enum msm_camera_vreg_name_t {
     91 	CAM_VDIG,
     92 	CAM_VIO,
     93 	CAM_VANA,
     94 	CAM_VAF,
     95 	CAM_VREG_MAX,
     96 };
     97 
     98 enum msm_sensor_resolution_t {
     99 	MSM_SENSOR_RES_FULL,
    100 	MSM_SENSOR_RES_QTR,
    101 	MSM_SENSOR_RES_2,
    102 	MSM_SENSOR_RES_3,
    103 	MSM_SENSOR_RES_4,
    104 	MSM_SENSOR_RES_5,
    105 	MSM_SENSOR_RES_6,
    106 	MSM_SENSOR_RES_7,
    107 	MSM_SENSOR_INVALID_RES,
    108 };
    109 
    110 enum sensor_sub_module_t {
    111 	SUB_MODULE_SENSOR,
    112 	SUB_MODULE_CHROMATIX,
    113 	SUB_MODULE_ACTUATOR,
    114 	SUB_MODULE_EEPROM,
    115 	SUB_MODULE_LED_FLASH,
    116 	SUB_MODULE_STROBE_FLASH,
    117 	SUB_MODULE_CSID,
    118 	SUB_MODULE_CSID_3D,
    119 	SUB_MODULE_CSIPHY,
    120 	SUB_MODULE_CSIPHY_3D,
    121 	SUB_MODULE_MAX,
    122 };
    123 
    124 enum csid_cfg_type_t {
    125 	CSID_INIT,
    126 	CSID_CFG,
    127 	CSID_RELEASE,
    128 };
    129 
    130 enum csiphy_cfg_type_t {
    131 	CSIPHY_INIT,
    132 	CSIPHY_CFG,
    133 	CSIPHY_RELEASE,
    134 };
    135 
    136 enum camera_vreg_type {
    137 	REG_LDO,
    138 	REG_VS,
    139 	REG_GPIO,
    140 };
    141 
    142 struct msm_sensor_power_setting {
    143 	enum msm_sensor_power_seq_type_t seq_type;
    144 	uint16_t seq_val;
    145 	long config_val;
    146 	uint16_t delay;
    147 	void *data[10];
    148 };
    149 
    150 struct msm_sensor_power_setting_array {
    151 	struct msm_sensor_power_setting *power_setting;
    152 	uint16_t size;
    153 };
    154 
    155 struct msm_sensor_id_info_t {
    156 	uint16_t sensor_id_reg_addr;
    157 	uint16_t sensor_id;
    158 };
    159 
    160 struct msm_camera_sensor_slave_info {
    161 	uint16_t slave_addr;
    162 	enum msm_camera_i2c_reg_addr_type addr_type;
    163 	struct msm_sensor_id_info_t sensor_id_info;
    164 	struct msm_sensor_power_setting_array power_setting_array;
    165 };
    166 
    167 struct msm_camera_i2c_reg_array {
    168 	uint16_t reg_addr;
    169 	uint16_t reg_data;
    170 };
    171 
    172 struct msm_camera_i2c_reg_setting {
    173 	struct msm_camera_i2c_reg_array *reg_setting;
    174 	uint16_t size;
    175 	enum msm_camera_i2c_reg_addr_type addr_type;
    176 	enum msm_camera_i2c_data_type data_type;
    177 	uint16_t delay;
    178 };
    179 
    180 struct msm_camera_i2c_seq_reg_array {
    181 	uint16_t reg_addr;
    182 	uint8_t reg_data[I2C_SEQ_REG_DATA_MAX];
    183 	uint16_t reg_data_size;
    184 };
    185 
    186 struct msm_camera_i2c_seq_reg_setting {
    187 	struct msm_camera_i2c_seq_reg_array *reg_setting;
    188 	uint16_t size;
    189 	enum msm_camera_i2c_reg_addr_type addr_type;
    190 	uint16_t delay;
    191 };
    192 
    193 struct msm_camera_i2c_array_write_config {
    194 	struct msm_camera_i2c_reg_setting conf_array;
    195 	uint16_t slave_addr;
    196 };
    197 
    198 struct msm_camera_i2c_read_config {
    199 	uint16_t slave_addr;
    200 	uint16_t reg_addr;
    201 	enum msm_camera_i2c_data_type data_type;
    202 	uint16_t *data;
    203 };
    204 
    205 struct msm_camera_csid_vc_cfg {
    206 	uint8_t cid;
    207 	uint8_t dt;
    208 	uint8_t decode_format;
    209 };
    210 
    211 struct msm_camera_csid_lut_params {
    212 	uint8_t num_cid;
    213 	struct msm_camera_csid_vc_cfg *vc_cfg[MAX_CID];
    214 };
    215 
    216 struct msm_camera_csid_params {
    217 	uint8_t lane_cnt;
    218 	uint16_t lane_assign;
    219 	uint8_t phy_sel;
    220 	struct msm_camera_csid_lut_params lut_params;
    221 };
    222 
    223 struct msm_camera_csiphy_params {
    224 	uint8_t lane_cnt;
    225 	uint8_t settle_cnt;
    226 	uint16_t lane_mask;
    227 	uint8_t combo_mode;
    228 	uint8_t csid_core;
    229 };
    230 
    231 struct msm_camera_csi2_params {
    232 	struct msm_camera_csid_params csid_params;
    233 	struct msm_camera_csiphy_params csiphy_params;
    234 };
    235 
    236 struct msm_camera_csi_lane_params {
    237 	uint16_t csi_lane_assign;
    238 	uint16_t csi_lane_mask;
    239 };
    240 
    241 struct csi_lane_params_t {
    242 	uint16_t csi_lane_assign;
    243 	uint8_t csi_lane_mask;
    244 	uint8_t csi_if;
    245 	uint8_t csid_core[2];
    246 	uint8_t csi_phy_sel;
    247 };
    248 
    249 struct msm_sensor_info_t {
    250 	char sensor_name[MAX_SENSOR_NAME];
    251 	int32_t    session_id;
    252 	int32_t     subdev_id[SUB_MODULE_MAX];
    253 };
    254 
    255 struct msm_sensor_ois_info_t {
    256 	char ois_provider[MAX_SENSOR_NAME];
    257 	int16_t gyro[2];
    258 	int16_t target[2];
    259 	int16_t hall[2];
    260 	uint8_t is_stable;
    261 };
    262 
    263 enum ois_mode_t {
    264 	OIS_MODE_PREVIEW_CAPTURE,
    265 	OIS_MODE_VIDEO,
    266 	OIS_MODE_CAPTURE,
    267 	OIS_MODE_CENTERING_ONLY,
    268 	OIS_MODE_CENTERING_OFF
    269 };
    270 
    271 enum ois_ver_t {
    272 	OIS_VER_RELEASE,
    273 	OIS_VER_CALIBRATION,
    274 	OIS_VER_DEBUG
    275 };
    276 
    277 struct camera_vreg_t {
    278 	const char *reg_name;
    279 	enum camera_vreg_type type;
    280 	int min_voltage;
    281 	int max_voltage;
    282 	int op_mode;
    283 	uint32_t delay;
    284 };
    285 
    286 enum camb_position_t {
    287 	BACK_CAMERA_B,
    288 	FRONT_CAMERA_B,
    289 };
    290 
    291 enum camerab_mode_t {
    292 	CAMERA_MODE_2D_B = (1<<0),
    293 	CAMERA_MODE_3D_B = (1<<1)
    294 };
    295 
    296 struct msm_sensor_init_params {
    297 	/* mask of modes supported: 2D, 3D */
    298 	int                 modes_supported;
    299 	/* sensor position: front, back */
    300 	enum camb_position_t position;
    301 	/* sensor mount angle */
    302 	uint32_t            sensor_mount_angle;
    303 	int                 ois_supported;
    304 };
    305 
    306 struct sensorb_cfg_data {
    307 	int cfgtype;
    308 	union {
    309 		struct msm_sensor_info_t      sensor_info;
    310 		struct msm_sensor_init_params sensor_init_params;
    311 		struct msm_sensor_ois_info_t  ois_info;
    312 		void                         *setting;
    313 	} cfg;
    314 };
    315 
    316 struct csid_cfg_data {
    317 	enum csid_cfg_type_t cfgtype;
    318 	union {
    319 		uint32_t csid_version;
    320 		struct msm_camera_csid_params *csid_params;
    321 	} cfg;
    322 };
    323 
    324 struct csiphy_cfg_data {
    325 	enum csiphy_cfg_type_t cfgtype;
    326 	union {
    327 		struct msm_camera_csiphy_params *csiphy_params;
    328 		struct msm_camera_csi_lane_params *csi_lane_params;
    329 	} cfg;
    330 };
    331 
    332 enum eeprom_cfg_type_t {
    333 	CFG_EEPROM_GET_INFO,
    334 	CFG_EEPROM_GET_CAL_DATA,
    335 	CFG_EEPROM_READ_CAL_DATA,
    336 	CFG_EEPROM_WRITE_DATA,
    337 };
    338 struct eeprom_get_t {
    339 	uint16_t num_bytes;
    340 };
    341 
    342 struct eeprom_read_t {
    343 	uint8_t *dbuffer;
    344 	uint16_t num_bytes;
    345 };
    346 
    347 struct eeprom_write_t {
    348 	uint8_t *dbuffer;
    349 	uint16_t num_bytes;
    350 };
    351 
    352 struct msm_eeprom_cfg_data {
    353 	enum eeprom_cfg_type_t cfgtype;
    354 	uint8_t is_supported;
    355 	union {
    356 		char eeprom_name[MAX_SENSOR_NAME];
    357 		struct eeprom_get_t get_data;
    358 		struct eeprom_read_t read_data;
    359 		struct eeprom_write_t write_data;
    360 	} cfg;
    361 };
    362 
    363 enum msm_sensor_cfg_type_t {
    364 	CFG_SET_SLAVE_INFO,
    365 	CFG_SLAVE_READ_I2C,
    366 	CFG_WRITE_I2C_ARRAY,
    367 	CFG_SLAVE_WRITE_I2C_ARRAY,
    368 	CFG_WRITE_I2C_SEQ_ARRAY,
    369 	CFG_POWER_UP,
    370 	CFG_POWER_DOWN,
    371 	CFG_SET_STOP_STREAM_SETTING,
    372 	CFG_GET_SENSOR_INFO,
    373 	CFG_GET_SENSOR_INIT_PARAMS,
    374 	CFG_SET_INIT_SETTING,
    375 	CFG_SET_RESOLUTION,
    376 	CFG_SET_STOP_STREAM,
    377 	CFG_SET_START_STREAM,
    378 	CFG_OIS_ON,
    379 	CFG_OIS_OFF,
    380 	CFG_GET_OIS_INFO,
    381 	CFG_SET_OIS_MODE,
    382 	CFG_OIS_MOVE_LENS
    383 };
    384 
    385 enum msm_actuator_cfg_type_t {
    386 	CFG_GET_ACTUATOR_INFO,
    387 	CFG_SET_ACTUATOR_INFO,
    388 	CFG_SET_DEFAULT_FOCUS,
    389 	CFG_MOVE_FOCUS,
    390 };
    391 
    392 enum actuator_type {
    393 	ACTUATOR_VCM,
    394 	ACTUATOR_PIEZO,
    395 };
    396 
    397 enum msm_actuator_data_type {
    398 	MSM_ACTUATOR_BYTE_DATA = 1,
    399 	MSM_ACTUATOR_WORD_DATA,
    400 };
    401 
    402 enum msm_actuator_addr_type {
    403 	MSM_ACTUATOR_BYTE_ADDR = 1,
    404 	MSM_ACTUATOR_WORD_ADDR,
    405 };
    406 
    407 struct reg_settings_t {
    408 	uint16_t reg_addr;
    409 	uint16_t reg_data;
    410 };
    411 
    412 struct region_params_t {
    413 	/* [0] = ForwardDirection Macro boundary
    414 	   [1] = ReverseDirection Inf boundary
    415         */
    416 	uint16_t step_bound[2];
    417 	uint16_t code_per_step;
    418 };
    419 
    420 struct damping_params_t {
    421 	uint32_t damping_step;
    422 	uint32_t damping_delay;
    423 	uint32_t hw_params;
    424 };
    425 
    426 struct msm_actuator_move_params_t {
    427 	int8_t dir;
    428 	int8_t sign_dir;
    429 	int16_t dest_step_pos;
    430 	int32_t num_steps;
    431 	int32_t num_steps_inf_pos;
    432 	struct damping_params_t *ringing_params;
    433 };
    434 
    435 struct msm_actuator_tuning_params_t {
    436 	int16_t initial_code;
    437 	uint16_t pwd_step;
    438 	uint16_t region_size;
    439 	uint32_t total_steps;
    440 	struct region_params_t *region_params;
    441 };
    442 
    443 struct msm_actuator_params_t {
    444 	enum actuator_type act_type;
    445 	uint8_t reg_tbl_size;
    446 	uint16_t data_size;
    447 	uint16_t init_setting_size;
    448 	uint32_t i2c_addr;
    449 	enum msm_actuator_addr_type i2c_addr_type;
    450 	enum msm_actuator_data_type i2c_data_type;
    451 	struct msm_actuator_reg_params_t *reg_tbl_params;
    452 	struct reg_settings_t *init_settings;
    453 };
    454 
    455 struct msm_actuator_set_info_t {
    456 	struct msm_actuator_params_t actuator_params;
    457 	struct msm_actuator_tuning_params_t af_tuning_params;
    458 };
    459 
    460 struct msm_actuator_get_info_t {
    461 	uint32_t focal_length_num;
    462 	uint32_t focal_length_den;
    463 	uint32_t f_number_num;
    464 	uint32_t f_number_den;
    465 	uint32_t f_pix_num;
    466 	uint32_t f_pix_den;
    467 	uint32_t total_f_dist_num;
    468 	uint32_t total_f_dist_den;
    469 	uint32_t hor_view_angle_num;
    470 	uint32_t hor_view_angle_den;
    471 	uint32_t ver_view_angle_num;
    472 	uint32_t ver_view_angle_den;
    473 };
    474 
    475 enum af_camera_name {
    476 	ACTUATOR_MAIN_CAM_0,
    477 	ACTUATOR_MAIN_CAM_1,
    478 	ACTUATOR_MAIN_CAM_2,
    479 	ACTUATOR_MAIN_CAM_3,
    480 	ACTUATOR_MAIN_CAM_4,
    481 	ACTUATOR_MAIN_CAM_5,
    482 	ACTUATOR_WEB_CAM_0,
    483 	ACTUATOR_WEB_CAM_1,
    484 	ACTUATOR_WEB_CAM_2,
    485 };
    486 
    487 struct msm_actuator_cfg_data {
    488 	int cfgtype;
    489 	uint8_t is_af_supported;
    490 	union {
    491 		struct msm_actuator_move_params_t move;
    492 		struct msm_actuator_set_info_t set_info;
    493 		struct msm_actuator_get_info_t get_info;
    494 		enum af_camera_name cam_name;
    495 	} cfg;
    496 };
    497 
    498 enum msm_actuator_write_type {
    499 	MSM_ACTUATOR_WRITE_HW_DAMP,
    500 	MSM_ACTUATOR_WRITE_DAC,
    501 };
    502 
    503 struct msm_actuator_reg_params_t {
    504 	enum msm_actuator_write_type reg_write_type;
    505 	uint32_t hw_mask;
    506 	uint16_t reg_addr;
    507 	uint16_t hw_shift;
    508 	uint16_t data_shift;
    509 };
    510 
    511 enum msm_camera_led_config_t {
    512 	MSM_CAMERA_LED_OFF,
    513 	MSM_CAMERA_LED_LOW,
    514 	MSM_CAMERA_LED_HIGH,
    515 	MSM_CAMERA_LED_INIT,
    516 	MSM_CAMERA_LED_RELEASE,
    517 };
    518 
    519 struct msm_camera_led_cfg_t {
    520 	enum msm_camera_led_config_t cfgtype;
    521 };
    522 
    523 #define VIDIOC_MSM_SENSOR_CFG \
    524 	_IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct sensorb_cfg_data)
    525 
    526 #define VIDIOC_MSM_SENSOR_RELEASE \
    527 	_IO('V', BASE_VIDIOC_PRIVATE + 2)
    528 
    529 #define VIDIOC_MSM_SENSOR_GET_SUBDEV_ID \
    530 	_IOWR('V', BASE_VIDIOC_PRIVATE + 3, uint32_t)
    531 
    532 #define VIDIOC_MSM_CSIPHY_IO_CFG \
    533 	_IOWR('V', BASE_VIDIOC_PRIVATE + 4, struct csid_cfg_data)
    534 
    535 #define VIDIOC_MSM_CSID_IO_CFG \
    536 	_IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct csiphy_cfg_data)
    537 
    538 #define VIDIOC_MSM_ACTUATOR_CFG \
    539 	_IOWR('V', BASE_VIDIOC_PRIVATE + 6, struct msm_actuator_cfg_data)
    540 
    541 #define VIDIOC_MSM_FLASH_LED_DATA_CFG \
    542 	_IOWR('V', BASE_VIDIOC_PRIVATE + 7, struct msm_camera_led_cfg_t)
    543 
    544 #define VIDIOC_MSM_EEPROM_CFG \
    545 	_IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct msm_eeprom_cfg_data)
    546 
    547 #define MSM_V4L2_PIX_FMT_META v4l2_fourcc('M', 'E', 'T', 'A') /* META */
    548 
    549 #endif /* __LINUX_MSM_CAM_SENSOR_H */
    550