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 5
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
78struct mm_channel;
79struct mm_stream;
80struct mm_camera_obj;
81
82typedef int64_t nsecs_t;
83
84typedef 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
99typedef 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
106typedef 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
114typedef 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
122typedef struct {
123    uint32_t frame_idx;
124    cam_stream_type_t stream_type;
125} mm_camera_flush_cmd_t;
126
127typedef 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
140typedef void (*mm_camera_cmd_cb_t)(mm_camera_cmdcb_t * cmd_cb, void* user_data);
141
142typedef 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
153typedef 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 */
161typedef void (*mm_camera_poll_notify_t)(void *user_data);
162
163typedef 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
170typedef 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 */
191typedef 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
202typedef 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_STOP,
212    MM_STREAM_EVT_QBUF,
213    MM_STREAM_EVT_SET_PARM,
214    MM_STREAM_EVT_GET_PARM,
215    MM_STREAM_EVT_DO_ACTION,
216    MM_STREAM_EVT_GET_QUEUED_BUF_COUNT,
217    MM_STREAM_EVT_REG_FRAME_SYNC,
218    MM_STREAM_EVT_TRIGGER_FRAME_SYNC,
219    MM_STREAM_EVT_CANCEL_BUF,
220    MM_STREAM_EVT_MAX
221} mm_stream_evt_type_t;
222
223typedef struct {
224    mm_camera_buf_notify_t cb;
225    void *user_data;
226    /* cb_count = -1: infinite
227     * cb_count > 0: register only for required times */
228    int8_t cb_count;
229    mm_camera_stream_cb_type cb_type;
230} mm_stream_data_cb_t;
231
232typedef struct {
233    /* buf reference count */
234    uint8_t buf_refcnt;
235
236    /* This flag is to indicate if after allocation,
237     * the corresponding buf needs to qbuf into kernel
238     * (e.g. for preview usecase, display needs to hold two bufs,
239     * so no need to qbuf these two bufs initially) */
240    uint8_t initial_reg_flag;
241
242    /* indicate if buf is in kernel(1) or client(0) */
243    uint8_t in_kernel;
244    /*indicate if this buffer is mapped to daemon*/
245    int8_t map_status;
246} mm_stream_buf_status_t;
247
248/*Structure definition to carry frame sync queue details*/
249typedef struct {
250    /*Number of objects to be synced*/
251    uint8_t num_objs;
252    /*Object handle to be synced*/
253    uint32_t bundled_objs[MAX_OBJS_FOR_FRAME_SYNC];
254    /*Queue*/
255    cam_queue_t que;
256
257    /*queue attributed*/
258    mm_camera_channel_attr_t attr;
259
260    /*Expected frame for this queue*/
261    uint32_t expected_frame_id;
262
263    /*Total match count*/
264    uint32_t match_cnt;
265} mm_frame_sync_queue_t;
266
267/*Structure definition to carry frame sync details*/
268typedef struct {
269    /* flag to indicate if frame sync is active*/
270    uint8_t is_active;
271
272    /*Frame sync lock. Shared between child and parent stream*/
273    pthread_mutex_t sync_lock;
274
275    /*Limited number of synced frame request*/
276    mm_camera_req_buf_t req_buf;
277
278    /*Queue to hold super buffers*/
279    mm_frame_sync_queue_t superbuf_queue;
280
281    /*Callback registered for synced frame*/
282    mm_camera_buf_notify_t super_buf_notify_cb;
283
284    /*Client data*/
285    void *user_data;
286} mm_frame_sync_t;
287
288struct mm_stream;
289typedef struct mm_stream {
290    uint32_t my_hdl; /* local stream id */
291    uint32_t server_stream_id; /* stream id from server */
292    int32_t fd;
293    mm_stream_state_type_t state;
294
295    /* stream info*/
296    cam_stream_info_t *stream_info;
297
298    /* padding info */
299    cam_padding_info_t padding_info;
300
301    /* offset */
302    cam_frame_len_offset_t frame_offset;
303
304    pthread_mutex_t cmd_lock; /* lock to protect cmd_thread */
305    mm_camera_cmd_thread_t cmd_thread;
306
307    /* dataCB registered on this stream obj */
308    uint8_t is_cb_active;
309    pthread_mutex_t cb_lock; /* cb lock to protect buf_cb */
310    mm_stream_data_cb_t buf_cb[MM_CAMERA_STREAM_BUF_CB_MAX];
311
312    /* stream buffer management */
313    pthread_mutex_t buf_lock;
314    uint8_t total_buf_cnt; /*Total number of buffer including slave*/
315    uint8_t buf_num; /* num of buffers for this stream */
316    uint8_t buf_idx; /* starting buffer index */
317
318    mm_camera_buf_def_t* buf; /* ptr to buf array */
319    mm_stream_buf_status_t buf_status[CAM_MAX_NUM_BUFS_PER_STREAM]; /* ptr to buf status array */
320
321    uint8_t plane_buf_num; /* num of plane buffers allocated  Used only in Batch mode*/
322    mm_camera_buf_def_t *plane_buf; /*Pointer to plane buffer array Used only in Batch mode */
323    int32_t cur_buf_idx; /* Current container buffer active filling. Used only in Batch mode*/
324    uint8_t cur_bufs_staged; /*Number of plane buf freed by HAL for this usr buf*/
325
326    /* reference to parent channel_obj */
327    struct mm_channel* ch_obj;
328
329    uint8_t is_bundled; /* flag if stream is bundled */
330
331    /* reference to linked channel_obj */
332    struct mm_channel* linked_obj;
333    struct mm_stream * linked_stream; /* original stream */
334    uint8_t is_linked; /* flag if stream is linked */
335
336    mm_camera_stream_mem_vtbl_t mem_vtbl; /* mem ops tbl */
337    mm_camera_map_unmap_ops_tbl_t map_ops;
338
339    int8_t queued_buffer_count;
340
341    /*latest timestamp of this stream frame received & last frameID*/
342    uint32_t prev_frameID;
343    nsecs_t prev_timestamp;
344
345    /* Need to wait for buffer mapping before stream-on*/
346    pthread_cond_t buf_cond;
347
348    struct mm_stream *master_str_obj; /*Master stream of this stream*/
349    uint8_t num_s_cnt;
350    struct mm_stream *aux_str_obj[MM_CAMERA_MAX_AUX_CAMERA];  /*aux stream of this stream*/
351    mm_frame_sync_t frame_sync;
352    uint8_t is_res_shared;
353} mm_stream_t;
354
355/* mm_channel */
356typedef enum {
357    MM_CHANNEL_STATE_NOTUSED = 0,   /* not used */
358    MM_CHANNEL_STATE_STOPPED,       /* stopped */
359    MM_CHANNEL_STATE_ACTIVE,        /* active, at least one stream active */
360    MM_CHANNEL_STATE_PAUSED,        /* paused */
361    MM_CHANNEL_STATE_MAX
362} mm_channel_state_type_t;
363
364typedef enum {
365    MM_CHANNEL_EVT_ADD_STREAM,
366    MM_CHANNEL_EVT_DEL_STREAM,
367    MM_CHANNEL_EVT_LINK_STREAM,
368    MM_CHANNEL_EVT_CONFIG_STREAM,
369    MM_CHANNEL_EVT_GET_BUNDLE_INFO,
370    MM_CHANNEL_EVT_START,
371    MM_CHANNEL_EVT_STOP,
372    MM_CHANNEL_EVT_PAUSE,
373    MM_CHANNEL_EVT_RESUME,
374    MM_CHANNEL_EVT_REQUEST_SUPER_BUF,
375    MM_CHANNEL_EVT_CANCEL_REQUEST_SUPER_BUF,
376    MM_CHANNEL_EVT_FLUSH_SUPER_BUF_QUEUE,
377    MM_CHANNEL_EVT_CONFIG_NOTIFY_MODE,
378    MM_CHANNEL_EVT_START_ZSL_SNAPSHOT,
379    MM_CHANNEL_EVT_STOP_ZSL_SNAPSHOT,
380    MM_CHANNEL_EVT_MAP_STREAM_BUF,
381    MM_CHANNEL_EVT_UNMAP_STREAM_BUF,
382    MM_CHANNEL_EVT_SET_STREAM_PARM,
383    MM_CHANNEL_EVT_GET_STREAM_PARM,
384    MM_CHANNEL_EVT_DO_ACTION,
385    MM_CHANNEL_EVT_DELETE,
386    MM_CHANNEL_EVT_AF_BRACKETING,
387    MM_CHANNEL_EVT_AE_BRACKETING,
388    MM_CHANNEL_EVT_FLASH_BRACKETING,
389    MM_CHANNEL_EVT_ZOOM_1X,
390    MM_CAMERA_EVT_CAPTURE_SETTING,
391    MM_CHANNEL_EVT_GET_STREAM_QUEUED_BUF_COUNT,
392    MM_CHANNEL_EVT_MAP_STREAM_BUFS,
393    MM_CHANNEL_EVT_REG_STREAM_BUF_CB,
394    MM_CHANNEL_EVT_REG_FRAME_SYNC,
395    MM_CHANNEL_EVT_TRIGGER_FRAME_SYNC,
396} mm_channel_evt_type_t;
397
398typedef struct {
399    uint32_t stream_id;
400    mm_camera_stream_config_t *config;
401} mm_evt_paylod_config_stream_t;
402
403typedef struct {
404    uint32_t stream_id;
405    cam_stream_parm_buffer_t *parms;
406} mm_evt_paylod_set_get_stream_parms_t;
407
408typedef struct {
409    uint32_t stream_id;
410    void *actions;
411} mm_evt_paylod_do_stream_action_t;
412
413typedef struct {
414    uint32_t stream_id;
415    mm_stream_data_cb_t buf_cb;
416} mm_evt_paylod_reg_stream_buf_cb;
417
418typedef struct {
419    uint8_t num_of_bufs;
420    mm_camera_buf_info_t super_buf[MAX_STREAM_NUM_IN_BUNDLE];
421    uint8_t matched;
422    uint8_t expected_frame;
423    uint32_t frame_idx;
424    /* unmatched meta idx needed in case of low priority queue */
425    uint32_t unmatched_meta_idx;
426} mm_channel_queue_node_t;
427
428typedef struct {
429    cam_queue_t que;
430    uint8_t num_streams;
431    /* container for bundled stream handlers */
432    uint32_t bundled_streams[MAX_STREAM_NUM_IN_BUNDLE];
433    mm_camera_channel_attr_t attr;
434    uint32_t expected_frame_id;
435    uint32_t match_cnt;
436    uint32_t expected_frame_id_without_led;
437    uint32_t led_on_start_frame_id;
438    uint32_t led_off_start_frame_id;
439    uint32_t led_on_num_frames;
440    uint32_t once;
441    uint32_t frame_skip_count;
442    uint32_t good_frame_id;
443} mm_channel_queue_t;
444
445typedef struct {
446    uint8_t is_active; /* flag to indicate if bundle is valid */
447    /* queue to store bundled super buffers */
448    uint8_t is_cb_active;
449    mm_channel_queue_t superbuf_queue;
450    mm_camera_buf_notify_t super_buf_notify_cb;
451    void *user_data;
452} mm_channel_bundle_t;
453
454/* Nodes used for frame sync */
455typedef struct {
456    /* Frame idx */
457    uint32_t frame_idx;
458    /* Frame present for corresponding channel*/
459    uint32_t frame_valid[MAX_NUM_CAMERA_PER_BUNDLE];
460    /* Frame present in all channels*/
461    uint32_t matched;
462} mm_channel_sync_node_t;
463
464/* Frame sync information */
465typedef struct {
466    /* Number of camera channels that need to be synced*/
467    uint8_t num_cam;
468    /* position of the next node to be updated */
469    uint8_t pos;
470    /* circular node array used to store frame information */
471    mm_channel_sync_node_t node[MM_CAMERA_FRAME_SYNC_NODES];
472    /* Channel corresponding to each camera */
473    struct mm_channel *ch_obj[MAX_NUM_CAMERA_PER_BUNDLE];
474    /* Cb corresponding to each camera */
475    mm_camera_buf_notify_t cb[MAX_NUM_CAMERA_PER_BUNDLE];
476} mm_channel_frame_sync_info_t;
477
478/* Node information for multiple superbuf callbacks
479*  This can be used to batch nodes before sending to upper layer */
480typedef struct {
481    /* Number of nodes to be sent*/
482    uint8_t num_nodes;
483    /* queue node information*/
484    mm_channel_queue_node_t *node[MAX_NUM_CAMERA_PER_BUNDLE];
485    /* channel information*/
486    struct mm_channel *ch_obj[MAX_NUM_CAMERA_PER_BUNDLE];
487} mm_channel_node_info_t;
488
489typedef enum {
490    MM_CHANNEL_BRACKETING_STATE_OFF,
491    MM_CHANNEL_BRACKETING_STATE_WAIT_GOOD_FRAME_IDX,
492    MM_CHANNEL_BRACKETING_STATE_ACTIVE,
493} mm_channel_bracketing_state_t;
494
495struct mm_channel;
496typedef struct mm_channel {
497    uint32_t my_hdl;
498    mm_channel_state_type_t state;
499    pthread_mutex_t ch_lock; /* channel lock */
500
501    /* stream bundle info in the channel */
502    mm_channel_bundle_t bundle;
503
504    /* num of pending suferbuffers */
505    uint32_t pending_cnt;
506    uint32_t pending_retro_cnt;
507    mm_camera_req_buf_type_t req_type;
508    uint32_t bWaitForPrepSnapshotDone;
509    uint32_t unLockAEC;
510    /* num of pending suferbuffers */
511    uint8_t stopZslSnapshot;
512
513    /* cmd thread for superbuffer dataCB and async stop*/
514    mm_camera_cmd_thread_t cmd_thread;
515
516    /* cb thread for sending data cb */
517    mm_camera_cmd_thread_t cb_thread;
518
519    /* data poll thread
520    * currently one data poll thread per channel
521    * could extended to support one data poll thread per stream in the channel */
522    mm_camera_poll_thread_t poll_thread[MM_CAMERA_CHANNEL_POLL_THREAD_MAX];
523
524    /* container for all streams in channel */
525    mm_stream_t streams[MAX_STREAM_NUM_IN_BUNDLE];
526
527    /* reference to parent cam_obj */
528    struct mm_camera_obj* cam_obj;
529
530    /* manual zsl snapshot control */
531    uint8_t manualZSLSnapshot;
532
533    /* control for zsl led */
534    uint8_t startZSlSnapshotCalled;
535    uint8_t needLEDFlash;
536    mm_channel_bracketing_state_t bracketingState;
537    uint8_t isFlashBracketingEnabled;
538    uint8_t isZoom1xFrameRequested;
539    uint32_t burstSnapNum;
540    char threadName[THREAD_NAME_SIZE];
541
542    /*Buffer diverted*/
543    uint8_t diverted_frame_id;
544    uint32_t sessionid;
545
546    /*Frame capture configaration*/
547    uint8_t isConfigCapture;
548    uint8_t cur_capture_idx;
549    uint32_t capture_frame_id[MAX_CAPTURE_BATCH_NUM];
550    cam_capture_frame_config_t frameConfig;
551    uint8_t needLowLightZSL;
552
553    /*Capture based on index*/
554    uint8_t cur_req_idx;
555    uint8_t frame_req_cnt;
556    uint32_t requested_frame_id[MAX_CAPTURE_BATCH_NUM];
557
558    /*For channel frame sync*/
559    mm_frame_sync_t frame_sync;
560
561    /*Multiple camera's*/
562    struct mm_channel *master_ch_obj; /*Master channel of this channel*/
563    uint8_t num_s_cnt;
564    struct mm_channel *aux_ch_obj[MM_CAMERA_MAX_AUX_CAMERA];  /*Slave channel of this channel*/
565} mm_channel_t;
566
567typedef struct {
568    mm_channel_t *ch;
569    uint32_t stream_id;
570} mm_camera_stream_link_t;
571
572/* struct to store information about pp cookie*/
573typedef struct {
574    uint32_t cam_hdl;
575    uint32_t ch_hdl;
576    uint32_t stream_hdl;
577    mm_channel_queue_node_t *super_buf;
578} mm_channel_pp_info_t;
579
580/* mm_camera */
581typedef struct {
582    mm_camera_event_notify_t evt_cb;
583    void *user_data;
584} mm_camera_evt_entry_t;
585
586typedef struct {
587    mm_camera_evt_entry_t evt[MM_CAMERA_EVT_ENTRY_MAX];
588    /* reg_count <=0: infinite
589     * reg_count > 0: register only for required times */
590    int reg_count;
591} mm_camera_evt_obj_t;
592
593struct mm_camera_obj;
594typedef struct mm_camera_obj {
595    uint32_t my_hdl;
596    int ref_count;
597    int32_t ctrl_fd;
598    int32_t ds_fd; /* domain socket fd */
599    pthread_mutex_t cam_lock;
600    pthread_mutex_t cb_lock; /* lock for evt cb */
601    mm_channel_t ch[MM_CAMERA_CHANNEL_MAX];
602    mm_camera_evt_obj_t evt;
603    mm_camera_poll_thread_t evt_poll_thread; /* evt poll thread */
604    mm_camera_cmd_thread_t evt_thread;       /* thread for evt CB */
605    mm_camera_vtbl_t vtbl;
606
607    pthread_mutex_t evt_lock;
608    pthread_cond_t evt_cond;
609    mm_camera_event_t evt_rcvd;
610
611    pthread_mutex_t msg_lock; /* lock for sending msg through socket */
612    uint32_t sessionid; /* Camera server session id */
613
614    uint8_t my_num;          /*this camera position in multi mode*/
615    pthread_mutex_t muxer_lock;
616    struct mm_camera_obj *master_cam_obj; /*Master Camera of this camera*/
617    uint8_t num_s_cnt;
618    struct mm_camera_obj *aux_cam_obj[MM_CAMERA_MAX_AUX_CAMERA];  /*Slave Camera of this camera*/
619} mm_camera_obj_t;
620
621typedef struct {
622    int8_t num_cam;
623    mm_camera_shim_ops_t cam_shim_ops;
624    char video_dev_name[MM_CAMERA_MAX_NUM_SENSORS][MM_CAMERA_DEV_NAME_LEN];
625    mm_camera_obj_t *cam_obj[MM_CAMERA_MAX_NUM_SENSORS];
626    struct camera_info info[MM_CAMERA_MAX_NUM_SENSORS];
627    cam_sync_type_t cam_type[MM_CAMERA_MAX_NUM_SENSORS];
628    cam_sync_mode_t cam_mode[MM_CAMERA_MAX_NUM_SENSORS];
629    uint8_t is_yuv[MM_CAMERA_MAX_NUM_SENSORS]; // 1=CAM_SENSOR_YUV, 0=CAM_SENSOR_RAW
630    uint32_t cam_index[MM_CAMERA_MAX_NUM_SENSORS]; //Actual cam index are stored in bits
631} mm_camera_ctrl_t;
632
633typedef enum {
634    mm_camera_async_call,
635    mm_camera_sync_call
636} mm_camera_call_type_t;
637
638/*internal structure for registring frame sync*/
639typedef struct {
640    mm_camera_obj_t *a_cam_obj;
641    uint32_t a_ch_id;
642    uint32_t a_stream_id;
643    uint8_t is_active;
644    mm_camera_channel_attr_t attr;
645    mm_camera_buf_notify_t buf_cb;
646    uint8_t is_res_shared;
647    void *userdata;
648} mm_camera_frame_sync_t;
649
650/*Payload for reg frame sync event in MCI*/
651typedef struct {
652    uint32_t stream_id;
653    mm_channel_t *a_ch_obj;
654    mm_stream_t *a_str_obj;
655    mm_camera_frame_sync_t *sync_attr;
656} mm_evt_paylod_reg_frame_sync;
657
658/*Payload to handle frame sync */
659typedef struct {
660    uint32_t stream_id;
661    mm_camera_cb_req_type type;
662} mm_evt_paylod_trigger_frame_sync;
663
664
665/**********************************************************************************
666* external function declare
667***********************************************************************************/
668/* utility functions */
669/* set int32_t value */
670extern int32_t mm_camera_util_s_ctrl(mm_camera_obj_t *my_obj,
671        int stream_id, int32_t fd, uint32_t id, int32_t *value);
672
673/* get int32_t value */
674extern int32_t mm_camera_util_g_ctrl(mm_camera_obj_t *my_obj,
675        int stream_id, int32_t fd, uint32_t id, int32_t *value);
676
677/* send msg throught domain socket for fd mapping */
678extern int32_t mm_camera_util_sendmsg(mm_camera_obj_t *my_obj,
679                                      void *msg,
680                                      size_t buf_size,
681                                      int sendfd);
682
683/* send msg through domain socket for bundled fd mapping */
684extern int32_t mm_camera_util_bundled_sendmsg(mm_camera_obj_t *my_obj,
685                                              void *msg,
686                                              size_t buf_size,
687                                              int sendfds[CAM_MAX_NUM_BUFS_PER_STREAM],
688                                              int numfds);
689
690/* Check if hardware target is A family */
691uint8_t mm_camera_util_chip_is_a_family(void);
692
693/* mm-camera */
694extern int32_t mm_camera_open(mm_camera_obj_t *my_obj);
695extern int32_t mm_camera_close(mm_camera_obj_t *my_obj);
696extern int32_t mm_camera_register_event_notify(mm_camera_obj_t *my_obj,
697                                               mm_camera_event_notify_t evt_cb,
698                                               void * user_data);
699extern int32_t mm_camera_qbuf(mm_camera_obj_t *my_obj,
700                              uint32_t ch_id,
701                              mm_camera_buf_def_t *buf);
702extern int32_t mm_camera_cancel_buf(mm_camera_obj_t *my_obj,
703                       uint32_t ch_id,
704                       uint32_t stream_id,
705                       uint32_t buf_idx);
706extern int32_t mm_camera_get_queued_buf_count(mm_camera_obj_t *my_obj,
707        uint32_t ch_id, uint32_t stream_id);
708extern int32_t mm_camera_query_capability(mm_camera_obj_t *my_obj);
709extern int32_t mm_camera_set_parms(mm_camera_obj_t *my_obj,
710                                   parm_buffer_t *parms);
711extern int32_t mm_camera_get_parms(mm_camera_obj_t *my_obj,
712                                   parm_buffer_t *parms);
713extern int32_t mm_camera_map_buf(mm_camera_obj_t *my_obj,
714                                 uint8_t buf_type,
715                                 int fd,
716                                 size_t size,
717                                 void *buffer);
718extern int32_t mm_camera_map_bufs(mm_camera_obj_t *my_obj,
719                                  const cam_buf_map_type_list *buf_map_list);
720extern int32_t mm_camera_unmap_buf(mm_camera_obj_t *my_obj,
721                                   uint8_t buf_type);
722extern int32_t mm_camera_do_auto_focus(mm_camera_obj_t *my_obj);
723extern int32_t mm_camera_cancel_auto_focus(mm_camera_obj_t *my_obj);
724extern int32_t mm_camera_prepare_snapshot(mm_camera_obj_t *my_obj,
725                                          int32_t do_af_flag);
726extern int32_t mm_camera_start_zsl_snapshot(mm_camera_obj_t *my_obj);
727extern int32_t mm_camera_stop_zsl_snapshot(mm_camera_obj_t *my_obj);
728extern int32_t mm_camera_flush(mm_camera_obj_t *my_obj);
729extern int32_t mm_camera_start_zsl_snapshot_ch(mm_camera_obj_t *my_obj,
730        uint32_t ch_id);
731extern int32_t mm_camera_stop_zsl_snapshot_ch(mm_camera_obj_t *my_obj,
732        uint32_t ch_id);
733extern uint32_t mm_camera_add_channel(mm_camera_obj_t *my_obj,
734                                      mm_camera_channel_attr_t *attr,
735                                      mm_camera_buf_notify_t channel_cb,
736                                      void *userdata);
737extern int32_t mm_camera_del_channel(mm_camera_obj_t *my_obj,
738                                     uint32_t ch_id);
739extern int32_t mm_camera_get_bundle_info(mm_camera_obj_t *my_obj,
740                                         uint32_t ch_id,
741                                         cam_bundle_config_t *bundle_info);
742extern uint32_t mm_camera_add_stream(mm_camera_obj_t *my_obj,
743                                     uint32_t ch_id);
744extern int32_t mm_camera_del_stream(mm_camera_obj_t *my_obj,
745                                    uint32_t ch_id,
746                                    uint32_t stream_id);
747extern uint32_t mm_camera_link_stream(mm_camera_obj_t *my_obj,
748        uint32_t ch_id,
749        uint32_t stream_id,
750        uint32_t linked_ch_id);
751
752extern int32_t mm_camera_reg_stream_buf_cb(mm_camera_obj_t *my_obj,
753        uint32_t ch_id, uint32_t stream_id, mm_camera_buf_notify_t buf_cb,
754        mm_camera_stream_cb_type cb_type, void *userdata);
755extern int32_t mm_camera_config_stream(mm_camera_obj_t *my_obj,
756                                       uint32_t ch_id,
757                                       uint32_t stream_id,
758                                       mm_camera_stream_config_t *config);
759extern int32_t mm_camera_start_channel(mm_camera_obj_t *my_obj,
760                                       uint32_t ch_id);
761extern int32_t mm_camera_stop_channel(mm_camera_obj_t *my_obj,
762                                      uint32_t ch_id);
763extern int32_t mm_camera_request_super_buf(mm_camera_obj_t *my_obj,
764        uint32_t ch_id, mm_camera_req_buf_t *buf);
765extern int32_t mm_camera_cancel_super_buf_request(mm_camera_obj_t *my_obj,
766                                                  uint32_t ch_id);
767extern int32_t mm_camera_flush_super_buf_queue(mm_camera_obj_t *my_obj,
768                                               uint32_t ch_id,
769                                               uint32_t frame_idx);
770extern int32_t mm_camera_config_channel_notify(mm_camera_obj_t *my_obj,
771                                               uint32_t ch_id,
772                                               mm_camera_super_buf_notify_mode_t notify_mode);
773extern int32_t mm_camera_set_stream_parms(mm_camera_obj_t *my_obj,
774                                          uint32_t ch_id,
775                                          uint32_t s_id,
776                                          cam_stream_parm_buffer_t *parms);
777extern int32_t mm_camera_get_stream_parms(mm_camera_obj_t *my_obj,
778                                          uint32_t ch_id,
779                                          uint32_t s_id,
780                                          cam_stream_parm_buffer_t *parms);
781extern int32_t mm_camera_register_event_notify_internal(mm_camera_obj_t *my_obj,
782                                                        mm_camera_event_notify_t evt_cb,
783                                                        void * user_data);
784extern int32_t mm_camera_map_stream_buf(mm_camera_obj_t *my_obj,
785                                        uint32_t ch_id,
786                                        uint32_t stream_id,
787                                        uint8_t buf_type,
788                                        uint32_t buf_idx,
789                                        int32_t plane_idx,
790                                        int fd,
791                                        size_t size,
792                                        void *buffer);
793extern int32_t mm_camera_map_stream_bufs(mm_camera_obj_t *my_obj,
794                                         uint32_t ch_id,
795                                         const cam_buf_map_type_list *buf_map_list);
796extern int32_t mm_camera_unmap_stream_buf(mm_camera_obj_t *my_obj,
797                                          uint32_t ch_id,
798                                          uint32_t stream_id,
799                                          uint8_t buf_type,
800                                          uint32_t buf_idx,
801                                          int32_t plane_idx);
802extern int32_t mm_camera_do_stream_action(mm_camera_obj_t *my_obj,
803                                          uint32_t ch_id,
804                                          uint32_t stream_id,
805                                          void *actions);
806extern int32_t mm_camera_get_session_id(mm_camera_obj_t *my_obj,
807                                        uint32_t* sessionid);
808extern int32_t mm_camera_set_dual_cam_cmd(mm_camera_obj_t *my_obj);
809extern int32_t mm_camera_reg_frame_sync(mm_camera_obj_t *my_obj,
810        uint32_t ch_id, uint32_t stream_id,
811        mm_camera_frame_sync_t *sync_attr);
812extern int32_t mm_camera_handle_frame_sync_cb(mm_camera_obj_t *my_obj,
813        uint32_t ch_id, uint32_t stream_id, mm_camera_cb_req_type req_type);
814
815/* mm_channel */
816extern int32_t mm_channel_fsm_fn(mm_channel_t *my_obj,
817                                 mm_channel_evt_type_t evt,
818                                 void * in_val,
819                                 void * out_val);
820extern int32_t mm_channel_init(mm_channel_t *my_obj,
821                               mm_camera_channel_attr_t *attr,
822                               mm_camera_buf_notify_t channel_cb,
823                               void *userdata);
824/* qbuf is a special case that not going through state machine.
825 * This is to avoid deadlock when trying to aquire ch_lock,
826 * from the context of dataCB, but async stop is holding ch_lock */
827extern int32_t mm_channel_qbuf(mm_channel_t *my_obj,
828                               mm_camera_buf_def_t *buf);
829extern int32_t mm_channel_cancel_buf(mm_channel_t *my_obj,
830                        uint32_t stream_id, uint32_t buf_idx);
831/* mm_stream */
832extern int32_t mm_stream_fsm_fn(mm_stream_t *my_obj,
833                                mm_stream_evt_type_t evt,
834                                void * in_val,
835                                void * out_val);
836/* Function to register special callback for stream buffer*/
837extern int32_t mm_stream_reg_buf_cb(mm_stream_t *my_obj,
838        mm_stream_data_cb_t val);
839extern int32_t mm_stream_map_buf(mm_stream_t *my_obj,
840                                 uint8_t buf_type,
841                                 uint32_t frame_idx,
842                                 int32_t plane_idx,
843                                 int fd,
844                                 size_t size,
845                                 void *buffer);
846extern int32_t mm_stream_map_bufs(mm_stream_t *my_obj,
847                                  const cam_buf_map_type_list *buf_map_list);
848extern int32_t mm_stream_unmap_buf(mm_stream_t *my_obj,
849                                   uint8_t buf_type,
850                                   uint32_t frame_idx,
851                                   int32_t plane_idx);
852
853/* utiltity fucntion declared in mm-camera-inteface2.c
854 * and need be used by mm-camera and below*/
855uint32_t mm_camera_util_generate_handler(uint8_t index);
856const char *mm_camera_util_get_dev_name(uint32_t cam_handler);
857uint8_t mm_camera_util_get_index_by_handler(uint32_t handler);
858
859/* poll/cmd thread functions */
860extern int32_t mm_camera_poll_thread_launch(
861                                mm_camera_poll_thread_t * poll_cb,
862                                mm_camera_poll_thread_type_t poll_type);
863extern int32_t mm_camera_poll_thread_release(mm_camera_poll_thread_t *poll_cb);
864extern int32_t mm_camera_poll_thread_add_poll_fd(
865        mm_camera_poll_thread_t * poll_cb, uint8_t idx, uint32_t handler,
866        int32_t fd, mm_camera_poll_notify_t nofity_cb,
867        void *userdata, mm_camera_call_type_t);
868extern int32_t mm_camera_poll_thread_del_poll_fd(
869        mm_camera_poll_thread_t * poll_cb, uint8_t idx, uint32_t handler,
870        mm_camera_call_type_t);
871extern int32_t mm_camera_poll_thread_commit_updates(
872        mm_camera_poll_thread_t * poll_cb);
873extern int32_t mm_camera_cmd_thread_launch(
874                                mm_camera_cmd_thread_t * cmd_thread,
875                                mm_camera_cmd_cb_t cb,
876                                void* user_data);
877extern int32_t mm_camera_cmd_thread_name(const char* name);
878extern int32_t mm_camera_cmd_thread_release(mm_camera_cmd_thread_t * cmd_thread);
879
880extern int32_t mm_camera_channel_advanced_capture(mm_camera_obj_t *my_obj,
881        uint32_t ch_id, mm_camera_advanced_capture_t type,
882        uint32_t trigger, void *in_value);
883int32_t mm_camera_enqueue_evt(mm_camera_obj_t *my_obj,
884                              mm_camera_event_t *event);
885int32_t mm_camera_load_shim_lib();
886cam_shim_packet_t *mm_camera_create_shim_cmd_packet(cam_shim_cmd_type type,
887        uint32_t sessionID, void *data);
888int32_t mm_camera_destroy_shim_cmd_packet(cam_shim_packet_t *cmd);
889int32_t mm_camera_module_event_handler(
890        uint32_t session_id, cam_event_t *event);
891cam_status_t mm_camera_module_open_session(int sessionid,
892        int (*event_cb)(uint32_t sessionid, cam_event_t *event));
893int32_t mm_camera_module_close_session(int session);
894int32_t mm_camera_module_send_cmd(cam_shim_packet_t *event);
895
896#endif /* __MM_CAMERA_H__ */
897