diff --git a/Kconfig b/Kconfig index ceb2f4c34..65afe06b2 100644 --- a/Kconfig +++ b/Kconfig @@ -1832,6 +1832,11 @@ menu "LVGL configuration" depends on LV_USE_NUTTX default n + config LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + bool "Use independent image heap for default draw buffer" + depends on LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP + default n + config LV_USE_NUTTX_LIBUV bool "Use uv loop to replace default timer loop and other fb/indev timers" depends on LV_USE_NUTTX && LIBUV diff --git a/lv_conf_template.h b/lv_conf_template.h index af2f1d6e7..441595a1c 100644 --- a/lv_conf_template.h +++ b/lv_conf_template.h @@ -1155,6 +1155,9 @@ #if LV_USE_NUTTX #define LV_USE_NUTTX_INDEPENDENT_IMAGE_HEAP 0 + /** Use independent image heap for default draw buffer */ + #define LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP 0 + #define LV_USE_NUTTX_LIBUV 0 /** Use Nuttx custom init API to open window and handle touchscreen */ diff --git a/src/drivers/nuttx/lv_nuttx_image_cache.c b/src/drivers/nuttx/lv_nuttx_image_cache.c index 56a480542..ce1b1bca8 100644 --- a/src/drivers/nuttx/lv_nuttx_image_cache.c +++ b/src/drivers/nuttx/lv_nuttx_image_cache.c @@ -44,6 +44,11 @@ typedef struct { lv_draw_buf_malloc_cb malloc_cb; lv_draw_buf_free_cb free_cb; + +#if LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + lv_draw_buf_malloc_cb malloc_cb_default; + lv_draw_buf_free_cb free_cb_default; +#endif } lv_nuttx_ctx_image_cache_t; /********************** * STATIC PROTOTYPES @@ -77,6 +82,15 @@ void lv_nuttx_image_cache_init(bool use_independent_image_heap) handlers->buf_malloc_cb = malloc_cb; handlers->buf_free_cb = free_cb; +#if LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + handlers = lv_draw_buf_get_handlers(); + ctx->malloc_cb_default = handlers->buf_malloc_cb; + ctx->free_cb_default = handlers->buf_free_cb; + + handlers->buf_malloc_cb = malloc_cb; + handlers->buf_free_cb = free_cb; +#endif + ctx->initialized = false; ctx->independent_image_heap = use_independent_image_heap; } @@ -93,6 +107,13 @@ FREE_CONTEXT: lv_draw_buf_handlers_t * handlers = image_cache_draw_buf_handlers; handlers->buf_malloc_cb = ctx->malloc_cb; handlers->buf_free_cb = ctx->free_cb; + +#if LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + handlers = lv_draw_buf_get_handlers(); + handlers->buf_malloc_cb = ctx->malloc_cb_default; + handlers->buf_free_cb = ctx->free_cb_default; +#endif + lv_free(ctx); ctx = NULL; diff --git a/src/lv_conf_internal.h b/src/lv_conf_internal.h index 435aba69f..f37685adf 100644 --- a/src/lv_conf_internal.h +++ b/src/lv_conf_internal.h @@ -3730,6 +3730,15 @@ #endif #endif + /** Use independent image heap for default draw buffer */ + #ifndef LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + #ifdef CONFIG_LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + #define LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP CONFIG_LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP + #else + #define LV_NUTTX_DEFAULT_DRAW_BUF_USE_INDEPENDENT_IMAGE_HEAP 0 + #endif + #endif + #ifndef LV_USE_NUTTX_LIBUV #ifdef CONFIG_LV_USE_NUTTX_LIBUV #define LV_USE_NUTTX_LIBUV CONFIG_LV_USE_NUTTX_LIBUV