1 /* 2 Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. 3 4 Redistribution and use in source and binary forms, with or without 5 modification, are permitted provided that the following conditions are 6 met: 7 * Redistributions of source code must retain the above copyright 8 notice, this list of conditions and the following disclaimer. 9 * Redistributions in binary form must reproduce the above 10 copyright notice, this list of conditions and the following 11 disclaimer in the documentation and/or other materials provided 12 with the distribution. 13 * Neither the name of The Linux Foundation nor the names of its 14 contributors may be used to endorse or promote products derived 15 from this software without specific prior written permission. 16 17 THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 18 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 21 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 24 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 25 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 26 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 */ 29 30 #ifndef __MM_CAMERA_INTERFACE_H__ 31 #define __MM_CAMERA_INTERFACE_H__ 32 #include <linux/msm_ion.h> 33 #include <camera.h> 34 #include "QCamera_Intf.h" 35 #include "cam_list.h" 36 37 #define MM_CAMERA_MAX_NUM_FRAMES 16 38 #define MM_CAMERA_MAX_2ND_SENSORS 4 39 40 typedef enum { 41 MM_CAMERA_OPS_LOCAL = -1, /*no need to query mm-camera*/ 42 MM_CAMERA_OPS_STREAMING_PREVIEW = 0, 43 MM_CAMERA_OPS_STREAMING_ZSL, 44 MM_CAMERA_OPS_STREAMING_VIDEO, 45 MM_CAMERA_OPS_CAPTURE, /*not supported*/ 46 MM_CAMERA_OPS_FOCUS, 47 MM_CAMERA_OPS_GET_PICTURE, /*5*/ 48 MM_CAMERA_OPS_PREPARE_SNAPSHOT, 49 MM_CAMERA_OPS_SNAPSHOT, 50 MM_CAMERA_OPS_LIVESHOT, 51 MM_CAMERA_OPS_RAW_SNAPSHOT, 52 MM_CAMERA_OPS_VIDEO_RECORDING, /*10*/ 53 MM_CAMERA_OPS_REGISTER_BUFFER, 54 MM_CAMERA_OPS_UNREGISTER_BUFFER, 55 MM_CAMERA_OPS_CAPTURE_AND_ENCODE, 56 MM_CAMERA_OPS_RAW_CAPTURE, 57 MM_CAMERA_OPS_ENCODE, /*15*/ 58 MM_CAMERA_OPS_ZSL_STREAMING_CB, 59 /* add new above*/ 60 MM_CAMERA_OPS_MAX 61 }mm_camera_ops_type_t; 62 63 typedef enum { 64 MM_CAMERA_STREAM_OFFSET, 65 MM_CAMERA_STREAM_CID, 66 MM_CAMERA_STREAM_CROP 67 }mm_camera_stream_parm_t; 68 69 typedef struct { 70 int32_t width; 71 int32_t height; 72 } mm_camera_dimension_t; 73 74 typedef struct{ 75 uint32_t tbl_size; 76 struct camera_size_type *sizes_tbl; 77 }default_sizes_tbl_t; 78 79 typedef struct { 80 int32_t left; 81 int32_t top; 82 int32_t width; 83 int32_t height; 84 } mm_camera_rect_t; 85 86 /* TBD: meta header needs to move to msm_camear.h */ 87 typedef enum { 88 /* no meta data header used */ 89 MM_CAMEAR_META_DATA_TYPE_DEF, 90 /* has focus flag, exposure idx, 91 * flash flag, etc. TBD */ 92 MM_CAMEAR_META_DATA_TYPE_BRACKETING, 93 MM_CAMEAR_META_DATA_TYPE_MAX, 94 } mm_camera_meta_header_t; 95 96 typedef struct { 97 cam_format_t fmt; 98 mm_camera_meta_header_t meta_header; 99 uint32_t width; 100 uint32_t height; 101 uint8_t rotation; 102 } mm_camera_image_fmt_t; 103 104 typedef struct { 105 /* image format */ 106 mm_camera_image_fmt_t fmt; 107 108 /* num of buffers needed */ 109 uint8_t num_of_bufs; 110 111 /* flag to indicate if this stream need stream on */ 112 uint8_t need_stream_on; 113 114 /* num of CB needs to be registered on other stream, 115 * this field is valid only when need_stream_on is 0. 116 * When need_stream_on = 1, num_stream_cb_times will be ignored. */ 117 uint8_t num_stream_cb_times; 118 } mm_camera_stream_config_t; 119 120 typedef struct { 121 uint8_t name[32]; 122 int32_t min_value; 123 int32_t max_value; 124 int32_t step; 125 int32_t default_value; 126 } mm_camera_ctrl_cap_sharpness_t; 127 128 typedef struct { 129 int16_t *zoom_ratio_tbl; 130 int32_t size; 131 } mm_camera_zoom_tbl_t; 132 133 typedef enum { 134 /* ZSL use case: get burst of frames */ 135 MM_CAMERA_SUPER_BUF_NOTIFY_BURST = 0, 136 /* get continuous frames: when the super buf is 137 * ready dispatch it to HAL */ 138 MM_CAMERA_SUPER_BUF_NOTIFY_CONTINUOUS, 139 MM_CAMERA_SUPER_BUF_NOTIFY_MAX 140 } mm_camera_super_buf_notify_mode_t; 141 142 typedef enum { 143 /* save the frame. No matter focused or not */ 144 MM_CAMERA_SUPER_BUF_PRIORITY_NORMAL = 0, 145 /* only queue the frame that is focused. Will enable 146 * meta data header to carry focus info*/ 147 MM_CAMERA_SUPER_BUF_PRIORITY_FOCUS, 148 /* after shutter, only queue matched exposure index */ 149 MM_CAMERA_SUPER_BUF_PRIORITY_EXPOSURE_BRACKETING, 150 MM_CAMERA_SUPER_BUF_PRIORITY_MAX 151 } mm_camera_super_buf_priority_t; 152 153 typedef struct { 154 mm_camera_super_buf_notify_mode_t notify_mode; 155 /* queue depth. Only for burst mode */ 156 uint8_t water_mark; 157 /* look back how many frames from last buf */ 158 uint8_t look_back; 159 /* after send first frame to HAL, how many frames 160 * needing to be skipped for next delivery? */ 161 uint8_t post_frame_skip; 162 /* save matched priority frames only */ 163 mm_camera_super_buf_priority_t priority; 164 /* in burst mode, how many super 165 * bufs for each shutter press? */ 166 uint8_t burst_num; 167 } mm_camera_bundle_attr_t; 168 169 typedef struct { 170 uint8_t camera_id; /* camera id */ 171 camera_info_t camera_info; /* postion, mount_angle, etc. */ 172 enum sensor_type_t main_sensor_type; /* BAYER, YUV, JPEG_SOC, etc. */ 173 char *video_dev_name; /* device node name, e.g. /dev/video1 */ 174 } mm_camera_info_t; 175 176 typedef struct { 177 uint8_t cid; 178 uint8_t dt; 179 }stream_cid_t; 180 181 /* the stats struct will need rework after 182 * defining the stats buf sharing logic */ 183 typedef struct { 184 int type; 185 uint32_t length; 186 void *value; 187 } mm_camera_stats_t; 188 189 typedef struct { 190 uint32_t stream_id; /* stream handler */ 191 int8_t buf_idx; /* buf idx within the stream bufs */ 192 193 struct timespec ts; /* time stamp, to be filled when DQBUF*/ 194 uint32_t frame_idx; /* frame sequence num, to be filled when DQBUF */ 195 196 int8_t num_planes; /* num of planes, to be filled during mem allocation */ 197 struct v4l2_plane planes[VIDEO_MAX_PLANES]; /* plane info, to be filled during mem allocation*/ 198 int fd; /* fd of the frame, to be filled during mem allocation */ 199 void *buffer; /* ptr to real frame buffer, to be filled during mem allocation */ 200 uint32_t frame_len; /* len of the whole frame, to be filled during mem allocation */ 201 void *mem_info; /* reserved for pointing to mem info */ 202 cam_exif_tags_t *p_mobicat_info; /*for mobicat info*/ 203 } mm_camera_buf_def_t; 204 205 typedef struct { 206 uint32_t camera_handle; 207 uint32_t ch_id; 208 uint8_t num_bufs; 209 mm_camera_buf_def_t* bufs[MM_CAMEAR_MAX_STRAEM_BUNDLE]; 210 } mm_camera_super_buf_t; 211 212 typedef void (*mm_camera_event_notify_t)(uint32_t camera_handle, 213 mm_camera_event_t *evt, 214 void *user_data); 215 216 typedef void (*mm_camera_buf_notify_t) (mm_camera_super_buf_t *bufs, 217 void *user_data); 218 typedef cam_frame_len_offset_t mm_camera_frame_len_offset; 219 220 typedef struct { 221 void *user_data; 222 int32_t (*get_buf) (uint32_t camera_handle, 223 uint32_t ch_id, uint32_t stream_id, 224 void *user_data, 225 mm_camera_frame_len_offset *frame_offset_info, 226 uint8_t num_bufs, 227 uint8_t *initial_reg_flag, 228 mm_camera_buf_def_t *bufs); 229 int32_t (*put_buf) (uint32_t camera_handle, 230 uint32_t ch_id, uint32_t stream_id, 231 void *user_data, uint8_t num_bufs, 232 mm_camera_buf_def_t *bufs); 233 } mm_camear_mem_vtbl_t; 234 235 typedef struct { 236 uint8_t num_2nd_sensors; 237 uint8_t sensor_idxs[MM_CAMERA_MAX_2ND_SENSORS]; 238 } mm_camera_2nd_sensor_t; 239 240 typedef enum { 241 NATIVE_CMD_ID_SOCKET_MAP, 242 NATIVE_CMD_ID_SOCKET_UNMAP, 243 NATIVE_CMD_ID_IOCTL_CTRL, 244 NATIVE_CMD_ID_MAX 245 } mm_camera_native_cmd_id_t; 246 247 typedef enum { 248 MM_CAMERA_CMD_TYPE_PRIVATE, /* OEM private ioctl */ 249 MM_CAMERA_CMD_TYPE_NATIVE /* native ctrl cmd through ioctl */ 250 } mm_camera_cmd_type_t; 251 252 typedef struct { 253 mm_camera_buf_def_t *src_frame; /* src frame */ 254 } mm_camera_repro_data_t; 255 256 typedef mm_camera_repro_cmd_config_t mm_camera_repro_isp_config_t; 257 258 typedef struct { 259 /* to sync the internal camera settings */ 260 int32_t (*sync) (uint32_t camera_handle); 261 uint8_t (*is_event_supported) (uint32_t camera_handle, 262 mm_camera_event_type_t evt_type); 263 int32_t (*register_event_notify) (uint32_t camera_handle, 264 mm_camera_event_notify_t evt_cb, 265 void * user_data, 266 mm_camera_event_type_t evt_type); 267 int32_t (*qbuf) (uint32_t camera_handle, uint32_t ch_id, 268 mm_camera_buf_def_t *buf); 269 void (*camera_close) (uint32_t camera_handle); 270 /* Only fo supporting advanced 2nd sensors. If no secondary sensor needed 271 * HAL can ignore this function */ 272 mm_camera_2nd_sensor_t * (*query_2nd_sensor_info) (uint32_t camera_handle); 273 274 /* if the operation is supported: TRUE - support, FALSE - not support */ 275 uint8_t (*is_op_supported)(uint32_t camera_handle, mm_camera_ops_type_t opcode); 276 277 /* if the parm is supported: TRUE - support, FALSE - not support */ 278 int32_t (*is_parm_supported) (uint32_t camera_handle, 279 mm_camera_parm_type_t parm_type, 280 uint8_t *support_set_parm, 281 uint8_t *support_get_parm); 282 /* set a parm current value */ 283 int32_t (*set_parm) (uint32_t camera_handle, 284 mm_camera_parm_type_t parm_type, 285 void* p_value); 286 /* get a parm current value */ 287 int32_t (*get_parm) (uint32_t camera_handle, 288 mm_camera_parm_type_t parm_type, 289 void* p_value); 290 /* ch_id returned, zero is invalid ch_id */ 291 uint32_t (*ch_acquire) (uint32_t camera_handle); 292 /* relaese channel */ 293 void (*ch_release) (uint32_t camera_handle, uint32_t ch_id); 294 /* return stream_id. zero is invalid stream_id 295 * default set to preview: ext_image_mode = 0 296 * default set to primary sensor: sensor_idx = 0 297 * value of ext_image_mode is defined in msm_camera.h 298 */ 299 uint32_t (*add_stream) (uint32_t camera_handle, uint32_t ch_id, 300 mm_camera_buf_notify_t buf_cb, void *user_data, 301 uint32_t ext_image_mode, uint32_t sensor_idx); 302 /* delete stream */ 303 int32_t (*del_stream) (uint32_t camera_handle, uint32_t ch_id, 304 uint32_t stream_id); 305 /* set straem format This will trigger getting bufs from HAL */ 306 int32_t (*config_stream) (uint32_t camera_handle, uint32_t ch_id, 307 uint32_t stream_id, 308 mm_camera_stream_config_t *config); 309 /* setup super buf bundle for ZSL(with burst mode) or other use cases */ 310 int32_t (*init_stream_bundle) (uint32_t camera_handle, uint32_t ch_id, 311 mm_camera_buf_notify_t super_frame_notify_cb, 312 void *user_data, mm_camera_bundle_attr_t *attr, 313 uint8_t num_streams, uint32_t *stream_ids); 314 /* remove the super buf bundle */ 315 int32_t (*destroy_stream_bundle) (uint32_t camera_handle, uint32_t ch_id); 316 /* start streaming */ 317 int32_t (*start_streams) (uint32_t camera_handle, uint32_t ch_id, 318 uint8_t num_streams, uint32_t *stream_ids); 319 /* stop streaming */ 320 int32_t (*stop_streams) (uint32_t camera_handle, uint32_t ch_id, 321 uint8_t num_streams, uint32_t *stream_ids); 322 /* tear down streams asyncly */ 323 int32_t (*async_teardown_streams) (uint32_t camera_handle, uint32_t ch_id, 324 uint8_t num_streams, uint32_t *stream_ids); 325 /* get super bufs. for burst mode only */ 326 int32_t (*request_super_buf) (uint32_t camera_handle, 327 uint32_t ch_id, 328 uint32_t num_buf_requested); 329 /* abort the super buf dispatching. for burst mode only */ 330 int32_t (*cancel_super_buf_request) (uint32_t camera_handle, 331 uint32_t ch_id); 332 /* start focus: by default sensor_idx=0 */ 333 int32_t (*start_focus) (uint32_t camera_handle, 334 uint32_t ch_id, 335 uint32_t sensor_idx, 336 uint32_t focus_mode); 337 /* abort focus: by default sensor_idx=0 */ 338 int32_t (*abort_focus) (uint32_t camera_handle, 339 uint32_t ch_id, 340 uint32_t sensor_idx); 341 /* prepare hardware will settle aec and flash. 342 * by default sensor_idx=0 */ 343 int32_t (*prepare_snapshot) (uint32_t camera_handle, 344 uint32_t ch_id, 345 uint32_t sensor_idx); 346 /* set a parm current value of a stream */ 347 int32_t (*set_stream_parm) (uint32_t camera_handle, 348 uint32_t ch_id, 349 uint32_t s_id, 350 mm_camera_stream_parm_t parm_type, 351 void *p_value); 352 /* get a parm current value of a stream */ 353 int32_t (*get_stream_parm) (uint32_t camera_handle, 354 uint32_t ch_id, 355 uint32_t s_id, 356 mm_camera_stream_parm_t parm_type, 357 void *p_value); 358 /* private communication tunnel */ 359 int32_t (*send_command) (uint32_t camera_handle, 360 mm_camera_cmd_type_t cmd_type, 361 uint32_t cmd_id, 362 uint32_t cmd_length, 363 void *cmd); 364 /* open a re-process isp, return handler for repro isp (>0). 365 * if failed, reutrn 0 */ 366 uint32_t (*open_repro_isp) (uint32_t camera_handle, 367 uint32_t ch_id, 368 mm_camera_repro_isp_type_t repro_isp_type); 369 /* config the re-process isp */ 370 int32_t (*config_repro_isp) (uint32_t camera_handle, 371 uint32_t ch_id, 372 uint32_t repro_isp_handle, 373 mm_camera_repro_isp_config_t *config); 374 /* attach output stream to the re-process isp */ 375 int32_t (*attach_stream_to_repro_isp) (uint32_t camera_handle, 376 uint32_t ch_id, 377 uint32_t repro_isp_handle, 378 uint32_t stream_id); 379 /* start a re-process isp. */ 380 int32_t (*start_repro_isp) (uint32_t camera_handle, 381 uint32_t ch_id, 382 uint32_t repro_isp_handle, 383 uint32_t stream_id); 384 /* start a reprocess job for a src frame. 385 * Only after repo_isp is started, reprocess API can be called */ 386 int32_t (*reprocess) (uint32_t camera_handle, 387 uint32_t ch_id, 388 uint32_t repro_isp_handle, 389 mm_camera_repro_data_t *repo_data); 390 /* stop a re-process isp */ 391 int32_t (*stop_repro_isp) (uint32_t camera_handle, 392 uint32_t ch_id, 393 uint32_t repro_isp_handle, 394 uint32_t stream_id); 395 /* detach an output stream from the re-process isp. 396 * Can only be called after the re-process isp is stopped */ 397 int32_t (*detach_stream_from_repro_isp) (uint32_t camera_handle, 398 uint32_t ch_id, 399 uint32_t repro_isp_handle, 400 uint32_t stream_id); 401 /* close a re-process isp. 402 * Can only close after all dest streams are detached from it */ 403 int32_t (*close_repro_isp) (uint32_t camera_handle, 404 uint32_t ch_id, 405 uint32_t repro_isp_handle); 406 } mm_camera_ops_t; 407 408 typedef struct { 409 uint32_t camera_handle; /* camera object handle */ 410 mm_camera_info_t *camera_info; /* reference pointer of camear info */ 411 mm_camera_ops_t *ops; /* API call table */ 412 } mm_camera_vtbl_t; 413 414 mm_camera_info_t * camera_query(uint8_t *num_cameras); 415 mm_camera_vtbl_t * camera_open(uint8_t camera_idx, 416 mm_camear_mem_vtbl_t *mem_vtbl); 417 418 //extern void mm_camera_util_profile(const char *str); 419 420 typedef enum { 421 MM_CAMERA_PREVIEW, 422 MM_CAMERA_VIDEO, 423 MM_CAMERA_SNAPSHOT_MAIN, 424 MM_CAMERA_SNAPSHOT_THUMBNAIL, 425 MM_CAMERA_SNAPSHOT_RAW, 426 MM_CAMERA_RDI, 427 MM_CAMERA_RDI1, 428 MM_CAMERA_RDI2, 429 MM_CAMERA_SAEC, 430 MM_CAMERA_SAWB, 431 MM_CAMERA_SAFC, 432 MM_CAMERA_IHST, 433 MM_CAMERA_CS, 434 MM_CAMERA_RS, 435 MM_CAMERA_CSTA, 436 MM_CAMERA_ISP_PIX_OUTPUT1, 437 MM_CAMERA_ISP_PIX_OUTPUT2, 438 MM_CAMERA_IMG_MODE_MAX 439 } mm_camera_img_mode; 440 441 /* may remove later */ 442 typedef enum { 443 MM_CAMERA_OP_MODE_NOTUSED, 444 MM_CAMERA_OP_MODE_CAPTURE, 445 MM_CAMERA_OP_MODE_VIDEO, 446 MM_CAMERA_OP_MODE_ZSL, 447 MM_CAMERA_OP_MODE_RAW, 448 MM_CAMERA_OP_MODE_MAX 449 } mm_camera_op_mode_type_t; 450 451 #endif /*__MM_CAMERA_INTERFACE_H__*/ 452