Skip to content

Commit 307bcc0

Browse files
authored
Merge pull request #781 from RubenKelevra/buffer_overflow_check_rework_for_psram_mode
rework psram_mode frame buffer overflow check
2 parents 877e5e9 + 1e1eb15 commit 307bcc0

File tree

1 file changed

+17
-8
lines changed

1 file changed

+17
-8
lines changed

driver/cam_hal.c

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include <stdalign.h>
1818
#include "esp_heap_caps.h"
1919
#include "freertos/FreeRTOS.h"
20+
#include "freertos/task.h"
2021
#include "ll_cam.h"
2122
#include "cam_hal.h"
2223

@@ -262,6 +263,18 @@ static void cam_task(void *arg)
262263
&frame_buffer_event->buf[frame_buffer_event->len],
263264
&cam_obj->dma_buffer[(cnt % cam_obj->dma_half_buffer_cnt) * cam_obj->dma_half_buffer_size],
264265
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+
}
265278
}
266279

267280
//Check for JPEG SOI in the first buffer. stop if not found
@@ -311,14 +324,6 @@ static void cam_task(void *arg)
311324
}
312325

313326
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-
}
322327

323328
} else if (cam_event == CAM_VSYNC_EVENT) {
324329
//DBG_PIN_SET(1);
@@ -416,6 +421,9 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
416421

417422
cam_obj->dma_node_cnt = (cam_obj->dma_buffer_size) / cam_obj->dma_node_buffer_size; // Number of DMA nodes
418423
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+
}
419427

420428
ESP_LOGI(TAG, "buffer_size: %d, half_buffer_size: %d, node_buffer_size: %d, node_cnt: %d, total_cnt: %d",
421429
(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)
434442
if (cam_obj->fb_size < cam_obj->recv_size) {
435443
fb_size = cam_obj->recv_size;
436444
}
445+
fb_size += cam_obj->dma_half_buffer_size;
437446
}
438447

439448
/* Allocate memory for frame buffer */

0 commit comments

Comments
 (0)