Skip to content

Commit 249a951

Browse files
committed
video: stm32_dcmi: snapshot timeout
Find at times that the camera when started may for some reason not return an image. So added currently hard coded 5 second timeout for a frame. Should be settable. But at least it recovers and starts getting pictures again. Signed-off-by: Kurt Eckhardt <[email protected]> Update video_stm32_dcmi.c
1 parent 1884f61 commit 249a951

File tree

1 file changed

+37
-11
lines changed

1 file changed

+37
-11
lines changed

drivers/video/video_stm32_dcmi.c

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +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+
uint32_t snapshot_start_time;
4849
bool snapshot_mode;
4950
};
5051

@@ -63,19 +64,19 @@ static void stm32_dcmi_process_dma_error(DCMI_HandleTypeDef *hdcmi)
6364
CONTAINER_OF(hdcmi, struct video_stm32_dcmi_data, hdcmi);
6465

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

72-
/* error on last transfer try to restart it */
7374
if (HAL_DCMI_Start_DMA(&dev_data->hdcmi,
74-
dev_data->snapshot_mode ? DCMI_MODE_SNAPSHOT : DCMI_MODE_CONTINUOUS,
75-
(uint32_t)dev_data->vbuf->buffer,
76-
dev_data->vbuf->size / 4) != HAL_OK) {
77-
LOG_WRN("Continuous: HAL_DCMI_Start_DMA FAILED!");
78-
return;
75+
dev_data->snapshot_mode ? DCMI_MODE_SNAPSHOT : DCMI_MODE_CONTINUOUS,
76+
(uint32_t)dev_data->vbuf->buffer,
77+
dev_data->vbuf->size / 4) != HAL_OK) {
78+
LOG_WRN("Continuous: HAL_DCMI_Start_DMA FAILED!");
79+
return;
7980
}
8081
}
8182

@@ -327,6 +328,8 @@ static int video_stm32_dcmi_enqueue(const struct device *dev, struct video_buffe
327328
return 0;
328329
}
329330

331+
#define SNAPSHOT_TIMEOUT_MS 5000
332+
330333
static int video_stm32_dcmi_dequeue(const struct device *dev, struct video_buffer **vbuf,
331334
k_timeout_t timeout)
332335
{
@@ -335,7 +338,29 @@ static int video_stm32_dcmi_dequeue(const struct device *dev, struct video_buffe
335338
if (data->snapshot_mode) {
336339
LOG_DBG("dequeue snapshot: %p %llu\n", data->vbuf, timeout.ticks);
337340
/* See if we were already called and have an active buffer */
338-
if (data->vbuf == NULL) {
341+
if (data->vbuf != NULL) {
342+
uint32_t time_since_start_time =
343+
(uint32_t)(k_uptime_get_32() - data->snapshot_start_time);
344+
if (time_since_start_time > SNAPSHOT_TIMEOUT_MS) {
345+
LOG_WRN("Snapshot: Timed out!");
346+
if (HAL_DCMI_Stop(&data->hdcmi) != HAL_OK) {
347+
LOG_WRN("Snapshot: HAL_DCMI_Stop FAILED!");
348+
}
349+
350+
if (HAL_DCMI_Start_DMA(&data->hdcmi, DCMI_MODE_SNAPSHOT,
351+
(uint32_t)data->vbuf->buffer,
352+
data->vbuf->size / 4) != HAL_OK) {
353+
LOG_WRN("Snapshot: HAL_DCMI_Start_DMA FAILED!");
354+
return -EIO;
355+
}
356+
357+
/* remember when we started this request */
358+
data->snapshot_start_time = k_uptime_get_32();
359+
} else {
360+
LOG_DBG("Snapshot: restart after timeout");
361+
}
362+
363+
} else {
339364
/* check first to see if we already have a buffer returned */
340365
*vbuf = k_fifo_get(&data->fifo_out, K_NO_WAIT);
341366
if (*vbuf != NULL) {
@@ -358,8 +383,9 @@ static int video_stm32_dcmi_dequeue(const struct device *dev, struct video_buffe
358383
LOG_WRN("Snapshot: HAL_DCMI_Start_DMA FAILED!");
359384
return -EIO;
360385
}
361-
} else {
362-
LOG_DBG("Snapshot: restart after timeout");
386+
387+
/* remember when we started this request */
388+
data->snapshot_start_time = k_uptime_get_32();
363389
}
364390
}
365391

0 commit comments

Comments
 (0)