1 /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 2 * 3 * Redistribution and use in source and binary forms, with or without 4 * modification, are permitted provided that the following conditions are 5 * met: 6 * * Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * * Redistributions in binary form must reproduce the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer in the documentation and/or other materials provided 11 * with the distribution. 12 * * Neither the name of The Linux Foundation nor the names of its 13 * contributors may be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 */ 29 30 #ifndef __MM_CAMERA_H__ 31 #define __MM_CAMERA_H__ 32 33 // System dependencies 34 #include <poll.h> 35 36 // Camera dependencies 37 #include "hardware/camera_common.h" 38 #include "cam_semaphore.h" 39 #include "mm_camera_interface.h" 40 #include "mm_camera_shim.h" 41 42 /********************************************************************************** 43 * Data structure declarations 44 ***********************************************************************************/ 45 /* num of callbacks allowed for an event type */ 46 #define MM_CAMERA_EVT_ENTRY_MAX 4 47 /* num of data callbacks allowed in a stream obj */ 48 #define MM_CAMERA_STREAM_BUF_CB_MAX 4 49 /* num of data poll threads allowed in a channel obj */ 50 #define MM_CAMERA_CHANNEL_POLL_THREAD_MAX 1 51 52 #define MM_CAMERA_DEV_NAME_LEN 32 53 #define MM_CAMERA_DEV_OPEN_TRIES 20 54 #define MM_CAMERA_DEV_OPEN_RETRY_SLEEP 20 55 #define THREAD_NAME_SIZE 15 56 57 /* Future frame idx, large enough to make sure capture 58 * settings can be applied and small enough to still capture an image */ 59 #define MM_CAMERA_MAX_FUTURE_FRAME_WAIT 100 60 #define WAIT_TIMEOUT 10 61 62 /*For frame sync */ 63 #define MAX_OBJS_FOR_FRAME_SYNC 4 64 65 /* num of supporting camera*/ 66 #define MM_CAMERA_MAX_AUX_CAMERA 1 67 68 #ifndef TRUE 69 #define TRUE 1 70 #endif 71 72 #ifndef FALSE 73 #define FALSE 0 74 #endif 75 76 #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) 77 78 struct mm_channel; 79 struct mm_stream; 80 struct mm_camera_obj; 81 82 typedef int64_t nsecs_t; 83 84 typedef enum 85 { 86 MM_CAMERA_CMD_TYPE_DATA_CB, /* dataB CMD */ 87 MM_CAMERA_CMD_TYPE_EVT_CB, /* evtCB CMD */ 88 MM_CAMERA_CMD_TYPE_EXIT, /* EXIT */ 89 MM_CAMERA_CMD_TYPE_REQ_DATA_CB,/* request data */ 90 MM_CAMERA_CMD_TYPE_SUPER_BUF_DATA_CB, /* superbuf dataB CMD */ 91 MM_CAMERA_CMD_TYPE_CONFIG_NOTIFY, /* configure notify mode */ 92 MM_CAMERA_CMD_TYPE_START_ZSL, /* start zsl snapshot for channel */ 93 MM_CAMERA_CMD_TYPE_STOP_ZSL, /* stop zsl snapshot for channel */ 94 MM_CAMERA_CMD_TYPE_FLUSH_QUEUE, /* flush queue */ 95 MM_CAMERA_CMD_TYPE_GENERAL, /* general cmd */ 96 MM_CAMERA_CMD_TYPE_MAX 97 } mm_camera_cmdcb_type_t; 98 99 typedef struct { 100 uint32_t stream_id; 101 uint32_t frame_idx; 102 uint32_t flags; 103 mm_camera_buf_def_t *buf; /* ref to buf */ 104 } mm_camera_buf_info_t; 105 106 typedef enum { 107 MM_CAMERA_GENERIC_CMD_TYPE_AE_BRACKETING, 108 MM_CAMERA_GENERIC_CMD_TYPE_AF_BRACKETING, 109 MM_CAMERA_GENERIC_CMD_TYPE_FLASH_BRACKETING, 110 MM_CAMERA_GENERIC_CMD_TYPE_ZOOM_1X, 111 MM_CAMERA_GENERIC_CMD_TYPE_CAPTURE_SETTING, 112 } mm_camera_generic_cmd_type_t; 113 114 typedef struct { 115 mm_camera_generic_cmd_type_t type; 116 uint32_t payload[32]; 117 union { 118 cam_capture_frame_config_t frame_config; 119 }; 120 } mm_camera_generic_cmd_t; 121 122 typedef struct { 123 uint32_t frame_idx; 124 cam_stream_type_t stream_type; 125 } mm_camera_flush_cmd_t; 126 127 typedef struct { 128 mm_camera_cmdcb_type_t cmd_type; 129 union { 130 mm_camera_buf_info_t buf; /* frame buf if dataCB */ 131 mm_camera_event_t evt; /* evt if evtCB */ 132 mm_camera_super_buf_t superbuf; /* superbuf if superbuf dataCB*/ 133 mm_camera_req_buf_t req_buf; /* num of buf requested */ 134 mm_camera_flush_cmd_t flush_cmd; /* frame idx boundary for flush superbuf queue*/ 135 mm_camera_super_buf_notify_mode_t notify_mode; /* notification mode */ 136 mm_camera_generic_cmd_t gen_cmd; 137 } u; 138 } mm_camera_cmdcb_t; 139 140 typedef void (*mm_camera_cmd_cb_t)(mm_camera_cmdcb_t * cmd_cb, void* user_data); 141 142 typedef struct { 143 uint8_t is_active; /*indicates whether thread is active or not */ 144 cam_queue_t cmd_queue; /* cmd queue (queuing dataCB, asyncCB, or exitCMD) */ 145 pthread_t cmd_pid; /* cmd thread ID */ 146 cam_semaphore_t cmd_sem; /* semaphore for cmd thread */ 147 cam_semaphore_t sync_sem; /* semaphore for synchronization with cmd thread */ 148 mm_camera_cmd_cb_t cb; /* cb for cmd */ 149 void* user_data; /* user_data for cb */ 150 char threadName[THREAD_NAME_SIZE]; 151 } mm_camera_cmd_thread_t; 152 153 typedef enum { 154 MM_CAMERA_POLL_TYPE_EVT, 155 MM_CAMERA_POLL_TYPE_DATA, 156 MM_CAMERA_POLL_TYPE_MAX 157 } mm_camera_poll_thread_type_t; 158 159 /* function ptr defined for poll notify CB, 160 * registered at poll thread with poll fd */ 161 typedef void (*mm_camera_poll_notify_t)(void *user_data); 162 163 typedef struct { 164 int32_t fd; 165 mm_camera_poll_notify_t notify_cb; 166 uint32_t handler; 167 void* user_data; 168 } mm_camera_poll_entry_t; 169 170 typedef struct { 171 mm_camera_poll_thread_type_t poll_type; 172 /* array to store poll fd and cb info 173 * for MM_CAMERA_POLL_TYPE_EVT, only index 0 is valid; 174 * for MM_CAMERA_POLL_TYPE_DATA, depends on valid stream fd */ 175 mm_camera_poll_entry_t poll_entries[MAX_STREAM_NUM_IN_BUNDLE]; 176 int32_t pfds[2]; 177 pthread_t pid; 178 int32_t state; 179 int timeoutms; 180 uint32_t cmd; 181 struct pollfd poll_fds[MAX_STREAM_NUM_IN_BUNDLE + 1]; 182 uint8_t num_fds; 183 pthread_mutex_t mutex; 184 pthread_cond_t cond_v; 185 int32_t status; 186 char threadName[THREAD_NAME_SIZE]; 187 //void *my_obj; 188 } mm_camera_poll_thread_t; 189 190 /* mm_stream */ 191 typedef enum { 192 MM_STREAM_STATE_NOTUSED = 0, /* not used */ 193 MM_STREAM_STATE_INITED, /* inited */ 194 MM_STREAM_STATE_ACQUIRED, /* acquired, fd opened */ 195 MM_STREAM_STATE_CFG, /* fmt & dim configured */ 196 MM_STREAM_STATE_BUFFED, /* buf allocated */ 197 MM_STREAM_STATE_REG, /* buf regged, stream off */ 198 MM_STREAM_STATE_ACTIVE, /* active */ 199 MM_STREAM_STATE_MAX 200 } mm_stream_state_type_t; 201 202 typedef enum { 203 MM_STREAM_EVT_ACQUIRE, 204 MM_STREAM_EVT_RELEASE, 205 MM_STREAM_EVT_SET_FMT, 206 MM_STREAM_EVT_GET_BUF, 207 MM_STREAM_EVT_PUT_BUF, 208 MM_STREAM_EVT_REG_BUF, 209 MM_STREAM_EVT_UNREG_BUF, 210 MM_STREAM_EVT_START, 211 MM_STREAM_EVT_START_SENSOR_STREAMING, 212 MM_STREAM_EVT_STOP, 213 MM_STREAM_EVT_QBUF, 214 MM_STREAM_EVT_SET_PARM, 215 MM_STREAM_EVT_GET_PARM, 216 MM_STREAM_EVT_DO_ACTION, 217 MM_STREAM_EVT_GET_QUEUED_BUF_COUNT, 218 MM_STREAM_EVT_REG_FRAME_SYNC, 219 MM_STREAM_EVT_TRIGGER_FRAME_SYNC, 220 MM_STREAM_EVT_CANCEL_BUF, 221 MM_STREAM_EVT_MAX 222 } mm_stream_evt_type_t; 223 224 typedef struct { 225 mm_camera_buf_notify_t cb; 226 void *user_data; 227 /* cb_count = -1: infinite 228 * cb_count > 0: register only for required times */ 229 int8_t cb_count; 230 mm_camera_stream_cb_type cb_type; 231 } mm_stream_data_cb_t; 232 233 typedef struct { 234 /* buf reference count */ 235 uint8_t buf_refcnt; 236 237 /* This flag is to indicate if after allocation, 238 * the corresponding buf needs to qbuf into kernel 239 * (e.g. for preview usecase, display needs to hold two bufs, 240 * so no need to qbuf these two bufs initially) */ 241 uint8_t initial_reg_flag; 242 243 /* indicate if buf is in kernel(1) or client(0) */ 244 uint8_t in_kernel; 245 /*indicate if this buffer is mapped to daemon*/ 246 int8_t map_status; 247 } mm_stream_buf_status_t; 248 249 /*Structure definition to carry frame sync queue details*/ 250 typedef struct { 251 /*Number of objects to be synced*/ 252 uint8_t num_objs; 253 /*Object handle to be synced*/ 254 uint32_t bundled_objs[MAX_OBJS_FOR_FRAME_SYNC]; 255 /*Queue*/ 256 cam_queue_t que; 257 258 /*queue attributed*/ 259 mm_camera_channel_attr_t attr; 260 261 /*Expected frame for this queue*/ 262 uint32_t expected_frame_id; 263 264 /*Total match count*/ 265 uint32_t match_cnt; 266 } mm_frame_sync_queue_t; 267 268 /*Structure definition to carry frame sync details*/ 269 typedef struct { 270 /* flag to indicate if frame sync is active*/ 271 uint8_t is_active; 272 273 /*Frame sync lock. Shared between child and parent stream*/ 274 pthread_mutex_t sync_lock; 275 276 /*Limited number of synced frame request*/ 277 mm_camera_req_buf_t req_buf; 278 279 /*Queue to hold super buffers*/ 280 mm_frame_sync_queue_t superbuf_queue; 281 282 /*Callback registered for synced frame*/ 283 mm_camera_buf_notify_t super_buf_notify_cb; 284 285 /*Client data*/ 286 void *user_data; 287 } mm_frame_sync_t; 288 289 struct mm_stream; 290 typedef struct mm_stream { 291 uint32_t my_hdl; /* local stream id */ 292 uint32_t server_stream_id; /* stream id from server */ 293 int32_t fd; 294 mm_stream_state_type_t state; 295 296 /* stream info*/ 297 cam_stream_info_t *stream_info; 298 299 /* padding info */ 300 cam_padding_info_t padding_info; 301 302 /* offset */ 303 cam_frame_len_offset_t frame_offset; 304 305 pthread_mutex_t cmd_lock; /* lock to protect cmd_thread */ 306 mm_camera_cmd_thread_t cmd_thread; 307 308 /* dataCB registered on this stream obj */ 309 uint8_t is_cb_active; 310 pthread_mutex_t cb_lock; /* cb lock to protect buf_cb */ 311 mm_stream_data_cb_t buf_cb[MM_CAMERA_STREAM_BUF_CB_MAX]; 312 313 /* stream buffer management */ 314 pthread_mutex_t buf_lock; 315 uint8_t total_buf_cnt; /*Total number of buffer including slave*/ 316 uint8_t buf_num; /* num of buffers for this stream */ 317 uint8_t buf_idx; /* starting buffer index */ 318 319 mm_camera_buf_def_t* buf; /* ptr to buf array */ 320 mm_stream_buf_status_t buf_status[CAM_MAX_NUM_BUFS_PER_STREAM]; /* ptr to buf status array */ 321 322 uint8_t plane_buf_num; /* num of plane buffers allocated Used only in Batch mode*/ 323 mm_camera_buf_def_t *plane_buf; /*Pointer to plane buffer array Used only in Batch mode */ 324 int32_t cur_buf_idx; /* Current container buffer active filling. Used only in Batch mode*/ 325 uint8_t cur_bufs_staged; /*Number of plane buf freed by HAL for this usr buf*/ 326 327 /* reference to parent channel_obj */ 328 struct mm_channel* ch_obj; 329 330 uint8_t is_bundled; /* flag if stream is bundled */ 331 332 /* reference to linked channel_obj */ 333 struct mm_channel* linked_obj; 334 struct mm_stream * linked_stream; /* original stream */ 335 uint8_t is_linked; /* flag if stream is linked */ 336 337 mm_camera_stream_mem_vtbl_t mem_vtbl; /* mem ops tbl */ 338 mm_camera_map_unmap_ops_tbl_t map_ops; 339 340 int8_t queued_buffer_count; 341 342 /*latest timestamp of this stream frame received & last frameID*/ 343 uint32_t prev_frameID; 344 nsecs_t prev_timestamp; 345 346 /* Need to wait for buffer mapping before stream-on*/ 347 pthread_cond_t buf_cond; 348 349 struct mm_stream *master_str_obj; /*Master stream of this stream*/ 350 uint8_t num_s_cnt; 351 struct mm_stream *aux_str_obj[MM_CAMERA_MAX_AUX_CAMERA]; /*aux stream of this stream*/ 352 mm_frame_sync_t frame_sync; 353 uint8_t is_res_shared; 354 } mm_stream_t; 355 356 /* mm_channel */ 357 typedef enum { 358 MM_CHANNEL_STATE_NOTUSED = 0, /* not used */ 359 MM_CHANNEL_STATE_STOPPED, /* stopped */ 360 MM_CHANNEL_STATE_ACTIVE, /* active, at least one stream active */ 361 MM_CHANNEL_STATE_PAUSED, /* paused */ 362 MM_CHANNEL_STATE_MAX 363 } mm_channel_state_type_t; 364 365 typedef enum { 366 MM_CHANNEL_EVT_ADD_STREAM, 367 MM_CHANNEL_EVT_DEL_STREAM, 368 MM_CHANNEL_EVT_LINK_STREAM, 369 MM_CHANNEL_EVT_CONFIG_STREAM, 370 MM_CHANNEL_EVT_GET_BUNDLE_INFO, 371 MM_CHANNEL_EVT_START, 372 MM_CHANNEL_EVT_START_SENSOR_STREAMING, 373 MM_CHANNEL_EVT_STOP, 374 MM_CHANNEL_EVT_PAUSE, 375 MM_CHANNEL_EVT_RESUME, 376 MM_CHANNEL_EVT_REQUEST_SUPER_BUF, 377 MM_CHANNEL_EVT_CANCEL_REQUEST_SUPER_BUF, 378 MM_CHANNEL_EVT_FLUSH_SUPER_BUF_QUEUE, 379 MM_CHANNEL_EVT_CONFIG_NOTIFY_MODE, 380 MM_CHANNEL_EVT_START_ZSL_SNAPSHOT, 381 MM_CHANNEL_EVT_STOP_ZSL_SNAPSHOT, 382 MM_CHANNEL_EVT_MAP_STREAM_BUF, 383 MM_CHANNEL_EVT_UNMAP_STREAM_BUF, 384 MM_CHANNEL_EVT_SET_STREAM_PARM, 385 MM_CHANNEL_EVT_GET_STREAM_PARM, 386 MM_CHANNEL_EVT_DO_ACTION, 387 MM_CHANNEL_EVT_DELETE, 388 MM_CHANNEL_EVT_AF_BRACKETING, 389 MM_CHANNEL_EVT_AE_BRACKETING, 390 MM_CHANNEL_EVT_FLASH_BRACKETING, 391 MM_CHANNEL_EVT_ZOOM_1X, 392 MM_CAMERA_EVT_CAPTURE_SETTING, 393 MM_CHANNEL_EVT_GET_STREAM_QUEUED_BUF_COUNT, 394 MM_CHANNEL_EVT_MAP_STREAM_BUFS, 395 MM_CHANNEL_EVT_REG_STREAM_BUF_CB, 396 MM_CHANNEL_EVT_REG_FRAME_SYNC, 397 MM_CHANNEL_EVT_TRIGGER_FRAME_SYNC, 398 } mm_channel_evt_type_t; 399 400 typedef struct { 401 uint32_t stream_id; 402 mm_camera_stream_config_t *config; 403 } mm_evt_paylod_config_stream_t; 404 405 typedef struct { 406 uint32_t stream_id; 407 cam_stream_parm_buffer_t *parms; 408 } mm_evt_paylod_set_get_stream_parms_t; 409 410 typedef struct { 411 uint32_t stream_id; 412 void *actions; 413 } mm_evt_paylod_do_stream_action_t; 414 415 typedef struct { 416 uint32_t stream_id; 417 mm_stream_data_cb_t buf_cb; 418 } mm_evt_paylod_reg_stream_buf_cb; 419 420 typedef struct { 421 uint8_t num_of_bufs; 422 mm_camera_buf_info_t super_buf[MAX_STREAM_NUM_IN_BUNDLE]; 423 uint8_t matched; 424 uint8_t expected_frame; 425 uint32_t frame_idx; 426 /* unmatched meta idx needed in case of low priority queue */ 427 uint32_t unmatched_meta_idx; 428 } mm_channel_queue_node_t; 429 430 typedef struct { 431 cam_queue_t que; 432 uint8_t num_streams; 433 /* container for bundled stream handlers */ 434 uint32_t bundled_streams[MAX_STREAM_NUM_IN_BUNDLE]; 435 mm_camera_channel_attr_t attr; 436 uint32_t expected_frame_id; 437 uint32_t match_cnt; 438 uint32_t expected_frame_id_without_led; 439 uint32_t led_on_start_frame_id; 440 uint32_t led_off_start_frame_id; 441 uint32_t led_on_num_frames; 442 uint32_t once; 443 uint32_t frame_skip_count; 444 uint32_t good_frame_id; 445 } mm_channel_queue_t; 446 447 typedef struct { 448 uint8_t is_active; /* flag to indicate if bundle is valid */ 449 /* queue to store bundled super buffers */ 450 uint8_t is_cb_active; 451 mm_channel_queue_t superbuf_queue; 452 mm_camera_buf_notify_t super_buf_notify_cb; 453 void *user_data; 454 } mm_channel_bundle_t; 455 456 /* Nodes used for frame sync */ 457 typedef struct { 458 /* Frame idx */ 459 uint32_t frame_idx; 460 /* Frame present for corresponding channel*/ 461 uint32_t frame_valid[MAX_NUM_CAMERA_PER_BUNDLE]; 462 /* Frame present in all channels*/ 463 uint32_t matched; 464 } mm_channel_sync_node_t; 465 466 /* Frame sync information */ 467 typedef struct { 468 /* Number of camera channels that need to be synced*/ 469 uint8_t num_cam; 470 /* position of the next node to be updated */ 471 uint8_t pos; 472 /* circular node array used to store frame information */ 473 mm_channel_sync_node_t node[MM_CAMERA_FRAME_SYNC_NODES]; 474 /* Channel corresponding to each camera */ 475 struct mm_channel *ch_obj[MAX_NUM_CAMERA_PER_BUNDLE]; 476 /* Cb corresponding to each camera */ 477 mm_camera_buf_notify_t cb[MAX_NUM_CAMERA_PER_BUNDLE]; 478 } mm_channel_frame_sync_info_t; 479 480 /* Node information for multiple superbuf callbacks 481 * This can be used to batch nodes before sending to upper layer */ 482 typedef struct { 483 /* Number of nodes to be sent*/ 484 uint8_t num_nodes; 485 /* queue node information*/ 486 mm_channel_queue_node_t *node[MAX_NUM_CAMERA_PER_BUNDLE]; 487 /* channel information*/ 488 struct mm_channel *ch_obj[MAX_NUM_CAMERA_PER_BUNDLE]; 489 } mm_channel_node_info_t; 490 491 typedef enum { 492 MM_CHANNEL_BRACKETING_STATE_OFF, 493 MM_CHANNEL_BRACKETING_STATE_WAIT_GOOD_FRAME_IDX, 494 MM_CHANNEL_BRACKETING_STATE_ACTIVE, 495 } mm_channel_bracketing_state_t; 496 497 struct mm_channel; 498 typedef struct mm_channel { 499 uint32_t my_hdl; 500 mm_channel_state_type_t state; 501 pthread_mutex_t ch_lock; /* channel lock */ 502 503 /* stream bundle info in the channel */ 504 mm_channel_bundle_t bundle; 505 506 /* num of pending suferbuffers */ 507 uint32_t pending_cnt; 508 uint32_t pending_retro_cnt; 509 mm_camera_req_buf_type_t req_type; 510 uint32_t bWaitForPrepSnapshotDone; 511 uint32_t unLockAEC; 512 /* num of pending suferbuffers */ 513 uint8_t stopZslSnapshot; 514 515 /* cmd thread for superbuffer dataCB and async stop*/ 516 mm_camera_cmd_thread_t cmd_thread; 517 518 /* cb thread for sending data cb */ 519 mm_camera_cmd_thread_t cb_thread; 520 521 /* data poll thread 522 * currently one data poll thread per channel 523 * could extended to support one data poll thread per stream in the channel */ 524 mm_camera_poll_thread_t poll_thread[MM_CAMERA_CHANNEL_POLL_THREAD_MAX]; 525 526 /* container for all streams in channel */ 527 mm_stream_t streams[MAX_STREAM_NUM_IN_BUNDLE]; 528 529 /* reference to parent cam_obj */ 530 struct mm_camera_obj* cam_obj; 531 532 /* manual zsl snapshot control */ 533 uint8_t manualZSLSnapshot; 534 535 /* control for zsl led */ 536 uint8_t startZSlSnapshotCalled; 537 uint8_t needLEDFlash; 538 mm_channel_bracketing_state_t bracketingState; 539 uint8_t isFlashBracketingEnabled; 540 uint8_t isZoom1xFrameRequested; 541 uint32_t burstSnapNum; 542 char threadName[THREAD_NAME_SIZE]; 543 544 /*Buffer diverted*/ 545 uint8_t diverted_frame_id; 546 uint32_t sessionid; 547 548 /*Frame capture configaration*/ 549 uint8_t isConfigCapture; 550 uint8_t cur_capture_idx; 551 uint32_t capture_frame_id[MAX_CAPTURE_BATCH_NUM]; 552 cam_capture_frame_config_t frameConfig; 553 uint8_t needLowLightZSL; 554 555 /*Capture based on index*/ 556 uint8_t cur_req_idx; 557 uint8_t frame_req_cnt; 558 uint32_t requested_frame_id[MAX_CAPTURE_BATCH_NUM]; 559 560 /*For channel frame sync*/ 561 mm_frame_sync_t frame_sync; 562 563 /*Multiple camera's*/ 564 struct mm_channel *master_ch_obj; /*Master channel of this channel*/ 565 uint8_t num_s_cnt; 566 struct mm_channel *aux_ch_obj[MM_CAMERA_MAX_AUX_CAMERA]; /*Slave channel of this channel*/ 567 } mm_channel_t; 568 569 typedef struct { 570 mm_channel_t *ch; 571 uint32_t stream_id; 572 } mm_camera_stream_link_t; 573 574 /* struct to store information about pp cookie*/ 575 typedef struct { 576 uint32_t cam_hdl; 577 uint32_t ch_hdl; 578 uint32_t stream_hdl; 579 mm_channel_queue_node_t *super_buf; 580 } mm_channel_pp_info_t; 581 582 /* mm_camera */ 583 typedef struct { 584 mm_camera_event_notify_t evt_cb; 585 void *user_data; 586 } mm_camera_evt_entry_t; 587 588 typedef struct { 589 mm_camera_evt_entry_t evt[MM_CAMERA_EVT_ENTRY_MAX]; 590 /* reg_count <=0: infinite 591 * reg_count > 0: register only for required times */ 592 int reg_count; 593 } mm_camera_evt_obj_t; 594 595 struct mm_camera_obj; 596 typedef struct mm_camera_obj { 597 uint32_t my_hdl; 598 int ref_count; 599 int32_t ctrl_fd; 600 int32_t ds_fd; /* domain socket fd */ 601 pthread_mutex_t cam_lock; 602 pthread_mutex_t cb_lock; /* lock for evt cb */ 603 mm_channel_t ch[MM_CAMERA_CHANNEL_MAX]; 604 mm_camera_evt_obj_t evt; 605 mm_camera_poll_thread_t evt_poll_thread; /* evt poll thread */ 606 mm_camera_cmd_thread_t evt_thread; /* thread for evt CB */ 607 mm_camera_vtbl_t vtbl; 608 609 pthread_mutex_t evt_lock; 610 pthread_cond_t evt_cond; 611 mm_camera_event_t evt_rcvd; 612 613 pthread_mutex_t msg_lock; /* lock for sending msg through socket */ 614 uint32_t sessionid; /* Camera server session id */ 615 616 uint8_t my_num; /*this camera position in multi mode*/ 617 pthread_mutex_t muxer_lock; 618 struct mm_camera_obj *master_cam_obj; /*Master Camera of this camera*/ 619 uint8_t num_s_cnt; 620 struct mm_camera_obj *aux_cam_obj[MM_CAMERA_MAX_AUX_CAMERA]; /*Slave Camera of this camera*/ 621 } mm_camera_obj_t; 622 623 typedef struct { 624 int8_t num_cam; 625 mm_camera_shim_ops_t cam_shim_ops; 626 int8_t num_cam_to_expose; 627 char video_dev_name[MM_CAMERA_MAX_NUM_SENSORS][MM_CAMERA_DEV_NAME_LEN]; 628 mm_camera_obj_t *cam_obj[MM_CAMERA_MAX_NUM_SENSORS]; 629 struct camera_info info[MM_CAMERA_MAX_NUM_SENSORS]; 630 cam_sync_type_t cam_type[MM_CAMERA_MAX_NUM_SENSORS]; 631 cam_sync_mode_t cam_mode[MM_CAMERA_MAX_NUM_SENSORS]; 632 uint8_t is_yuv[MM_CAMERA_MAX_NUM_SENSORS]; // 1=CAM_SENSOR_YUV, 0=CAM_SENSOR_RAW 633 uint32_t cam_index[MM_CAMERA_MAX_NUM_SENSORS]; //Actual cam index are stored in bits 634 } mm_camera_ctrl_t; 635 636 typedef enum { 637 mm_camera_async_call, 638 mm_camera_sync_call 639 } mm_camera_call_type_t; 640 641 /*internal structure for registring frame sync*/ 642 typedef struct { 643 mm_camera_obj_t *a_cam_obj; 644 uint32_t a_ch_id; 645 uint32_t a_stream_id; 646 uint8_t is_active; 647 mm_camera_channel_attr_t attr; 648 mm_camera_buf_notify_t buf_cb; 649 uint8_t is_res_shared; 650 void *userdata; 651 } mm_camera_frame_sync_t; 652 653 /*Payload for reg frame sync event in MCI*/ 654 typedef struct { 655 uint32_t stream_id; 656 mm_channel_t *a_ch_obj; 657 mm_stream_t *a_str_obj; 658 mm_camera_frame_sync_t *sync_attr; 659 } mm_evt_paylod_reg_frame_sync; 660 661 /*Payload to handle frame sync */ 662 typedef struct { 663 uint32_t stream_id; 664 mm_camera_cb_req_type type; 665 } mm_evt_paylod_trigger_frame_sync; 666 667 668 /********************************************************************************** 669 * external function declare 670 ***********************************************************************************/ 671 /* utility functions */ 672 /* set int32_t value */ 673 extern int32_t mm_camera_util_s_ctrl(mm_camera_obj_t *my_obj, 674 int stream_id, int32_t fd, uint32_t id, int32_t *value); 675 676 /* get int32_t value */ 677 extern int32_t mm_camera_util_g_ctrl(mm_camera_obj_t *my_obj, 678 int stream_id, int32_t fd, uint32_t id, int32_t *value); 679 680 /* send msg throught domain socket for fd mapping */ 681 extern int32_t mm_camera_util_sendmsg(mm_camera_obj_t *my_obj, 682 void *msg, 683 size_t buf_size, 684 int sendfd); 685 686 /* send msg through domain socket for bundled fd mapping */ 687 extern int32_t mm_camera_util_bundled_sendmsg(mm_camera_obj_t *my_obj, 688 void *msg, 689 size_t buf_size, 690 int sendfds[CAM_MAX_NUM_BUFS_PER_STREAM], 691 int numfds); 692 693 /* Check if hardware target is A family */ 694 uint8_t mm_camera_util_chip_is_a_family(void); 695 696 /* mm-camera */ 697 extern int32_t mm_camera_open(mm_camera_obj_t *my_obj); 698 extern int32_t mm_camera_close(mm_camera_obj_t *my_obj); 699 extern int32_t mm_camera_register_event_notify(mm_camera_obj_t *my_obj, 700 mm_camera_event_notify_t evt_cb, 701 void * user_data); 702 extern int32_t mm_camera_qbuf(mm_camera_obj_t *my_obj, 703 uint32_t ch_id, 704 mm_camera_buf_def_t *buf); 705 extern int32_t mm_camera_cancel_buf(mm_camera_obj_t *my_obj, 706 uint32_t ch_id, 707 uint32_t stream_id, 708 uint32_t buf_idx); 709 extern int32_t mm_camera_get_queued_buf_count(mm_camera_obj_t *my_obj, 710 uint32_t ch_id, uint32_t stream_id); 711 extern int32_t mm_camera_query_capability(mm_camera_obj_t *my_obj); 712 extern int32_t mm_camera_set_parms(mm_camera_obj_t *my_obj, 713 parm_buffer_t *parms); 714 extern int32_t mm_camera_get_parms(mm_camera_obj_t *my_obj, 715 parm_buffer_t *parms); 716 extern int32_t mm_camera_map_buf(mm_camera_obj_t *my_obj, 717 uint8_t buf_type, 718 int fd, 719 size_t size, 720 void *buffer); 721 extern int32_t mm_camera_map_bufs(mm_camera_obj_t *my_obj, 722 const cam_buf_map_type_list *buf_map_list); 723 extern int32_t mm_camera_unmap_buf(mm_camera_obj_t *my_obj, 724 uint8_t buf_type); 725 extern int32_t mm_camera_do_auto_focus(mm_camera_obj_t *my_obj); 726 extern int32_t mm_camera_cancel_auto_focus(mm_camera_obj_t *my_obj); 727 extern int32_t mm_camera_prepare_snapshot(mm_camera_obj_t *my_obj, 728 int32_t do_af_flag); 729 extern int32_t mm_camera_start_zsl_snapshot(mm_camera_obj_t *my_obj); 730 extern int32_t mm_camera_stop_zsl_snapshot(mm_camera_obj_t *my_obj); 731 extern int32_t mm_camera_flush(mm_camera_obj_t *my_obj); 732 extern int32_t mm_camera_start_zsl_snapshot_ch(mm_camera_obj_t *my_obj, 733 uint32_t ch_id); 734 extern int32_t mm_camera_stop_zsl_snapshot_ch(mm_camera_obj_t *my_obj, 735 uint32_t ch_id); 736 extern uint32_t mm_camera_add_channel(mm_camera_obj_t *my_obj, 737 mm_camera_channel_attr_t *attr, 738 mm_camera_buf_notify_t channel_cb, 739 void *userdata); 740 extern int32_t mm_camera_del_channel(mm_camera_obj_t *my_obj, 741 uint32_t ch_id); 742 extern int32_t mm_camera_get_bundle_info(mm_camera_obj_t *my_obj, 743 uint32_t ch_id, 744 cam_bundle_config_t *bundle_info); 745 extern uint32_t mm_camera_add_stream(mm_camera_obj_t *my_obj, 746 uint32_t ch_id); 747 extern int32_t mm_camera_del_stream(mm_camera_obj_t *my_obj, 748 uint32_t ch_id, 749 uint32_t stream_id); 750 extern uint32_t mm_camera_link_stream(mm_camera_obj_t *my_obj, 751 uint32_t ch_id, 752 uint32_t stream_id, 753 uint32_t linked_ch_id); 754 755 extern int32_t mm_camera_reg_stream_buf_cb(mm_camera_obj_t *my_obj, 756 uint32_t ch_id, uint32_t stream_id, mm_camera_buf_notify_t buf_cb, 757 mm_camera_stream_cb_type cb_type, void *userdata); 758 extern int32_t mm_camera_config_stream(mm_camera_obj_t *my_obj, 759 uint32_t ch_id, 760 uint32_t stream_id, 761 mm_camera_stream_config_t *config); 762 extern int32_t mm_camera_start_channel(mm_camera_obj_t *my_obj, 763 uint32_t ch_id); 764 extern int32_t mm_camera_start_sensor_stream_on(mm_camera_obj_t *my_obj, 765 uint32_t ch_id); 766 extern int32_t mm_camera_stop_channel(mm_camera_obj_t *my_obj, 767 uint32_t ch_id, bool stop_immediately); 768 extern int32_t mm_camera_request_super_buf(mm_camera_obj_t *my_obj, 769 uint32_t ch_id, mm_camera_req_buf_t *buf); 770 extern int32_t mm_camera_cancel_super_buf_request(mm_camera_obj_t *my_obj, 771 uint32_t ch_id); 772 extern int32_t mm_camera_flush_super_buf_queue(mm_camera_obj_t *my_obj, 773 uint32_t ch_id, 774 uint32_t frame_idx); 775 extern int32_t mm_camera_config_channel_notify(mm_camera_obj_t *my_obj, 776 uint32_t ch_id, 777 mm_camera_super_buf_notify_mode_t notify_mode); 778 extern int32_t mm_camera_set_stream_parms(mm_camera_obj_t *my_obj, 779 uint32_t ch_id, 780 uint32_t s_id, 781 cam_stream_parm_buffer_t *parms); 782 extern int32_t mm_camera_get_stream_parms(mm_camera_obj_t *my_obj, 783 uint32_t ch_id, 784 uint32_t s_id, 785 cam_stream_parm_buffer_t *parms); 786 extern int32_t mm_camera_register_event_notify_internal(mm_camera_obj_t *my_obj, 787 mm_camera_event_notify_t evt_cb, 788 void * user_data); 789 extern int32_t mm_camera_map_stream_buf(mm_camera_obj_t *my_obj, 790 uint32_t ch_id, 791 uint32_t stream_id, 792 uint8_t buf_type, 793 uint32_t buf_idx, 794 int32_t plane_idx, 795 int fd, 796 size_t size, 797 void *buffer); 798 extern int32_t mm_camera_map_stream_bufs(mm_camera_obj_t *my_obj, 799 uint32_t ch_id, 800 const cam_buf_map_type_list *buf_map_list); 801 extern int32_t mm_camera_unmap_stream_buf(mm_camera_obj_t *my_obj, 802 uint32_t ch_id, 803 uint32_t stream_id, 804 uint8_t buf_type, 805 uint32_t buf_idx, 806 int32_t plane_idx); 807 extern int32_t mm_camera_do_stream_action(mm_camera_obj_t *my_obj, 808 uint32_t ch_id, 809 uint32_t stream_id, 810 void *actions); 811 extern int32_t mm_camera_get_session_id(mm_camera_obj_t *my_obj, 812 uint32_t* sessionid); 813 extern int32_t mm_camera_set_dual_cam_cmd(mm_camera_obj_t *my_obj); 814 extern int32_t mm_camera_reg_frame_sync(mm_camera_obj_t *my_obj, 815 uint32_t ch_id, uint32_t stream_id, 816 mm_camera_frame_sync_t *sync_attr); 817 extern int32_t mm_camera_handle_frame_sync_cb(mm_camera_obj_t *my_obj, 818 uint32_t ch_id, uint32_t stream_id, mm_camera_cb_req_type req_type); 819 820 /* mm_channel */ 821 extern int32_t mm_channel_fsm_fn(mm_channel_t *my_obj, 822 mm_channel_evt_type_t evt, 823 void * in_val, 824 void * out_val); 825 extern int32_t mm_channel_init(mm_channel_t *my_obj, 826 mm_camera_channel_attr_t *attr, 827 mm_camera_buf_notify_t channel_cb, 828 void *userdata); 829 /* qbuf is a special case that not going through state machine. 830 * This is to avoid deadlock when trying to aquire ch_lock, 831 * from the context of dataCB, but async stop is holding ch_lock */ 832 extern int32_t mm_channel_qbuf(mm_channel_t *my_obj, 833 mm_camera_buf_def_t *buf); 834 extern int32_t mm_channel_cancel_buf(mm_channel_t *my_obj, 835 uint32_t stream_id, uint32_t buf_idx); 836 /* mm_stream */ 837 extern int32_t mm_stream_fsm_fn(mm_stream_t *my_obj, 838 mm_stream_evt_type_t evt, 839 void * in_val, 840 void * out_val); 841 /* Function to register special callback for stream buffer*/ 842 extern int32_t mm_stream_reg_buf_cb(mm_stream_t *my_obj, 843 mm_stream_data_cb_t val); 844 extern int32_t mm_stream_map_buf(mm_stream_t *my_obj, 845 uint8_t buf_type, 846 uint32_t frame_idx, 847 int32_t plane_idx, 848 int fd, 849 size_t size, 850 void *buffer); 851 extern int32_t mm_stream_map_bufs(mm_stream_t *my_obj, 852 const cam_buf_map_type_list *buf_map_list); 853 extern int32_t mm_stream_unmap_buf(mm_stream_t *my_obj, 854 uint8_t buf_type, 855 uint32_t frame_idx, 856 int32_t plane_idx); 857 858 /* utiltity fucntion declared in mm-camera-inteface2.c 859 * and need be used by mm-camera and below*/ 860 uint32_t mm_camera_util_generate_handler(uint8_t index); 861 const char *mm_camera_util_get_dev_name(uint32_t cam_handler); 862 uint8_t mm_camera_util_get_index_by_handler(uint32_t handler); 863 864 /* poll/cmd thread functions */ 865 extern int32_t mm_camera_poll_thread_launch( 866 mm_camera_poll_thread_t * poll_cb, 867 mm_camera_poll_thread_type_t poll_type); 868 extern int32_t mm_camera_poll_thread_release(mm_camera_poll_thread_t *poll_cb); 869 extern int32_t mm_camera_poll_thread_add_poll_fd( 870 mm_camera_poll_thread_t * poll_cb, uint8_t idx, uint32_t handler, 871 int32_t fd, mm_camera_poll_notify_t nofity_cb, 872 void *userdata, mm_camera_call_type_t); 873 extern int32_t mm_camera_poll_thread_del_poll_fd( 874 mm_camera_poll_thread_t * poll_cb, uint8_t idx, uint32_t handler, 875 mm_camera_call_type_t); 876 extern int32_t mm_camera_poll_thread_commit_updates( 877 mm_camera_poll_thread_t * poll_cb); 878 extern int32_t mm_camera_cmd_thread_launch( 879 mm_camera_cmd_thread_t * cmd_thread, 880 mm_camera_cmd_cb_t cb, 881 void* user_data); 882 extern int32_t mm_camera_cmd_thread_name(const char* name); 883 extern int32_t mm_camera_cmd_thread_release(mm_camera_cmd_thread_t * cmd_thread); 884 885 extern int32_t mm_camera_channel_advanced_capture(mm_camera_obj_t *my_obj, 886 uint32_t ch_id, mm_camera_advanced_capture_t type, 887 uint32_t trigger, void *in_value); 888 int32_t mm_camera_enqueue_evt(mm_camera_obj_t *my_obj, 889 mm_camera_event_t *event); 890 int32_t mm_camera_load_shim_lib(); 891 cam_shim_packet_t *mm_camera_create_shim_cmd_packet(cam_shim_cmd_type type, 892 uint32_t sessionID, void *data); 893 int32_t mm_camera_destroy_shim_cmd_packet(cam_shim_packet_t *cmd); 894 int32_t mm_camera_module_event_handler( 895 uint32_t session_id, cam_event_t *event); 896 cam_status_t mm_camera_module_open_session(int sessionid, 897 int (*event_cb)(uint32_t sessionid, cam_event_t *event)); 898 int32_t mm_camera_module_close_session(int session); 899 int32_t mm_camera_module_send_cmd(cam_shim_packet_t *event); 900 901 #endif /* __MM_CAMERA_H__ */ 902