blob: bce6af3c6caa2a3a40bb68f470f244b10335830e [file] [log] [blame]
Shuzhen Wangb4f4c922013-01-08 14:32:08 -08001#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
Sreesudhan Ramakrish Ramkumar6acf6252013-01-26 21:26:13 -080036#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
Jeyaprakash Soundrapandian651d64e2013-03-11 12:04:55 -070047#define MAX_EEPROM_NAME 32
48
Shuzhen Wangb4f4c922013-01-08 14:32:08 -080049enum msm_camera_i2c_reg_addr_type {
50 MSM_CAMERA_I2C_BYTE_ADDR = 1,
51 MSM_CAMERA_I2C_WORD_ADDR,
Junjie Wu1d4e60d2013-03-13 20:17:15 -070052 MSM_CAMERA_I2C_3B_ADDR,
Shuzhen Wangb4f4c922013-01-08 14:32:08 -080053};
54
55enum 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
65enum msm_sensor_power_seq_type_t {
66 SENSOR_CLK,
67 SENSOR_GPIO,
68 SENSOR_VREG,
69 SENSOR_I2C_MUX,
70};
71
72enum msm_sensor_clk_type_t {
73 SENSOR_CAM_MCLK,
74 SENSOR_CAM_CLK,
75 SENSOR_CAM_CLK_MAX,
76};
77
78enum msm_sensor_power_seq_gpio_t {
79 SENSOR_GPIO_RESET,
80 SENSOR_GPIO_STANDBY,
81 SENSOR_GPIO_MAX,
82};
83
84enum msm_camera_vreg_name_t {
85 CAM_VDIG,
86 CAM_VIO,
87 CAM_VANA,
88 CAM_VAF,
89 CAM_VREG_MAX,
90};
91
92enum msm_sensor_resolution_t {
93 MSM_SENSOR_RES_FULL,
94 MSM_SENSOR_RES_QTR,
95 MSM_SENSOR_RES_2,
96 MSM_SENSOR_RES_3,
97 MSM_SENSOR_RES_4,
98 MSM_SENSOR_RES_5,
99 MSM_SENSOR_RES_6,
100 MSM_SENSOR_RES_7,
101 MSM_SENSOR_INVALID_RES,
102};
103
104enum sensor_sub_module_t {
105 SUB_MODULE_SENSOR,
106 SUB_MODULE_CHROMATIX,
107 SUB_MODULE_ACTUATOR,
108 SUB_MODULE_EEPROM,
109 SUB_MODULE_LED_FLASH,
110 SUB_MODULE_STROBE_FLASH,
111 SUB_MODULE_CSIPHY,
112 SUB_MODULE_CSIPHY_3D,
113 SUB_MODULE_CSID,
114 SUB_MODULE_CSID_3D,
115 SUB_MODULE_MAX,
116};
117
118enum csid_cfg_type_t {
119 CSID_INIT,
120 CSID_CFG,
121 CSID_RELEASE,
122};
123
124enum csiphy_cfg_type_t {
125 CSIPHY_INIT,
126 CSIPHY_CFG,
127 CSIPHY_RELEASE,
128};
129
130enum camera_vreg_type {
131 REG_LDO,
132 REG_VS,
133 REG_GPIO,
134};
135
136struct msm_sensor_power_setting {
137 enum msm_sensor_power_seq_type_t seq_type;
138 uint16_t seq_val;
139 long config_val;
140 uint16_t delay;
141 void *data[10];
142};
143
144struct msm_sensor_power_setting_array {
145 struct msm_sensor_power_setting *power_setting;
146 uint16_t size;
147};
148
149struct msm_sensor_id_info_t {
150 uint16_t sensor_id_reg_addr;
151 uint16_t sensor_id;
152};
153
154struct msm_camera_sensor_slave_info {
155 uint16_t slave_addr;
156 enum msm_camera_i2c_reg_addr_type addr_type;
157 struct msm_sensor_id_info_t sensor_id_info;
158 struct msm_sensor_power_setting_array power_setting_array;
159};
160
161struct msm_camera_i2c_reg_array {
162 uint16_t reg_addr;
163 uint16_t reg_data;
164};
165
166struct msm_camera_i2c_reg_setting {
167 struct msm_camera_i2c_reg_array *reg_setting;
168 uint16_t size;
169 enum msm_camera_i2c_reg_addr_type addr_type;
170 enum msm_camera_i2c_data_type data_type;
171 uint16_t delay;
172};
173
174struct msm_camera_i2c_seq_reg_array {
175 uint16_t reg_addr;
176 uint8_t reg_data[I2C_SEQ_REG_DATA_MAX];
177 uint16_t reg_data_size;
178};
179
180struct msm_camera_i2c_seq_reg_setting {
181 struct msm_camera_i2c_seq_reg_array *reg_setting;
182 uint16_t size;
183 enum msm_camera_i2c_reg_addr_type addr_type;
184 uint16_t delay;
185};
186
187struct msm_camera_csid_vc_cfg {
188 uint8_t cid;
189 uint8_t dt;
190 uint8_t decode_format;
191};
192
193struct msm_camera_csid_lut_params {
194 uint8_t num_cid;
195 struct msm_camera_csid_vc_cfg *vc_cfg[MAX_CID];
196};
197
198struct msm_camera_csid_params {
199 uint8_t lane_cnt;
200 uint16_t lane_assign;
201 uint8_t phy_sel;
202 struct msm_camera_csid_lut_params lut_params;
203};
204
205struct msm_camera_csiphy_params {
206 uint8_t lane_cnt;
207 uint8_t settle_cnt;
208 uint16_t lane_mask;
209 uint8_t combo_mode;
210};
211
212struct msm_camera_csi2_params {
213 struct msm_camera_csid_params csid_params;
214 struct msm_camera_csiphy_params csiphy_params;
215};
216
217struct msm_camera_csi_lane_params {
218 uint16_t csi_lane_assign;
219 uint16_t csi_lane_mask;
220};
221
222struct csi_lane_params_t {
223 uint16_t csi_lane_assign;
224 uint8_t csi_lane_mask;
225 uint8_t csi_if;
226 uint8_t csid_core[2];
227 uint8_t csi_phy_sel;
228};
229
230struct msm_sensor_info_t {
231 char sensor_name[MAX_SENSOR_NAME];
232 int32_t session_id;
233 int32_t subdev_id[SUB_MODULE_MAX];
234};
235
236struct camera_vreg_t {
237 const char *reg_name;
238 enum camera_vreg_type type;
239 int min_voltage;
240 int max_voltage;
241 int op_mode;
242 uint32_t delay;
243};
244
245enum camb_position_t {
246 BACK_CAMERA_B,
247 FRONT_CAMERA_B,
248};
249
250enum camerab_mode_t {
251 CAMERA_MODE_2D_B = (1<<0),
252 CAMERA_MODE_3D_B = (1<<1)
253};
254
255struct msm_sensor_init_params {
256 /* mask of modes supported: 2D, 3D */
257 int modes_supported;
258 /* sensor position: front, back */
259 enum camb_position_t position;
260 /* sensor mount angle */
261 uint32_t sensor_mount_angle;
262};
263
264struct sensorb_cfg_data {
265 int cfgtype;
266 union {
267 struct msm_sensor_info_t sensor_info;
268 struct msm_sensor_init_params sensor_init_params;
269 void *setting;
270 } cfg;
271};
272
273struct csid_cfg_data {
274 enum csid_cfg_type_t cfgtype;
275 union {
276 uint32_t csid_version;
277 struct msm_camera_csid_params *csid_params;
278 } cfg;
279};
280
281struct csiphy_cfg_data {
282 enum csiphy_cfg_type_t cfgtype;
283 union {
284 struct msm_camera_csiphy_params *csiphy_params;
285 struct msm_camera_csi_lane_params *csi_lane_params;
286 } cfg;
287};
288
Jeyaprakash Soundrapandian651d64e2013-03-11 12:04:55 -0700289enum eeprom_cfg_type_t {
290 CFG_EEPROM_GET_INFO,
291 CFG_EEPROM_GET_DATA,
292 CFG_EEPROM_READ_DATA,
293 CFG_EEPROM_WRITE_DATA,
294};
295struct eeprom_get_t {
296 uint16_t num_bytes;
297};
298
299struct eeprom_read_t {
300 uint8_t *dbuffer;
301 uint16_t num_bytes;
302};
303
304struct eeprom_write_t {
305 uint8_t *dbuffer;
306 uint16_t num_bytes;
307};
308
309struct msm_eeprom_cfg_data {
310 enum eeprom_cfg_type_t cfgtype;
311 uint8_t is_supported;
312 union {
313 char eeprom_name[MAX_SENSOR_NAME];
314 struct eeprom_get_t get_data;
315 struct eeprom_read_t read_data;
316 struct eeprom_write_t write_data;
317 } cfg;
318};
319
Shuzhen Wangb4f4c922013-01-08 14:32:08 -0800320enum msm_sensor_cfg_type_t {
321 CFG_SET_SLAVE_INFO,
322 CFG_WRITE_I2C_ARRAY,
323 CFG_WRITE_I2C_SEQ_ARRAY,
324 CFG_POWER_UP,
325 CFG_POWER_DOWN,
326 CFG_SET_STOP_STREAM_SETTING,
327 CFG_GET_SENSOR_INFO,
328 CFG_GET_SENSOR_INIT_PARAMS,
Rajakumar Govindaram6ad72872013-01-29 18:36:13 -0800329 CFG_SET_INIT_SETTING,
330 CFG_SET_RESOLUTION,
331 CFG_SET_STOP_STREAM,
332 CFG_SET_START_STREAM,
Shuzhen Wangb4f4c922013-01-08 14:32:08 -0800333};
334
Sreesudhan Ramakrish Ramkumar6acf6252013-01-26 21:26:13 -0800335enum msm_actuator_cfg_type_t {
336 CFG_GET_ACTUATOR_INFO,
337 CFG_SET_ACTUATOR_INFO,
338 CFG_SET_DEFAULT_FOCUS,
339 CFG_MOVE_FOCUS,
340};
341
342enum actuator_type {
343 ACTUATOR_VCM,
344 ACTUATOR_PIEZO,
345};
346
347enum msm_actuator_data_type {
348 MSM_ACTUATOR_BYTE_DATA = 1,
349 MSM_ACTUATOR_WORD_DATA,
350};
351
352enum msm_actuator_addr_type {
353 MSM_ACTUATOR_BYTE_ADDR = 1,
354 MSM_ACTUATOR_WORD_ADDR,
355};
356
357struct reg_settings_t {
358 uint16_t reg_addr;
359 uint16_t reg_data;
360};
361
362struct region_params_t {
363 /* [0] = ForwardDirection Macro boundary
364 [1] = ReverseDirection Inf boundary
365 */
366 uint16_t step_bound[2];
367 uint16_t code_per_step;
368};
369
370struct damping_params_t {
371 uint32_t damping_step;
372 uint32_t damping_delay;
373 uint32_t hw_params;
374};
375
376struct msm_actuator_move_params_t {
377 int8_t dir;
378 int8_t sign_dir;
379 int16_t dest_step_pos;
380 int32_t num_steps;
381 struct damping_params_t *ringing_params;
382};
383
384struct msm_actuator_tuning_params_t {
385 int16_t initial_code;
386 uint16_t pwd_step;
387 uint16_t region_size;
388 uint32_t total_steps;
389 struct region_params_t *region_params;
390};
391
392struct msm_actuator_params_t {
393 enum actuator_type act_type;
394 uint8_t reg_tbl_size;
395 uint16_t data_size;
396 uint16_t init_setting_size;
397 uint32_t i2c_addr;
398 enum msm_actuator_addr_type i2c_addr_type;
399 enum msm_actuator_data_type i2c_data_type;
400 struct msm_actuator_reg_params_t *reg_tbl_params;
401 struct reg_settings_t *init_settings;
402};
403
404struct msm_actuator_set_info_t {
405 struct msm_actuator_params_t actuator_params;
406 struct msm_actuator_tuning_params_t af_tuning_params;
407};
408
409struct msm_actuator_get_info_t {
410 uint32_t focal_length_num;
411 uint32_t focal_length_den;
412 uint32_t f_number_num;
413 uint32_t f_number_den;
414 uint32_t f_pix_num;
415 uint32_t f_pix_den;
416 uint32_t total_f_dist_num;
417 uint32_t total_f_dist_den;
418 uint32_t hor_view_angle_num;
419 uint32_t hor_view_angle_den;
420 uint32_t ver_view_angle_num;
421 uint32_t ver_view_angle_den;
422};
423
424enum af_camera_name {
425 ACTUATOR_MAIN_CAM_0,
426 ACTUATOR_MAIN_CAM_1,
427 ACTUATOR_MAIN_CAM_2,
428 ACTUATOR_MAIN_CAM_3,
429 ACTUATOR_MAIN_CAM_4,
430 ACTUATOR_MAIN_CAM_5,
431 ACTUATOR_WEB_CAM_0,
432 ACTUATOR_WEB_CAM_1,
433 ACTUATOR_WEB_CAM_2,
434};
435
436struct msm_actuator_cfg_data {
437 int cfgtype;
438 uint8_t is_af_supported;
439 union {
440 struct msm_actuator_move_params_t move;
441 struct msm_actuator_set_info_t set_info;
442 struct msm_actuator_get_info_t get_info;
443 enum af_camera_name cam_name;
444 } cfg;
445};
446
447enum msm_actuator_write_type {
448 MSM_ACTUATOR_WRITE_HW_DAMP,
449 MSM_ACTUATOR_WRITE_DAC,
450};
451
452struct msm_actuator_reg_params_t {
453 enum msm_actuator_write_type reg_write_type;
454 uint32_t hw_mask;
455 uint16_t reg_addr;
456 uint16_t hw_shift;
457 uint16_t data_shift;
458};
459
Sreesudhan Ramakrish Ramkumard78de4f2013-02-05 02:25:59 -0800460enum msm_camera_led_config_t {
461 MSM_CAMERA_LED_OFF,
462 MSM_CAMERA_LED_LOW,
463 MSM_CAMERA_LED_HIGH,
464 MSM_CAMERA_LED_INIT,
465 MSM_CAMERA_LED_RELEASE,
466};
467
468struct msm_camera_led_cfg_t {
469 enum msm_camera_led_config_t cfgtype;
470};
471
Shuzhen Wangb4f4c922013-01-08 14:32:08 -0800472#define VIDIOC_MSM_SENSOR_CFG \
473 _IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct sensorb_cfg_data)
474
475#define VIDIOC_MSM_SENSOR_RELEASE \
476 _IO('V', BASE_VIDIOC_PRIVATE + 2)
477
478#define VIDIOC_MSM_SENSOR_GET_SUBDEV_ID \
479 _IOWR('V', BASE_VIDIOC_PRIVATE + 3, uint32_t)
480
481#define VIDIOC_MSM_CSIPHY_IO_CFG \
482 _IOWR('V', BASE_VIDIOC_PRIVATE + 4, struct csid_cfg_data)
483
484#define VIDIOC_MSM_CSID_IO_CFG \
485 _IOWR('V', BASE_VIDIOC_PRIVATE + 5, struct csiphy_cfg_data)
486
Sreesudhan Ramakrish Ramkumar6acf6252013-01-26 21:26:13 -0800487#define VIDIOC_MSM_ACTUATOR_CFG \
488 _IOWR('V', BASE_VIDIOC_PRIVATE + 6, struct msm_actuator_cfg_data)
489
Sreesudhan Ramakrish Ramkumard78de4f2013-02-05 02:25:59 -0800490#define VIDIOC_MSM_FLASH_LED_DATA_CFG \
491 _IOWR('V', BASE_VIDIOC_PRIVATE + 7, struct msm_camera_led_cfg_t)
492
Jeyaprakash Soundrapandian651d64e2013-03-11 12:04:55 -0700493#define VIDIOC_MSM_EEPROM_CFG \
494 _IOWR('V', BASE_VIDIOC_PRIVATE + 8, struct msm_eeprom_cfg_data)
495
Shuzhen Wangb4f4c922013-01-08 14:32:08 -0800496#define MSM_V4L2_PIX_FMT_META v4l2_fourcc('M', 'E', 'T', 'A') /* META */
497
498#endif /* __LINUX_MSM_CAM_SENSOR_H */