17
17
#include <stdalign.h>
18
18
#include "esp_heap_caps.h"
19
19
#include "freertos/FreeRTOS.h"
20
+ #include "freertos/task.h"
20
21
#include "ll_cam.h"
21
22
#include "cam_hal.h"
22
23
@@ -262,6 +263,18 @@ static void cam_task(void *arg)
262
263
& frame_buffer_event -> buf [frame_buffer_event -> len ],
263
264
& cam_obj -> dma_buffer [(cnt % cam_obj -> dma_half_buffer_cnt ) * cam_obj -> dma_half_buffer_size ],
264
265
cam_obj -> dma_half_buffer_size );
266
+ } else {
267
+ // stop if the next DMA copy would exceed the framebuffer slot
268
+ // size, since we're called only after the copy occurs
269
+ // This effectively reduces maximum usable frame buffer size
270
+ // by one DMA operation, as we can't predict here, if the next
271
+ // cam event will be a VSYNC
272
+ if (cnt + 1 >= cam_obj -> frame_copy_cnt ) {
273
+ ESP_CAMERA_ETS_PRINTF (DRAM_STR ("cam_hal: DMA overflow\r\n" ));
274
+ ll_cam_stop (cam_obj );
275
+ cam_obj -> state = CAM_STATE_IDLE ;
276
+ continue ;
277
+ }
265
278
}
266
279
267
280
//Check for JPEG SOI in the first buffer. stop if not found
@@ -311,14 +324,6 @@ static void cam_task(void *arg)
311
324
}
312
325
313
326
cnt ++ ;
314
- // stop when too many DMA copies occur so the PSRAM
315
- // framebuffer slot doesn't overflow from runaway transfers
316
- if (cnt >= cam_obj -> frame_copy_cnt ) {
317
- ESP_LOGE (TAG , "DMA overflow" );
318
- ll_cam_stop (cam_obj );
319
- cam_obj -> state = CAM_STATE_IDLE ;
320
- continue ;
321
- }
322
327
323
328
} else if (cam_event == CAM_VSYNC_EVENT ) {
324
329
//DBG_PIN_SET(1);
@@ -416,6 +421,9 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
416
421
417
422
cam_obj -> dma_node_cnt = (cam_obj -> dma_buffer_size ) / cam_obj -> dma_node_buffer_size ; // Number of DMA nodes
418
423
cam_obj -> frame_copy_cnt = cam_obj -> recv_size / cam_obj -> dma_half_buffer_size ; // Number of interrupted copies, ping-pong copy
424
+ if (cam_obj -> psram_mode ) {
425
+ cam_obj -> frame_copy_cnt ++ ;
426
+ }
419
427
420
428
ESP_LOGI (TAG , "buffer_size: %d, half_buffer_size: %d, node_buffer_size: %d, node_cnt: %d, total_cnt: %d" ,
421
429
(int ) cam_obj -> dma_buffer_size , (int ) cam_obj -> dma_half_buffer_size , (int ) cam_obj -> dma_node_buffer_size ,
@@ -434,6 +442,7 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
434
442
if (cam_obj -> fb_size < cam_obj -> recv_size ) {
435
443
fb_size = cam_obj -> recv_size ;
436
444
}
445
+ fb_size += cam_obj -> dma_half_buffer_size ;
437
446
}
438
447
439
448
/* Allocate memory for frame buffer */
0 commit comments