@@ -45,6 +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
+ uint32_t snapshot_start_time ;
48
49
bool snapshot_mode ;
49
50
};
50
51
@@ -55,6 +56,7 @@ struct video_stm32_dcmi_config {
55
56
const struct device * sensor_dev ;
56
57
const struct stream dma ;
57
58
bool snapshot_mode ;
59
+ int snapshot_timeout ;
58
60
};
59
61
60
62
static void stm32_dcmi_process_dma_error (DCMI_HandleTypeDef * hdcmi )
@@ -63,19 +65,19 @@ static void stm32_dcmi_process_dma_error(DCMI_HandleTypeDef *hdcmi)
63
65
CONTAINER_OF (hdcmi , struct video_stm32_dcmi_data , hdcmi );
64
66
65
67
LOG_WRN ("Restart DMA after Error!" );
66
- /* Lets try to recover by stopping and maybe restart */
68
+
69
+ /* Lets try to recover by stopping and restart */
67
70
if (HAL_DCMI_Stop (& dev_data -> hdcmi ) != HAL_OK ) {
68
- LOG_WRN ("HAL_DCMI_Stop FAILED!" );
71
+ LOG_WRN ("HAL_DCMI_Stop FAILED!" );
69
72
return ;
70
73
}
71
74
72
- /* error on last transfer try to restart it */
73
75
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 ;
76
+ dev_data -> snapshot_mode ? DCMI_MODE_SNAPSHOT : DCMI_MODE_CONTINUOUS ,
77
+ (uint32_t )dev_data -> vbuf -> buffer ,
78
+ dev_data -> vbuf -> size / 4 ) != HAL_OK ) {
79
+ LOG_WRN ("Continuous: HAL_DCMI_Start_DMA FAILED!" );
80
+ return ;
79
81
}
80
82
}
81
83
@@ -327,57 +329,90 @@ static int video_stm32_dcmi_enqueue(const struct device *dev, struct video_buffe
327
329
return 0 ;
328
330
}
329
331
330
- static int video_stm32_dcmi_dequeue (const struct device * dev , struct video_buffer * * vbuf ,
331
- k_timeout_t timeout )
332
+ static int video_stm32_dcmi_snapshot (const struct device * dev , struct video_buffer * * vbuf ,
333
+ k_timeout_t timeout )
332
334
{
333
335
struct video_stm32_dcmi_data * data = dev -> data ;
336
+ const struct video_stm32_dcmi_config * config = dev -> config ;
334
337
335
- if (data -> snapshot_mode ) {
336
- LOG_DBG ("dequeue snapshot: %p %llu\n" , data -> vbuf , timeout .ticks );
337
- /* See if we were already called and have an active buffer */
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
- }
348
- data -> vbuf = k_fifo_get (& data -> fifo_in , K_NO_WAIT );
349
- LOG_DBG ("\tcamera buf: %p\n" , data -> vbuf );
350
- if (data -> vbuf == NULL ) {
351
- LOG_WRN ("Snapshot: No Buffers available!" );
352
- return - ENOMEM ;
353
- }
338
+ LOG_DBG ("dequeue snapshot: %p %llu\n" , data -> vbuf , timeout .ticks );
354
339
355
- if (HAL_DCMI_Start_DMA (& data -> hdcmi , DCMI_MODE_SNAPSHOT ,
356
- (uint32_t )data -> vbuf -> buffer ,
357
- data -> vbuf -> size / 4 ) != HAL_OK ) {
358
- LOG_WRN ("Snapshot: HAL_DCMI_Start_DMA FAILED!" );
359
- return - EIO ;
340
+ /* See if we were already called and have an active buffer */
341
+ if (data -> vbuf == NULL ) {
342
+ /* check first to see if we already have a buffer returned */
343
+ * vbuf = k_fifo_get (& data -> fifo_out , K_NO_WAIT );
344
+ if (* vbuf != NULL ) {
345
+ LOG_DBG ("k_fifo_get returned: %p\n" , * vbuf );
346
+ if (HAL_DCMI_Stop (& data -> hdcmi ) != HAL_OK ) {
347
+ LOG_WRN ("Snapshot: HAL_DCMI_Stop FAILED!" );
360
348
}
361
- } else {
362
- LOG_DBG ("Snapshot: restart after timeout" );
349
+ return 0 ;
363
350
}
351
+ data -> vbuf = k_fifo_get (& data -> fifo_in , K_NO_WAIT );
352
+ LOG_DBG ("\tcamera buf: %p\n" , data -> vbuf );
353
+ if (data -> vbuf == NULL ) {
354
+ LOG_WRN ("Snapshot: No Buffers available!" );
355
+ return - ENOMEM ;
356
+ }
357
+
358
+ if (HAL_DCMI_Start_DMA (& data -> hdcmi , DCMI_MODE_SNAPSHOT ,
359
+ (uint32_t )data -> vbuf -> buffer ,
360
+ data -> vbuf -> size / 4 ) != HAL_OK ) {
361
+ LOG_WRN ("Snapshot: HAL_DCMI_Start_DMA FAILED!" );
362
+ return - EIO ;
363
+ }
364
+
365
+ /* remember when we started this request */
366
+ data -> snapshot_start_time = k_uptime_get_32 ();
364
367
}
365
368
366
369
* vbuf = k_fifo_get (& data -> fifo_out , timeout );
367
370
LOG_DBG ("k_fifo_get returned: %p\n" , * vbuf );
368
371
369
372
if (* vbuf == NULL ) {
373
+ uint32_t time_since_start_time =
374
+ (uint32_t )(k_uptime_get_32 () - data -> snapshot_start_time );
375
+ if (time_since_start_time > config -> snapshot_timeout ) {
376
+ LOG_WRN ("Snapshot: Timed out!" );
377
+ if (HAL_DCMI_Stop (& data -> hdcmi ) != HAL_OK ) {
378
+ LOG_WRN ("Snapshot: HAL_DCMI_Stop FAILED!" );
379
+ }
380
+ /* verify it did not come in during this procuessing */
381
+ * vbuf = k_fifo_get (& data -> fifo_out , K_NO_WAIT );
382
+ if (* vbuf ) {
383
+ return 0 ;
384
+ }
385
+
386
+ if (data -> vbuf != NULL ) {
387
+ k_fifo_put (& data -> fifo_in , data -> vbuf );
388
+ data -> vbuf = NULL ;
389
+ }
390
+ }
391
+
370
392
return - EAGAIN ;
371
393
}
372
394
373
- if (data -> snapshot_mode ) {
374
- if (HAL_DCMI_Stop (& data -> hdcmi ) != HAL_OK ) {
375
- LOG_WRN ("Snapshot: HAL_DCMI_Stop FAILED!" );
376
- }
395
+ if (HAL_DCMI_Stop (& data -> hdcmi ) != HAL_OK ) {
396
+ LOG_WRN ("Snapshot: HAL_DCMI_Stop FAILED!" );
377
397
}
378
398
return 0 ;
379
399
}
380
400
401
+ static int video_stm32_dcmi_dequeue (const struct device * dev , struct video_buffer * * vbuf ,
402
+ k_timeout_t timeout )
403
+ {
404
+ struct video_stm32_dcmi_data * data = dev -> data ;
405
+
406
+ if (data -> snapshot_mode ) {
407
+ return video_stm32_dcmi_snapshot (dev , vbuf , timeout );
408
+ }
409
+
410
+ * vbuf = k_fifo_get (& data -> fifo_out , timeout );
411
+ LOG_DBG ("k_fifo_get returned: %p\n" , * vbuf );
412
+
413
+ return (* vbuf == NULL ) ? - EAGAIN : 0 ;
414
+ }
415
+
381
416
static int video_stm32_dcmi_get_caps (const struct device * dev , struct video_caps * caps )
382
417
{
383
418
const struct video_stm32_dcmi_config * config = dev -> config ;
@@ -601,6 +636,7 @@ static const struct video_stm32_dcmi_config video_stm32_dcmi_config_0 = {
601
636
.pctrl = PINCTRL_DT_INST_DEV_CONFIG_GET (0 ),
602
637
.sensor_dev = SOURCE_DEV (0 ),
603
638
.snapshot_mode = DT_INST_PROP (0 , snapshot_mode ),
639
+ .snapshot_timeout = DT_INST_PROP (0 , snapshot_timeout ),
604
640
DCMI_DMA_CHANNEL (0 , PERIPHERAL , MEMORY )
605
641
};
606
642
0 commit comments