* They are execlusive.
*/
} else if (cam->capture_on) {
- if (status & PRP_INTRSTAT_CH2OVF)
- {
- //printk(KERN_INFO "prphw_isr - PRP_INTRSTAT_CH2OVF: status: 0x%x\n", status);
+ if (status & PRP_INTRSTAT_CH2OVF) {
prphw_disable(PRP_CHANNEL_2);
prphw_enable(PRP_CHANNEL_2);
- cam->enc_callback(0, cam);
+ cam->enc_callback(1, cam);
}
- else if (status & (PRP_INTRSTAT_CH2BUF1 | PRP_INTRSTAT_CH2BUF2)) {
+ else if (status &
+ (PRP_INTRSTAT_CH2BUF1 | PRP_INTRSTAT_CH2BUF2)) {
cam->enc_callback(0, cam);
}
}
int retval = 0;
struct mxc_v4l_frame *frame;
+ cont:
if (!wait_event_interruptible_timeout(cam->enc_queue,
cam->enc_counter != 0, 10 * HZ)) {
- if(dq_timeout_cnt == 0)
+ if( (dq_timeout_cnt & 0x1f) == 0)
printk(KERN_ERR "mxc_v4l_dqueue timeout enc_counter %x\n",
cam->enc_counter);
dq_timeout_cnt++;
+ if (cam->overflow == 1) {
+ cam->enc_enable(cam);
+ cam->overflow = 0;
+ if (!list_empty(&cam->ready_q)) {
+ frame =
+ list_entry(cam->ready_q.next,
+ struct mxc_v4l_frame, queue);
+ list_del(cam->ready_q.next);
+ list_add_tail(&frame->queue, &cam->working_q);
+ cam->enc_update_eba(frame->paddress,
+ &cam->ping_pong_csi);
+ }
+ goto cont;
+ }
return -ETIME;
} else if (signal_pending(current)) {
if(dq_intr_cnt == 0)
- printk(KERN_ERR "mxc_v4l_dqueue() interrupt received\n");
+ printk(KERN_ERR "mxc_v4l_dqueue() interrupt received %d\n",dq_intr_cnt);
dq_intr_cnt++;
+ if (cam->overflow == 1) {
+ cam->enc_enable(cam);
+ cam->overflow = 0;
+ if (!list_empty(&cam->ready_q)) {
+ frame =
+ list_entry(cam->ready_q.next,
+ struct mxc_v4l_frame, queue);
+ list_del(cam->ready_q.next);
+ list_add_tail(&frame->queue, &cam->working_q);
+ cam->enc_update_eba(frame->paddress,
+ &cam->ping_pong_csi);
+ }
+ goto cont;
+ }
return -ERESTARTSYS;
}
+ if (cam->overflow == 1) {
+ cam->enc_enable(cam);
+ cam->overflow = 0;
+ if (!list_empty(&cam->ready_q)) {
+ frame =
+ list_entry(cam->ready_q.next, struct mxc_v4l_frame,
+ queue);
+ list_del(cam->ready_q.next);
+ list_add_tail(&frame->queue, &cam->working_q);
+ cam->enc_update_eba(frame->paddress,
+ &cam->ping_pong_csi);
+ }
+ printk(KERN_INFO "mxc_v4l_dqueue - overflow\n");
+
+ }
+
+
cam->enc_counter--;
frame = list_entry(cam->done_q.next, struct mxc_v4l_frame, queue);
buf->bytesused = cam->v2f.fmt.pix.sizeimage;
buf->index = frame->index;
buf->flags = frame->buffer.flags;
-
return retval;
}
case VIDIOC_QBUF:{
struct v4l2_buffer *buf = arg;
int index = buf->index;
+ int overflow = 0;
pr_debug("VIDIOC_QBUF: %d\n", buf->index);
+ if (cam->overflow == 1) {
+ cam->enc_enable(cam);
+ cam->overflow = 0;
+ overflow = 1;
+ printk(KERN_INFO "VIDIOC_QBUF - overflow\n");
+ }
spin_lock_irqsave(&cam->int_lock, lock_flags);
if ((cam->frame[index].buffer.flags & 0x7) ==
V4L2_BUF_FLAG_MAPPED) {
cam->frame[index].buffer.flags |=
V4L2_BUF_FLAG_QUEUED;
- if (cam->skip_frame > 0) {
+ if ((cam->skip_frame > 0) || (overflow == 1)) {
list_add_tail(&cam->frame[index].queue,
&cam->working_q);
retval =
if (cam == NULL)
return;
+ if (mask == 1) {
+ cam->overflow = 1;
+ }
+
if (list_empty(&cam->working_q)) {
if (empty_wq_cnt == 0) {
- printk(KERN_ERR "camera_callback: working queue empty\n");
+ printk(KERN_ERR "camera_callback: working queue empty %d\n",empty_wq_cnt);
}
empty_wq_cnt++;
+ if (list_empty(&cam->ready_q)) {
+ cam->skip_frame++;
+ } else {
+ ready_frame =
+ list_entry(cam->ready_q.next, struct mxc_v4l_frame,
+ queue);
+ list_del(cam->ready_q.next);
+ list_add_tail(&ready_frame->queue, &cam->working_q);
+ cam->enc_update_eba(ready_frame->paddress,
+ &cam->ping_pong_csi);
+ }
return;
}