int32_t mm_camera_open(mm_camera_obj_t *my_obj, mm_camera_op_mode_type_t op_mode) { char dev_name[MM_CAMERA_DEV_NAME_LEN]; int32_t rc = MM_CAMERA_OK; if(my_obj->op_mode != MM_CAMERA_OP_MODE_NOTUSED) { CDBG("%s: not allowed in existing op mode %d\n", __func__, my_obj->op_mode); return -MM_CAMERA_E_INVALID_OPERATION; } if(op_mode >= MM_CAMERA_OP_MODE_MAX) { CDBG("%s: invalid input %d\n", __func__, op_mode); return -MM_CAMERA_E_INVALID_INPUT; } sprintf(dev_name, "/dev/%s", mm_camera_util_get_dev_name(my_obj)); //rc = mm_camera_dev_open(&my_obj->ctrl_fd, dev_name); my_obj->ctrl_fd = open(dev_name, O_RDWR | O_NONBLOCK); if (my_obj->ctrl_fd <= 0) { CDBG("%s: cannot open control fd of '%s'\n", __func__, mm_camera_util_get_dev_name(my_obj)); return -MM_CAMERA_E_GENERAL; } if(op_mode != MM_CAMERA_OP_MODE_NOTUSED) rc = mm_camera_util_s_ctrl(my_obj->ctrl_fd, MSM_V4L2_PID_CAM_MODE, op_mode); if(!rc) { my_obj->op_mode = op_mode; my_obj->current_mode = CAMERA_MODE_2D; /* set geo mode to 2D by default */ } CDBG("%s: '%s', ctrl_fd=%d,op_mode=%d,rc=%d\n", __func__, dev_name, my_obj->ctrl_fd, my_obj->op_mode, rc); return rc; }
static int32_t mm_camera_stream_fsm_notused(mm_camera_obj_t * my_obj, mm_camera_stream_t *stream, mm_camera_state_evt_type_t evt, void *val) { int32_t rc = 0; char dev_name[MM_CAMERA_DEV_NAME_LEN]; switch(evt) { case MM_CAMERA_STATE_EVT_ACQUIRE: snprintf(dev_name, sizeof(dev_name), "/dev/%s", mm_camera_util_get_dev_name(my_obj)); CDBG("%s: open dev '%s', stream type = %d\n", __func__, dev_name, *((mm_camera_stream_type_t *)val)); stream->fd = open(dev_name, O_RDWR | O_NONBLOCK); if(stream->fd <= 0){ CDBG("%s: open dev returned %d\n", __func__, stream->fd); return -1; } stream->stream_type = *((mm_camera_stream_type_t *)val); rc = mm_camera_stream_util_set_ext_mode(stream); CDBG("%s: fd=%d, stream type=%d, mm_camera_stream_util_set_ext_mode() err=%d\n", __func__, stream->fd, stream->stream_type, rc); if(rc == MM_CAMERA_OK) { mm_camera_stream_init_frame(&stream->frame); mm_camera_stream_util_set_state(stream, MM_CAMERA_STREAM_STATE_ACQUIRED); } else if(stream->fd > 0) { close(stream->fd); stream->fd = 0; } break; default: CDBG_ERROR("%s: Invalid evt=%d, stream_state=%d", __func__, evt, stream->state); return -1; } return rc; }
int32_t mm_camera_open(mm_camera_obj_t *my_obj, mm_camera_op_mode_type_t op_mode) { char dev_name[MM_CAMERA_DEV_NAME_LEN]; int32_t rc = MM_CAMERA_OK; int8_t n_try=MM_CAMERA_DEV_OPEN_TRIES; uint8_t sleep_msec=MM_CAMERA_DEV_OPEN_RETRY_SLEEP; uint8_t i; CDBG("%s: begin\n", __func__); if(my_obj->op_mode != MM_CAMERA_OP_MODE_NOTUSED) { CDBG("%s: not allowed in existing op mode %d\n", __func__, my_obj->op_mode); return -MM_CAMERA_E_INVALID_OPERATION; } if(op_mode >= MM_CAMERA_OP_MODE_MAX) { CDBG("%s: invalid input %d\n", __func__, op_mode); return -MM_CAMERA_E_INVALID_INPUT; } snprintf(dev_name, sizeof(dev_name), "/dev/%s", mm_camera_util_get_dev_name(my_obj)); //rc = mm_camera_dev_open(&my_obj->ctrl_fd, dev_name); CDBG("%s: mm_camera_dev_open rc = %d\n", __func__, rc); do{ n_try--; my_obj->ctrl_fd = open(dev_name,O_RDWR | O_NONBLOCK); ALOGV("%s: ctrl_fd = %d", __func__, my_obj->ctrl_fd); ALOGV("Errno:%d",errno); if((my_obj->ctrl_fd > 0) || (errno != EIO) || (n_try <= 0 )) { ALOGV("%s: opened, break out while loop", __func__); break; } CDBG("%s:failed with I/O error retrying after %d milli-seconds", __func__,sleep_msec); usleep(sleep_msec*1000); }while(n_try>0); ALOGV("%s: after while loop", __func__); if (my_obj->ctrl_fd <= 0) { CDBG("%s: cannot open control fd of '%s' Errno = %d\n", __func__, mm_camera_util_get_dev_name(my_obj),errno); return -MM_CAMERA_E_GENERAL; } ALOGV("%s: 2\n", __func__); /* open domain socket*/ n_try=MM_CAMERA_DEV_OPEN_TRIES; do{ n_try--; my_obj->ds_fd = mm_camera_socket_create(my_obj->my_id, MM_CAMERA_SOCK_TYPE_UDP); // TODO: UDP for now, change to TCP ALOGV("%s: ds_fd = %d", __func__, my_obj->ds_fd); ALOGV("Errno:%d",errno); if((my_obj->ds_fd > 0) || (n_try <= 0 )) { ALOGV("%s: opened, break out while loop", __func__); break; } CDBG("%s:failed with I/O error retrying after %d milli-seconds", __func__,sleep_msec); usleep(sleep_msec*1000); }while(n_try>0); ALOGV("%s: after while loop for domain socket open", __func__); if (my_obj->ds_fd <= 0) { CDBG_ERROR("%s: cannot open domain socket fd of '%s' Errno = %d\n", __func__, mm_camera_util_get_dev_name(my_obj),errno); close(my_obj->ctrl_fd); my_obj->ctrl_fd = -1; return -MM_CAMERA_E_GENERAL; } /* set ctrl_fd to be the mem_mapping fd */ rc = mm_camera_util_s_ctrl(my_obj->ctrl_fd, MSM_V4L2_PID_MMAP_INST, 0); if (rc != MM_CAMERA_OK) { CDBG_ERROR("error: ioctl VIDIOC_S_CTRL MSM_V4L2_PID_MMAP_INST failed: %s\n", strerror(errno)); close(my_obj->ctrl_fd); close(my_obj->ds_fd); my_obj->ctrl_fd = -1; my_obj->ds_fd = -1; return -MM_CAMERA_E_GENERAL; } if(op_mode != MM_CAMERA_OP_MODE_NOTUSED) rc = mm_camera_util_s_ctrl(my_obj->ctrl_fd, MSM_V4L2_PID_CAM_MODE, op_mode); if(!rc) { my_obj->op_mode = op_mode; my_obj->current_mode = CAMERA_MODE_2D; /* set geo mode to 2D by default */ } /* get camera capabilities */ memset(&my_obj->properties, 0, sizeof(cam_prop_t)); rc = mm_camera_send_native_ctrl_cmd(my_obj, CAMERA_GET_CAPABILITIES, sizeof(cam_prop_t), (void *)& my_obj->properties); if (rc != MM_CAMERA_OK) { CDBG_ERROR("%s: cannot get camera capabilities\n", __func__); close(my_obj->ctrl_fd); close(my_obj->ds_fd); my_obj->ctrl_fd = -1; my_obj->ds_fd = -1; return -MM_CAMERA_E_GENERAL; } mm_camera_poll_threads_init(my_obj); mm_camera_init_ch_stream_count(my_obj); CDBG("%s : Launch Threads in Cam Open",__func__); for(i = 0; i < MM_CAMERA_CH_MAX; i++) { mm_camera_poll_thread_launch(my_obj,(mm_camera_channel_type_t)i); } CDBG("%s: '%s', ctrl_fd=%d,op_mode=%d,rc=%d\n", __func__, dev_name, my_obj->ctrl_fd, my_obj->op_mode, rc); return rc; }