32
32
#endif // ESP_IDF_VERSION_MAJOR
33
33
#define ESP_CAMERA_ETS_PRINTF ets_printf
34
34
35
+ #if CONFIG_CAM_TASK_STACK_SIZE
36
+ #define CAM_TASK_STACK CONFIG_CAM_TASK_STACK_SIZE
37
+ #else
38
+ #define CAM_TASK_STACK (2*1024)
39
+ #endif
40
+
35
41
static const char * TAG = "cam_hal" ;
36
42
static cam_obj_t * cam_obj = NULL ;
37
43
@@ -45,7 +51,7 @@ static int cam_verify_jpeg_soi(const uint8_t *inbuf, uint32_t length)
45
51
for (uint32_t i = 0 ; i < length ; i ++ ) {
46
52
sig = * ((uint32_t * )(& inbuf [i ])) & 0xFFFFFF ;
47
53
if (sig == JPEG_SOI_MARKER ) {
48
- ESP_LOGW (TAG , "SOI: %d" , i );
54
+ ESP_LOGW (TAG , "SOI: %d" , ( int ) i );
49
55
return i ;
50
56
}
51
57
}
@@ -117,7 +123,7 @@ static void cam_task(void *arg)
117
123
int frame_pos = 0 ;
118
124
cam_obj -> state = CAM_STATE_IDLE ;
119
125
cam_event_t cam_event = 0 ;
120
-
126
+
121
127
xQueueReset (cam_obj -> event_queue );
122
128
123
129
while (1 ) {
@@ -140,7 +146,7 @@ static void cam_task(void *arg)
140
146
case CAM_STATE_READ_BUF : {
141
147
camera_fb_t * frame_buffer_event = & cam_obj -> frames [frame_pos ].fb ;
142
148
size_t pixels_per_dma = (cam_obj -> dma_half_buffer_size * cam_obj -> fb_bytes_per_pixel ) / (cam_obj -> dma_bytes_per_item * cam_obj -> in_bytes_per_pixel );
143
-
149
+
144
150
if (cam_event == CAM_IN_SUC_EOF_EVENT ) {
145
151
if (!cam_obj -> psram_mode ){
146
152
if (cam_obj -> fb_size < (frame_buffer_event -> len + pixels_per_dma )) {
@@ -150,8 +156,8 @@ static void cam_task(void *arg)
150
156
continue ;
151
157
}
152
158
frame_buffer_event -> len += ll_cam_memcpy (cam_obj ,
153
- & frame_buffer_event -> buf [frame_buffer_event -> len ],
154
- & cam_obj -> dma_buffer [(cnt % cam_obj -> dma_half_buffer_cnt ) * cam_obj -> dma_half_buffer_size ],
159
+ & frame_buffer_event -> buf [frame_buffer_event -> len ],
160
+ & cam_obj -> dma_buffer [(cnt % cam_obj -> dma_half_buffer_cnt ) * cam_obj -> dma_half_buffer_size ],
155
161
cam_obj -> dma_half_buffer_size );
156
162
}
157
163
//Check for JPEG SOI in the first buffer. stop if not found
@@ -173,8 +179,8 @@ static void cam_task(void *arg)
173
179
cnt -- ;
174
180
} else {
175
181
frame_buffer_event -> len += ll_cam_memcpy (cam_obj ,
176
- & frame_buffer_event -> buf [frame_buffer_event -> len ],
177
- & cam_obj -> dma_buffer [(cnt % cam_obj -> dma_half_buffer_cnt ) * cam_obj -> dma_half_buffer_size ],
182
+ & frame_buffer_event -> buf [frame_buffer_event -> len ],
183
+ & cam_obj -> dma_buffer [(cnt % cam_obj -> dma_half_buffer_cnt ) * cam_obj -> dma_half_buffer_size ],
178
184
cam_obj -> dma_half_buffer_size );
179
185
}
180
186
}
@@ -192,7 +198,7 @@ static void cam_task(void *arg)
192
198
} else if (!cam_obj -> jpeg_mode ) {
193
199
if (frame_buffer_event -> len != cam_obj -> fb_size ) {
194
200
cam_obj -> frames [frame_pos ].en = 1 ;
195
- ESP_LOGE (TAG , "FB-SIZE: %u != %u" , frame_buffer_event -> len , cam_obj -> fb_size );
201
+ ESP_LOGE (TAG , "FB-SIZE: %u != %u" , frame_buffer_event -> len , ( unsigned ) cam_obj -> fb_size );
196
202
}
197
203
}
198
204
//send frame
@@ -258,8 +264,9 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
258
264
cam_obj -> dma_node_cnt = (cam_obj -> dma_buffer_size ) / cam_obj -> dma_node_buffer_size ; // Number of DMA nodes
259
265
cam_obj -> frame_copy_cnt = cam_obj -> recv_size / cam_obj -> dma_half_buffer_size ; // Number of interrupted copies, ping-pong copy
260
266
261
- ESP_LOGI (TAG , "buffer_size: %d, half_buffer_size: %d, node_buffer_size: %d, node_cnt: %d, total_cnt: %d" ,
262
- cam_obj -> dma_buffer_size , cam_obj -> dma_half_buffer_size , cam_obj -> dma_node_buffer_size , cam_obj -> dma_node_cnt , cam_obj -> frame_copy_cnt );
267
+ ESP_LOGI (TAG , "buffer_size: %d, half_buffer_size: %d, node_buffer_size: %d, node_cnt: %d, total_cnt: %d" ,
268
+ (int ) cam_obj -> dma_buffer_size , (int ) cam_obj -> dma_half_buffer_size , (int ) cam_obj -> dma_node_buffer_size ,
269
+ (int ) cam_obj -> dma_node_cnt , (int ) cam_obj -> frame_copy_cnt );
263
270
264
271
cam_obj -> dma_buffer = NULL ;
265
272
cam_obj -> dma = NULL ;
@@ -289,13 +296,19 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
289
296
cam_obj -> frames [x ].fb_offset = 0 ;
290
297
cam_obj -> frames [x ].en = 0 ;
291
298
ESP_LOGI (TAG , "Allocating %d Byte frame buffer in %s" , alloc_size , _caps & MALLOC_CAP_SPIRAM ? "PSRAM" : "OnBoard RAM" );
299
+ #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (4 , 3 , 0 )
300
+ // In IDF v4.2 and earlier, memory returned by heap_caps_aligned_alloc must be freed using heap_caps_aligned_free.
301
+ // And heap_caps_aligned_free is deprecated on v4.3.
302
+ cam_obj -> frames [x ].fb .buf = (uint8_t * )heap_caps_aligned_alloc (16 , alloc_size , _caps );
303
+ #else
292
304
cam_obj -> frames [x ].fb .buf = (uint8_t * )heap_caps_malloc (alloc_size , _caps );
305
+ #endif
293
306
CAM_CHECK (cam_obj -> frames [x ].fb .buf != NULL , "frame buffer malloc failed" , ESP_FAIL );
294
307
if (cam_obj -> psram_mode ) {
295
308
//align PSRAM buffer. TODO: save the offset so proper address can be freed later
296
309
cam_obj -> frames [x ].fb_offset = dma_align - ((uint32_t )cam_obj -> frames [x ].fb .buf & (dma_align - 1 ));
297
310
cam_obj -> frames [x ].fb .buf += cam_obj -> frames [x ].fb_offset ;
298
- ESP_LOGI (TAG , "Frame[%d]: Offset: %u, Addr: 0x%08X" , x , cam_obj -> frames [x ].fb_offset , (uint32_t ) cam_obj -> frames [x ].fb .buf );
311
+ ESP_LOGI (TAG , "Frame[%d]: Offset: %u, Addr: 0x%08X" , x , cam_obj -> frames [x ].fb_offset , (unsigned ) cam_obj -> frames [x ].fb .buf );
299
312
cam_obj -> frames [x ].dma = allocate_dma_descriptors (cam_obj -> dma_node_cnt , cam_obj -> dma_node_buffer_size , cam_obj -> frames [x ].fb .buf );
300
313
CAM_CHECK (cam_obj -> frames [x ].dma != NULL , "frame dma malloc failed" , ESP_FAIL );
301
314
}
@@ -305,8 +318,8 @@ static esp_err_t cam_dma_config(const camera_config_t *config)
305
318
if (!cam_obj -> psram_mode ) {
306
319
cam_obj -> dma_buffer = (uint8_t * )heap_caps_malloc (cam_obj -> dma_buffer_size * sizeof (uint8_t ), MALLOC_CAP_DMA );
307
320
if (NULL == cam_obj -> dma_buffer ) {
308
- ESP_LOGE (TAG ,"%s(%d): DMA buffer %d Byte malloc failed, the current largest free block:%d Byte" , __FUNCTION__ , __LINE__ ,
309
- cam_obj -> dma_buffer_size , heap_caps_get_largest_free_block (MALLOC_CAP_DMA ));
321
+ ESP_LOGE (TAG ,"%s(%d): DMA buffer %d Byte malloc failed, the current largest free block:%d Byte" , __FUNCTION__ , __LINE__ ,
322
+ ( int ) cam_obj -> dma_buffer_size , ( int ) heap_caps_get_largest_free_block (MALLOC_CAP_DMA ));
310
323
return ESP_FAIL ;
311
324
}
312
325
@@ -372,7 +385,7 @@ esp_err_t cam_config(const camera_config_t *config, framesize_t frame_size, uint
372
385
cam_obj -> recv_size = cam_obj -> width * cam_obj -> height * cam_obj -> in_bytes_per_pixel ;
373
386
cam_obj -> fb_size = cam_obj -> width * cam_obj -> height * cam_obj -> fb_bytes_per_pixel ;
374
387
}
375
-
388
+
376
389
ret = cam_dma_config (config );
377
390
CAM_CHECK_GOTO (ret == ESP_OK , "cam_dma_config failed" , err );
378
391
@@ -389,16 +402,16 @@ esp_err_t cam_config(const camera_config_t *config, framesize_t frame_size, uint
389
402
ret = ll_cam_init_isr (cam_obj );
390
403
CAM_CHECK_GOTO (ret == ESP_OK , "cam intr alloc failed" , err );
391
404
392
-
405
+
393
406
#if CONFIG_CAMERA_CORE0
394
- xTaskCreatePinnedToCore (cam_task , "cam_task" , 2048 , NULL , configMAX_PRIORITIES - 2 , & cam_obj -> task_handle , 0 );
407
+ xTaskCreatePinnedToCore (cam_task , "cam_task" , CAM_TASK_STACK , NULL , configMAX_PRIORITIES - 2 , & cam_obj -> task_handle , 0 );
395
408
#elif CONFIG_CAMERA_CORE1
396
409
#if CONFIG_FREERTOS_UNICORE
397
410
#error "Cannot pin to core 1 on unicore"
398
411
#endif
399
- xTaskCreatePinnedToCore (cam_task , "cam_task" , 2048 , NULL , configMAX_PRIORITIES - 2 , & cam_obj -> task_handle , 1 );
412
+ xTaskCreatePinnedToCore (cam_task , "cam_task" , CAM_TASK_STACK , NULL , configMAX_PRIORITIES - 2 , & cam_obj -> task_handle , 1 );
400
413
#else
401
- xTaskCreate (cam_task , "cam_task" , 2048 , NULL , configMAX_PRIORITIES - 2 , & cam_obj -> task_handle );
414
+ xTaskCreate (cam_task , "cam_task" , CAM_TASK_STACK , NULL , configMAX_PRIORITIES - 2 , & cam_obj -> task_handle );
402
415
#endif
403
416
404
417
ESP_LOGI (TAG , "cam config ok" );
0 commit comments