int m5mols_start_capture(struct m5mols_info *info) { unsigned int framesize = info->cap.buf_size - M5MOLS_JPEG_TAGS_SIZE; struct v4l2_subdev *sd = &info->sd; int ret; /* * Synchronize the controls, set the capture frame resolution and color * format. The frame capture is initiated during switching from Monitor * to Capture mode. */ ret = m5mols_set_mode(info, REG_MONITOR); if (!ret) ret = m5mols_restore_controls(info); if (!ret) ret = m5mols_write(sd, CAPP_YUVOUT_MAIN, REG_JPEG); if (!ret) ret = m5mols_write(sd, CAPP_MAIN_IMAGE_SIZE, info->resolution); if (!ret) ret = m5mols_write(sd, CAPP_JPEG_SIZE_MAX, framesize); if (!ret) ret = m5mols_set_mode(info, REG_CAPTURE); if (!ret) /* Wait until a frame is captured to ISP internal memory */ ret = m5mols_wait_interrupt(sd, REG_INT_CAPTURE, 2000); if (ret) return ret; /* * Initiate the captured data transfer to a MIPI-CSI receiver. */ ret = m5mols_write(sd, CAPC_SEL_FRAME, 1); if (!ret) ret = m5mols_write(sd, CAPC_START, REG_CAP_START_MAIN); if (!ret) { bool captured = false; unsigned int size; /* Wait for the capture completion interrupt */ ret = m5mols_wait_interrupt(sd, REG_INT_CAPTURE, 2000); if (!ret) { captured = true; ret = m5mols_capture_info(info); } size = captured ? info->cap.main : 0; v4l2_dbg(1, m5mols_debug, sd, "%s: size: %d, thumb.: %d B\n", __func__, size, info->cap.thumb); v4l2_subdev_notify(sd, S5P_FIMC_TX_END_NOTIFY, &size); } return ret; }
int m5mols_start_capture(struct m5mols_info *info) { struct v4l2_subdev *sd = &info->sd; u8 resolution = info->resolution; int timeout; int ret; /* * Preparing capture. Setting control & interrupt before entering * capture mode * * 1) change to MONITOR mode for operating control & interrupt * 2) set controls (considering v4l2_control value & lock 3A) * 3) set interrupt * 4) change to CAPTURE mode */ ret = m5mols_mode(info, REG_MONITOR); if (!ret) ret = m5mols_sync_controls(info); if (!ret) ret = m5mols_lock_3a(info, true); if (!ret) ret = m5mols_enable_interrupt(sd, REG_INT_CAPTURE); if (!ret) ret = m5mols_mode(info, REG_CAPTURE); if (!ret) { /* Wait for capture interrupt, after changing capture mode */ timeout = wait_event_interruptible_timeout(info->irq_waitq, test_bit(ST_CAPT_IRQ, &info->flags), msecs_to_jiffies(2000)); if (test_and_clear_bit(ST_CAPT_IRQ, &info->flags)) ret = m5mols_capture_error_handler(info, timeout); } if (!ret) ret = m5mols_lock_3a(info, false); if (ret) return ret; /* * Starting capture. Setting capture frame count and resolution and * the format(available format: JPEG, Bayer RAW, YUV). * * 1) select single or multi(enable to 25), format, size * 2) set interrupt * 3) start capture(for main image, now) * 4) get information * 5) notify file size to v4l2 device(e.g, to s5p-fimc v4l2 device) */ ret = m5mols_write(sd, CAPC_SEL_FRAME, 1); if (!ret) ret = m5mols_write(sd, CAPP_YUVOUT_MAIN, REG_JPEG); if (!ret) ret = m5mols_write(sd, CAPP_MAIN_IMAGE_SIZE, resolution); if (!ret) ret = m5mols_enable_interrupt(sd, REG_INT_CAPTURE); if (!ret) ret = m5mols_write(sd, CAPC_START, REG_CAP_START_MAIN); if (!ret) { /* Wait for the capture completion interrupt */ timeout = wait_event_interruptible_timeout(info->irq_waitq, test_bit(ST_CAPT_IRQ, &info->flags), msecs_to_jiffies(2000)); if (test_and_clear_bit(ST_CAPT_IRQ, &info->flags)) { ret = m5mols_capture_info(info); if (!ret) v4l2_subdev_notify(sd, 0, &info->cap.total); } } return m5mols_capture_error_handler(info, timeout); }