• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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