@@ -45,7 +45,7 @@ struct video_stm32_dcmi_data {
45
45
struct k_fifo fifo_in ;
46
46
struct k_fifo fifo_out ;
47
47
struct video_buffer * vbuf ;
48
- bool snapshot_mode : 1 ;
48
+ bool snapshot_mode ;
49
49
};
50
50
51
51
struct video_stm32_dcmi_config {
@@ -62,21 +62,21 @@ static void stm32_dcmi_process_dma_error(DCMI_HandleTypeDef *hdcmi)
62
62
struct video_stm32_dcmi_data * dev_data =
63
63
CONTAINER_OF (hdcmi , struct video_stm32_dcmi_data , hdcmi );
64
64
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
+ }
71
71
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 ,
74
74
dev_data -> snapshot_mode ? DCMI_MODE_SNAPSHOT : DCMI_MODE_CONTINUOUS ,
75
75
(uint32_t )dev_data -> vbuf -> buffer ,
76
76
dev_data -> vbuf -> size / 4 ) != HAL_OK ) {
77
77
LOG_WRN ("Continuous: HAL_DCMI_Start_DMA FAILED!" );
78
78
return ;
79
- }
79
+ }
80
80
}
81
81
82
82
void HAL_DCMI_ErrorCallback (DCMI_HandleTypeDef * hdcmi )
@@ -315,7 +315,6 @@ static int video_stm32_dcmi_enqueue(const struct device *dev, struct video_buffe
315
315
{
316
316
struct video_stm32_dcmi_data * data = dev -> data ;
317
317
const uint32_t buffer_size = data -> fmt .pitch * data -> fmt .height ;
318
-
319
318
if (buffer_size > vbuf -> size ) {
320
319
return - EINVAL ;
321
320
}
@@ -334,11 +333,20 @@ static int video_stm32_dcmi_dequeue(const struct device *dev, struct video_buffe
334
333
struct video_stm32_dcmi_data * data = dev -> data ;
335
334
336
335
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 );
338
337
/* See if we were already called and have an active buffer */
339
338
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
+ }
340
348
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 );
342
350
if (data -> vbuf == NULL ) {
343
351
LOG_WRN ("Snapshot: No Buffers available!" );
344
352
return - ENOMEM ;
@@ -356,7 +364,7 @@ static int video_stm32_dcmi_dequeue(const struct device *dev, struct video_buffe
356
364
}
357
365
358
366
* 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 );
360
368
361
369
if (* vbuf == NULL ) {
362
370
return - EAGAIN ;
0 commit comments