/** * m5mols_start_monitor - Start the monitor mode * * Before applying the controls setup the resolution and frame rate * in PARAMETER mode, and then switch over to MONITOR mode. */ static int m5mols_start_monitor(struct m5mols_info *info) { struct v4l2_subdev *sd = &info->sd; int ret; ret = m5mols_mode(info, REG_PARAMETER); if (!ret) ret = m5mols_write(sd, PARM_MON_SIZE, info->resolution); if (!ret) ret = m5mols_write(sd, PARM_MON_FPS, REG_FPS_30); if (!ret) ret = m5mols_mode(info, REG_MONITOR); if (!ret) ret = m5mols_sync_controls(info); 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); }