drivers: video: Add SMH option for video buffer
This commit enables the user to choose whether to allocate the video buffer from the video heap pool or use a memory region with specific extra capabilities, such as being cacheable/non-cacheable or using external memory. Signed-off-by: Lucas Tamborrino <lucas.tamborrino@espressif.com>
This commit is contained in:
parent
679547495b
commit
43cc36f4bc
2 changed files with 29 additions and 5 deletions
|
@ -35,6 +35,21 @@ config VIDEO_BUFFER_POOL_ALIGN
|
||||||
int "Alignment of the video pool’s buffer"
|
int "Alignment of the video pool’s buffer"
|
||||||
default 64
|
default 64
|
||||||
|
|
||||||
|
config VIDEO_BUFFER_USE_SHARED_MULTI_HEAP
|
||||||
|
bool "Use shared multi heap for video buffer"
|
||||||
|
default n
|
||||||
|
|
||||||
|
config VIDEO_BUFFER_SMH_ATTRIBUTE
|
||||||
|
int "Shared multi heap attribute for video buffer"
|
||||||
|
depends on VIDEO_BUFFER_USE_SHARED_MULTI_HEAP
|
||||||
|
default 0
|
||||||
|
range 0 2
|
||||||
|
help
|
||||||
|
Shared multi heap attribute for video buffer:
|
||||||
|
0: SMH_REG_ATTR_CACHEABLE
|
||||||
|
1: SMH_REG_ATTR_NON_CACHEABLE
|
||||||
|
2: SMH_REG_ATTR_EXTERNAL
|
||||||
|
|
||||||
source "drivers/video/Kconfig.esp32_dvp"
|
source "drivers/video/Kconfig.esp32_dvp"
|
||||||
|
|
||||||
source "drivers/video/Kconfig.mcux_csi"
|
source "drivers/video/Kconfig.mcux_csi"
|
||||||
|
|
|
@ -7,9 +7,18 @@
|
||||||
#include <zephyr/kernel.h>
|
#include <zephyr/kernel.h>
|
||||||
#include <zephyr/drivers/video.h>
|
#include <zephyr/drivers/video.h>
|
||||||
|
|
||||||
K_HEAP_DEFINE(video_buffer_pool,
|
#if defined(CONFIG_VIDEO_BUFFER_USE_SHARED_MULTI_HEAP)
|
||||||
CONFIG_VIDEO_BUFFER_POOL_SZ_MAX *
|
#include <zephyr/multi_heap/shared_multi_heap.h>
|
||||||
CONFIG_VIDEO_BUFFER_POOL_NUM_MAX);
|
|
||||||
|
#define VIDEO_COMMON_HEAP_ALLOC(align, size, timeout) \
|
||||||
|
shared_multi_heap_aligned_alloc(CONFIG_VIDEO_BUFFER_SMH_ATTRIBUTE, align, size)
|
||||||
|
#define VIDEO_COMMON_FREE(block) shared_multi_heap_free(block)
|
||||||
|
#else
|
||||||
|
K_HEAP_DEFINE(video_buffer_pool, CONFIG_VIDEO_BUFFER_POOL_SZ_MAX*CONFIG_VIDEO_BUFFER_POOL_NUM_MAX);
|
||||||
|
#define VIDEO_COMMON_HEAP_ALLOC(align, size, timeout) \
|
||||||
|
k_heap_aligned_alloc(&video_buffer_pool, align, size, timeout);
|
||||||
|
#define VIDEO_COMMON_FREE(block) k_heap_free(&video_buffer_pool, block)
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct video_buffer video_buf[CONFIG_VIDEO_BUFFER_POOL_NUM_MAX];
|
static struct video_buffer video_buf[CONFIG_VIDEO_BUFFER_POOL_NUM_MAX];
|
||||||
|
|
||||||
|
@ -39,7 +48,7 @@ struct video_buffer *video_buffer_aligned_alloc(size_t size, size_t align)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Alloc buffer memory */
|
/* Alloc buffer memory */
|
||||||
block->data = k_heap_aligned_alloc(&video_buffer_pool, align, size, K_FOREVER);
|
block->data = VIDEO_COMMON_HEAP_ALLOC(align, size, K_FOREVER);
|
||||||
if (block->data == NULL) {
|
if (block->data == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -71,6 +80,6 @@ void video_buffer_release(struct video_buffer *vbuf)
|
||||||
|
|
||||||
vbuf->buffer = NULL;
|
vbuf->buffer = NULL;
|
||||||
if (block) {
|
if (block) {
|
||||||
k_heap_free(&video_buffer_pool, block->data);
|
VIDEO_COMMON_FREE(block->data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue