Skip to content

Commit 5d5cff3

Browse files
committed
video: stm32_dcmi: check for returned buffer at start of dequeue
If we had a timeout it would not check to see on next call if maybe it had completed.
1 parent 6d0de1f commit 5d5cff3

File tree

1 file changed

+25
-21
lines changed

1 file changed

+25
-21
lines changed

drivers/video/video_stm32_dcmi.c

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ static int video_stm32_dcmi_enqueue(const struct device *dev, struct video_buffe
315315
{
316316
struct video_stm32_dcmi_data *data = dev->data;
317317
const uint32_t buffer_size = data->fmt.pitch * data->fmt.height;
318-
318+
printk("ENQ %p %p %u %u\n", vbuf, data, buffer_size, vbuf->size);
319319
if (buffer_size > vbuf->size) {
320320
return -EINVAL;
321321
}
@@ -333,31 +333,35 @@ static int video_stm32_dcmi_dequeue(const struct device *dev, struct video_buffe
333333
{
334334
struct video_stm32_dcmi_data *data = dev->data;
335335

336-
if (data->snapshot_mode) {
337-
printk("dequeue snapshot: %p %llu\n", data->vbuf, timeout.ticks);
338-
/* See if we were already called and have an active buffer */
339-
if (data->vbuf == NULL) {
340-
data->vbuf = k_fifo_get(&data->fifo_in, K_NO_WAIT);
341-
printk("\tcamera buf: %p\n", data->vbuf);
336+
/* check first to see if we already have a buffer returned */
337+
*vbuf = k_fifo_get(&data->fifo_out, K_NO_WAIT);
338+
printk("k_fifo_get returned: %p\n", *vbuf);
339+
if (*vbuf == NULL) {
340+
if (data->snapshot_mode) {
341+
printk("dequeue snapshot: %p %llu\n", data->vbuf, timeout.ticks);
342+
/* See if we were already called and have an active buffer */
342343
if (data->vbuf == NULL) {
343-
LOG_WRN("Snapshot: No Buffers available!");
344-
return -ENOMEM;
344+
data->vbuf = k_fifo_get(&data->fifo_in, K_NO_WAIT);
345+
printk("\tcamera buf: %p\n", data->vbuf);
346+
if (data->vbuf == NULL) {
347+
LOG_WRN("Snapshot: No Buffers available!");
348+
return -ENOMEM;
349+
}
350+
351+
if (HAL_DCMI_Start_DMA(&data->hdcmi, DCMI_MODE_SNAPSHOT,
352+
(uint32_t)data->vbuf->buffer,
353+
data->vbuf->size / 4) != HAL_OK) {
354+
LOG_WRN("Snapshot: HAL_DCMI_Start_DMA FAILED!");
355+
return -EIO;
356+
}
357+
} else {
358+
LOG_DBG("Snapshot: restart after timeout");
345359
}
346-
347-
if (HAL_DCMI_Start_DMA(&data->hdcmi, DCMI_MODE_SNAPSHOT,
348-
(uint32_t)data->vbuf->buffer,
349-
data->vbuf->size / 4) != HAL_OK) {
350-
LOG_WRN("Snapshot: HAL_DCMI_Start_DMA FAILED!");
351-
return -EIO;
352-
}
353-
} else {
354-
LOG_DBG("Snapshot: restart after timeout");
355360
}
361+
*vbuf = k_fifo_get(&data->fifo_out, timeout);
362+
printk("k_fifo_get returned: %p\n", *vbuf);
356363
}
357364

358-
*vbuf = k_fifo_get(&data->fifo_out, timeout);
359-
printk("k_fifo_get returned: %p\n", *vbuf);
360-
361365
if (*vbuf == NULL) {
362366
return -EAGAIN;
363367
}

0 commit comments

Comments
 (0)