Skip to content

Commit 1884f61

Browse files
committed
video: stm32_dcmi: snapshot check returned buffer
If we had a timeout it would not check to see on next call if maybe it had completed. Signed-off-by: Kurt Eckhardt <[email protected]>
1 parent 6d0de1f commit 1884f61

File tree

1 file changed

+22
-14
lines changed

1 file changed

+22
-14
lines changed

drivers/video/video_stm32_dcmi.c

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ struct video_stm32_dcmi_data {
4545
struct k_fifo fifo_in;
4646
struct k_fifo fifo_out;
4747
struct video_buffer *vbuf;
48-
bool snapshot_mode : 1;
48+
bool snapshot_mode;
4949
};
5050

5151
struct video_stm32_dcmi_config {
@@ -62,21 +62,21 @@ static void stm32_dcmi_process_dma_error(DCMI_HandleTypeDef *hdcmi)
6262
struct video_stm32_dcmi_data *dev_data =
6363
CONTAINER_OF(hdcmi, struct video_stm32_dcmi_data, hdcmi);
6464

65-
LOG_WRN("Restart DMA after Error!");
66-
/* Lets try to recover by stopping and maybe restart */
67-
if (HAL_DCMI_Stop(&dev_data->hdcmi) != HAL_OK) {
68-
LOG_WRN("HAL_DCMI_Stop FAILED!");
69-
return;
70-
}
65+
LOG_WRN("Restart DMA after Error!");
66+
/* Lets try to recover by stopping and maybe restart */
67+
if (HAL_DCMI_Stop(&dev_data->hdcmi) != HAL_OK) {
68+
LOG_WRN("HAL_DCMI_Stop FAILED!");
69+
return;
70+
}
7171

72-
/* error on last transfer try to restart it */
73-
if (HAL_DCMI_Start_DMA(&dev_data->hdcmi,
72+
/* error on last transfer try to restart it */
73+
if (HAL_DCMI_Start_DMA(&dev_data->hdcmi,
7474
dev_data->snapshot_mode ? DCMI_MODE_SNAPSHOT : DCMI_MODE_CONTINUOUS,
7575
(uint32_t)dev_data->vbuf->buffer,
7676
dev_data->vbuf->size / 4) != HAL_OK) {
7777
LOG_WRN("Continuous: HAL_DCMI_Start_DMA FAILED!");
7878
return;
79-
}
79+
}
8080
}
8181

8282
void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi)
@@ -315,7 +315,6 @@ 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-
319318
if (buffer_size > vbuf->size) {
320319
return -EINVAL;
321320
}
@@ -334,11 +333,20 @@ static int video_stm32_dcmi_dequeue(const struct device *dev, struct video_buffe
334333
struct video_stm32_dcmi_data *data = dev->data;
335334

336335
if (data->snapshot_mode) {
337-
printk("dequeue snapshot: %p %llu\n", data->vbuf, timeout.ticks);
336+
LOG_DBG("dequeue snapshot: %p %llu\n", data->vbuf, timeout.ticks);
338337
/* See if we were already called and have an active buffer */
339338
if (data->vbuf == NULL) {
339+
/* check first to see if we already have a buffer returned */
340+
*vbuf = k_fifo_get(&data->fifo_out, K_NO_WAIT);
341+
if (*vbuf != NULL) {
342+
LOG_DBG("k_fifo_get returned: %p\n", *vbuf);
343+
if (HAL_DCMI_Stop(&data->hdcmi) != HAL_OK) {
344+
LOG_WRN("Snapshot: HAL_DCMI_Stop FAILED!");
345+
}
346+
return 0;
347+
}
340348
data->vbuf = k_fifo_get(&data->fifo_in, K_NO_WAIT);
341-
printk("\tcamera buf: %p\n", data->vbuf);
349+
LOG_DBG("\tcamera buf: %p\n", data->vbuf);
342350
if (data->vbuf == NULL) {
343351
LOG_WRN("Snapshot: No Buffers available!");
344352
return -ENOMEM;
@@ -356,7 +364,7 @@ static int video_stm32_dcmi_dequeue(const struct device *dev, struct video_buffe
356364
}
357365

358366
*vbuf = k_fifo_get(&data->fifo_out, timeout);
359-
printk("k_fifo_get returned: %p\n", *vbuf);
367+
LOG_DBG("k_fifo_get returned: %p\n", *vbuf);
360368

361369
if (*vbuf == NULL) {
362370
return -EAGAIN;

0 commit comments

Comments
 (0)