1 /* 2 Copyright (c) 2011-2012, Code Aurora Forum. 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 Code Aurora Forum, Inc. 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_H__ 31 #define __MM_CAMERA_H__ 32 33 #define TRUE 1 34 #define FALSE 0 35 36 typedef enum { 37 MM_CAMERA_STREAM_STATE_NOTUSED, /* not used */ 38 MM_CAMERA_STREAM_STATE_ACQUIRED, /* acquired, fd opened */ 39 MM_CAMERA_STREAM_STATE_CFG, /* fmt & dim configured */ 40 MM_CAMERA_STREAM_STATE_REG, /* buf regged, stream off */ 41 MM_CAMERA_STREAM_STATE_ACTIVE, /* stream on */ 42 MM_CAMERA_STREAM_STATE_MAX 43 } mm_camera_stream_state_type_t; 44 45 typedef enum { 46 MM_CAMERA_STATE_EVT_NOTUSED, 47 MM_CAMERA_STATE_EVT_ACQUIRE, 48 MM_CAMERA_STATE_EVT_ATTR, 49 MM_CAMERA_STATE_EVT_RELEASE, 50 MM_CAMERA_STATE_EVT_REG_BUF_CB, 51 MM_CAMERA_STATE_EVT_SET_FMT, 52 MM_CAMERA_STATE_EVT_SET_DIM, 53 MM_CAMERA_STATE_EVT_REG_BUF, // request amount of buffers and enqueue all buffers to kernel 54 MM_CAMERA_STATE_EVT_UNREG_BUF, 55 MM_CAMERA_STATE_EVT_STREAM_ON, 56 MM_CAMERA_STATE_EVT_STREAM_OFF, 57 MM_CAMERA_STATE_EVT_QBUF, 58 MM_CAMERA_STATE_EVT_GET_CROP, 59 MM_CAMERA_STATE_EVT_DISPATCH_BUFFERED_FRAME, 60 MM_CAMERA_STATE_EVT_REQUEST_BUF, // request amount of buffers to kernel only 61 MM_CAMERA_STATE_EVT_ENQUEUE_BUF, // enqueue some of buffers to kernel only 62 MM_CAMERA_STATE_EVT_MAX 63 } mm_camera_state_evt_type_t; 64 65 typedef struct { 66 mm_camera_event_notify_t evt_cb; 67 void * user_data; 68 } mm_camera_notify_cb_t; 69 70 typedef enum { 71 MM_CAMERA_BUF_CB_ONCE, 72 MM_CAMERA_BUF_CB_COUNT, 73 MM_CAMERA_BUF_CB_INFINITE 74 } mm_camera_buf_cb_type_t; 75 76 typedef struct { 77 mm_camera_buf_notify_t cb; 78 mm_camera_buf_cb_type_t cb_type; 79 uint32_t cb_count; 80 void *user_data; 81 } mm_camera_buf_cb_t; 82 83 typedef enum { 84 MM_CAMERA_STREAM_PIPE, 85 MM_CAMERA_STREAM_PREVIEW, 86 MM_CAMERA_STREAM_VIDEO, 87 MM_CAMERA_STREAM_SNAPSHOT, 88 MM_CAMERA_STREAM_THUMBNAIL, 89 MM_CAMERA_STREAM_RAW, 90 MM_CAMERA_STREAM_VIDEO_MAIN, 91 MM_CAMERA_STREAM_MAX 92 } mm_camera_stream_type_t; 93 94 typedef struct mm_camera_frame_t mm_camera_frame_t; 95 struct mm_camera_frame_t{ 96 struct msm_frame frame; 97 struct v4l2_plane planes[VIDEO_MAX_PLANES]; 98 uint8_t num_planes; 99 int idx; 100 int match; 101 int valid_entry; 102 mm_camera_frame_t *next; 103 }; 104 105 typedef struct { 106 pthread_mutex_t mutex; 107 int cnt; 108 int match_cnt; 109 mm_camera_frame_t *head; 110 mm_camera_frame_t *tail; 111 } mm_camera_frame_queue_t; 112 113 typedef struct { 114 mm_camera_frame_queue_t readyq; 115 int32_t num_frame; 116 uint32_t frame_len; 117 int8_t reg_flag; 118 uint32_t frame_offset[MM_CAMERA_MAX_NUM_FRAMES]; 119 mm_camera_frame_t frame[MM_CAMERA_MAX_NUM_FRAMES]; 120 int8_t ref_count[MM_CAMERA_MAX_NUM_FRAMES]; 121 int32_t use_multi_fd; 122 int qbuf; 123 pthread_mutex_t mutex; 124 } mm_camera_stream_frame_t; 125 126 typedef struct { 127 int32_t fd; 128 mm_camera_stream_state_type_t state; 129 mm_camera_stream_type_t stream_type; 130 struct v4l2_format fmt; 131 cam_format_t cam_fmt; 132 mm_camera_stream_frame_t frame; 133 } mm_camera_stream_t; 134 135 typedef struct { 136 mm_camera_stream_t stream; 137 mm_camera_raw_streaming_type_t mode; 138 } mm_camera_ch_raw_t; 139 140 typedef struct { 141 mm_camera_stream_t stream; 142 } mm_camera_ch_preview_t; 143 144 typedef struct { 145 mm_camera_stream_t thumbnail; 146 mm_camera_stream_t main; 147 int delivered_cnt; 148 int8_t pending_cnt; 149 uint32_t expected_matching_id; 150 } mm_camera_ch_snapshot_t; 151 152 typedef struct { 153 int8_t fifo[MM_CAMERA_MAX_FRAME_NUM]; 154 int8_t low; 155 int8_t high; 156 int8_t len; 157 int8_t water_mark; 158 } mm_camera_circule_fifo_t; 159 160 typedef struct { 161 mm_camera_stream_t video; 162 mm_camera_stream_t main; 163 uint8_t has_main; 164 } mm_camera_ch_video_t; 165 166 #define MM_CAMERA_BUF_CB_MAX 4 167 typedef struct { 168 mm_camera_channel_type_t type; 169 pthread_mutex_t mutex; 170 uint8_t acquired; 171 mm_camera_buf_cb_t buf_cb[MM_CAMERA_BUF_CB_MAX]; 172 mm_camera_channel_attr_buffering_frame_t buffering_frame; 173 union { 174 mm_camera_ch_raw_t raw; 175 mm_camera_ch_preview_t preview; 176 mm_camera_ch_snapshot_t snapshot; 177 mm_camera_ch_video_t video; 178 }; 179 } mm_camera_ch_t; 180 181 #define MM_CAMERA_EVT_ENTRY_MAX 4 182 typedef struct { 183 mm_camera_event_notify_t evt_cb; 184 void *user_data; 185 } mm_camera_evt_entry_t; 186 187 typedef struct { 188 mm_camera_evt_entry_t evt[MM_CAMERA_EVT_ENTRY_MAX]; 189 int reg_count; 190 } mm_camera_evt_obj_t; 191 192 #define MM_CAMERA_CH_STREAM_MAX 2 193 typedef enum { 194 MM_CAMERA_POLL_TYPE_EVT, 195 MM_CAMERA_POLL_TYPE_CH, 196 MM_CAMERA_POLL_TYPE_MAX 197 } mm_camera_poll_thread_type_t; 198 199 typedef struct { 200 mm_camera_poll_thread_type_t poll_type; 201 int32_t pfds[2]; 202 int poll_fd[MM_CAMERA_CH_STREAM_MAX+1]; 203 int num_fds; 204 int used; 205 pthread_t pid; 206 int32_t state; 207 int timeoutms; 208 void *my_obj; 209 mm_camera_channel_type_t ch_type; 210 mm_camera_stream_t *poll_streams[MM_CAMERA_CH_STREAM_MAX]; 211 uint32_t cmd; 212 } mm_camera_poll_thread_data_t; 213 214 typedef struct { 215 pthread_mutex_t mutex; 216 pthread_cond_t cond_v; 217 int32_t status; 218 mm_camera_poll_thread_data_t data; 219 } mm_camera_poll_thread_t; 220 221 typedef struct { 222 int stream_on_count_cfg; 223 int stream_off_count_cfg; 224 int stream_on_count; 225 int stream_off_count; 226 } mm_camera_ch_stream_count_t; 227 #define MM_CAMERA_POLL_THRAED_MAX (MM_CAMERA_CH_MAX+1) 228 229 typedef struct { 230 struct msm_mem_map_info cookie; 231 uint32_t vaddr; 232 } mm_camera_mem_map_entry_t; 233 234 #define MM_CAMERA_MEM_MAP_MAX 8 235 typedef struct { 236 int num; 237 mm_camera_mem_map_entry_t entry[MM_CAMERA_MEM_MAP_MAX]; 238 } mm_camera_mem_map_t; 239 240 typedef struct { 241 int8_t my_id; 242 camera_mode_t current_mode; 243 mm_camera_op_mode_type_t op_mode; 244 mm_camera_notify_cb_t *notify; 245 mm_camera_ch_t ch[MM_CAMERA_CH_MAX]; 246 int ref_count; 247 uint32_t ch_streaming_mask; 248 int32_t ctrl_fd; 249 int32_t ds_fd; // domain socket fd 250 cam_ctrl_dimension_t dim; 251 cam_prop_t properties; 252 pthread_mutex_t mutex; 253 mm_camera_evt_obj_t evt[MM_CAMERA_EVT_TYPE_MAX]; 254 mm_camera_ch_stream_count_t ch_stream_count[MM_CAMERA_CH_MAX]; 255 uint32_t evt_type_mask; 256 mm_camera_poll_thread_t poll_threads[MM_CAMERA_POLL_THRAED_MAX]; 257 mm_camera_mem_map_t hist_mem_map; 258 int full_liveshot; 259 int snap_burst_num_by_user; 260 } mm_camera_obj_t; 261 262 #define MM_CAMERA_DEV_NAME_LEN 32 263 #define MM_CAMERA_DEV_OPEN_TRIES 2 264 #define MM_CAMERA_DEV_OPEN_RETRY_SLEEP 20 265 266 typedef struct { 267 mm_camera_t camera[MSM_MAX_CAMERA_SENSORS]; 268 int8_t num_cam; 269 char video_dev_name[MSM_MAX_CAMERA_SENSORS][MM_CAMERA_DEV_NAME_LEN]; 270 mm_camera_obj_t *cam_obj[MSM_MAX_CAMERA_SENSORS]; 271 } mm_camera_ctrl_t; 272 273 typedef struct { 274 mm_camera_parm_type_t parm_type; 275 void *p_value; 276 } mm_camera_parm_t; 277 278 extern int32_t mm_camera_stream_fsm_fn_vtbl (mm_camera_obj_t * my_obj, 279 mm_camera_stream_t *stream, 280 mm_camera_state_evt_type_t evt, void *val); 281 extern const char *mm_camera_util_get_dev_name(mm_camera_obj_t * my_obj); 282 extern int32_t mm_camera_util_s_ctrl( int32_t fd, 283 uint32_t id, int32_t value); 284 extern int32_t mm_camera_util_private_s_ctrl( int32_t fd, 285 uint32_t id, int32_t value); 286 extern int32_t mm_camera_util_g_ctrl( int32_t fd, 287 uint32_t id, int32_t *value); 288 extern int32_t mm_camera_ch_fn(mm_camera_obj_t * my_obj, 289 mm_camera_channel_type_t ch_type, 290 mm_camera_state_evt_type_t evt, void *val); 291 extern int32_t mm_camera_action(mm_camera_obj_t *my_obj, uint8_t start, 292 mm_camera_ops_type_t opcode, void *parm); 293 extern int32_t mm_camera_open(mm_camera_obj_t *my_obj, 294 mm_camera_op_mode_type_t op_mode); 295 extern int32_t mm_camera_close(mm_camera_obj_t *my_obj); 296 extern int32_t mm_camera_start(mm_camera_obj_t *my_obj, 297 mm_camera_ops_type_t opcode, void *parm); 298 extern int32_t mm_camera_stop(mm_camera_obj_t *my_obj, 299 mm_camera_ops_type_t opcode, void *parm); 300 extern int32_t mm_camera_get_parm(mm_camera_obj_t * my_obj, 301 mm_camera_parm_t *parm); 302 extern int32_t mm_camera_set_parm(mm_camera_obj_t * my_obj, 303 mm_camera_parm_t *parm); 304 extern int32_t mm_camera_request_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf); 305 extern int32_t mm_camera_enqueue_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf); 306 extern int32_t mm_camera_prepare_buf(mm_camera_obj_t * my_obj, mm_camera_reg_buf_t *buf); 307 extern int32_t mm_camera_unprepare_buf(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type); 308 extern int mm_camera_poll_thread_launch(mm_camera_obj_t * my_obj, int ch_type); 309 310 int mm_camera_poll_thread_del_ch(mm_camera_obj_t * my_obj, int ch_type); 311 int mm_camera_poll_thread_add_ch(mm_camera_obj_t * my_obj, int ch_type); 312 extern int32_t mm_camera_poll_dispatch_buffered_frames(mm_camera_obj_t * my_obj, int ch_type); 313 extern int mm_camera_poll_thread_release(mm_camera_obj_t * my_obj, int ch_type); 314 extern void mm_camera_poll_threads_init(mm_camera_obj_t * my_obj); 315 extern void mm_camera_poll_threads_deinit(mm_camera_obj_t * my_obj); 316 extern int mm_camera_poll_busy(mm_camera_obj_t * my_obj); 317 extern void mm_camera_msm_data_notify(mm_camera_obj_t * my_obj, int fd, 318 mm_camera_stream_type_t stream_type); 319 extern void mm_camera_msm_evt_notify(mm_camera_obj_t * my_obj, int fd); 320 extern int mm_camera_read_msm_frame(mm_camera_obj_t * my_obj, 321 mm_camera_stream_t *stream); 322 extern int32_t mm_camera_ch_acquire(mm_camera_obj_t *my_obj, mm_camera_channel_type_t ch_type); 323 extern void mm_camera_ch_release(mm_camera_obj_t *my_obj, mm_camera_channel_type_t ch_type); 324 extern int mm_camera_ch_is_active(mm_camera_obj_t * my_obj, mm_camera_channel_type_t ch_type); 325 extern void mm_camera_ch_util_get_stream_objs(mm_camera_obj_t * my_obj, 326 mm_camera_channel_type_t ch_type, 327 mm_camera_stream_t **stream1, 328 mm_camera_stream_t **stream2); 329 extern int mm_camera_stream_qbuf(mm_camera_obj_t * my_obj, 330 mm_camera_stream_t *stream, 331 int idx); 332 extern int mm_camera_stream_frame_get_q_cnt(mm_camera_frame_queue_t *q); 333 extern mm_camera_frame_t *mm_camera_stream_frame_deq(mm_camera_frame_queue_t *q); 334 extern mm_camera_frame_t *mm_camera_stream_frame_deq_no_lock(mm_camera_frame_queue_t *q); 335 extern void mm_camera_stream_frame_enq(mm_camera_frame_queue_t *q, mm_camera_frame_t *node); 336 extern void mm_camera_stream_frame_enq_no_lock(mm_camera_frame_queue_t *q, mm_camera_frame_t *node); 337 extern void mm_camera_stream_frame_refill_q(mm_camera_frame_queue_t *q, mm_camera_frame_t *node, int num); 338 extern int mm_camera_stream_is_active(mm_camera_stream_t *stream); 339 extern int32_t mm_camera_stream_util_buf_done(mm_camera_obj_t * my_obj, 340 mm_camera_stream_t *stream, 341 mm_camera_notify_frame_t *frame); 342 //extern int mm_camera_poll_add_stream(mm_camera_obj_t * my_obj, mm_camera_stream_t *stream); 343 //extern int mm_camera_poll_del_stream(mm_camera_obj_t * my_obj, mm_camera_stream_t *stream); 344 extern int mm_camera_dev_open(int *fd, char *dev_name); 345 extern int mm_camera_reg_event(mm_camera_obj_t * my_obj, mm_camera_event_notify_t evt_cb, 346 void *user_data, uint32_t evt_type); 347 extern int mm_camera_poll_send_ch_event(mm_camera_obj_t * my_obj, mm_camera_event_t *event); 348 extern void mm_camera_msm_proc_ch_event(mm_camera_obj_t *my_obj, mm_camera_event_t *event); 349 extern void mm_camera_dispatch_app_event(mm_camera_obj_t *my_obj, mm_camera_event_t *event); 350 extern void mm_camera_dispatch_buffered_frames(mm_camera_obj_t *my_obj, mm_camera_channel_type_t ch_type); 351 extern void mm_camera_check_pending_zsl_frames(mm_camera_obj_t *my_obj, 352 mm_camera_channel_type_t ch_type); 353 extern int mm_camera_ch_util_get_num_stream(mm_camera_obj_t * my_obj,mm_camera_channel_type_t ch_type); 354 extern int32_t mm_camera_sendmsg(mm_camera_obj_t *my_obj, void *msg, uint32_t buf_size, int sendfd); 355 #endif /* __MM_CAMERA_H__ */ 356