From 180adf91d757e1a895170564fddd15d4a891c86c Mon Sep 17 00:00:00 2001 From: Alain Volmat <58030053+avolmat-st@users.noreply.github.com> Date: Wed, 27 May 2026 10:02:07 +0200 Subject: [PATCH] feat(dma2d): enable ASYNC/INTERRUPT with ZephyrOS (#10187) Signed-off-by: Alain Volmat Co-authored-by: Alain Volmat --- src/draw/dma2d/lv_draw_dma2d.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/draw/dma2d/lv_draw_dma2d.c b/src/draw/dma2d/lv_draw_dma2d.c index 14bb40b2f2..5446fa7ed5 100644 --- a/src/draw/dma2d/lv_draw_dma2d.c +++ b/src/draw/dma2d/lv_draw_dma2d.c @@ -13,6 +13,11 @@ #include "../sw/lv_draw_sw.h" #include "../../misc/lv_area_private.h" +#if defined(__ZEPHYR__) && LV_USE_DRAW_DMA2D_INTERRUPT + #include + #include +#endif + #if !LV_DRAW_DMA2D_ASYNC && LV_USE_DRAW_DMA2D_INTERRUPT #warning LV_USE_DRAW_DMA2D_INTERRUPT is 1 but has no effect because LV_USE_OS is LV_OS_NONE #endif @@ -38,6 +43,9 @@ static int32_t delete_cb(lv_draw_unit_t * draw_unit); static int32_t wait_finish_cb(lv_draw_unit_t * u); #endif static void post_transfer_tasks(lv_draw_dma2d_unit_t * u); +#if defined(__ZEPHYR__) && LV_USE_DRAW_DMA2D_INTERRUPT + static void zephyr_dma2d_irq_handler(void *); +#endif /********************** * STATIC VARIABLES @@ -90,8 +98,13 @@ void lv_draw_dma2d_init(void) /* disable dead time */ DMA2D->AMTCR = 0; +#if defined(__ZEPHYR__) && LV_USE_DRAW_DMA2D_INTERRUPT + IRQ_CONNECT(DT_IRQN(DT_NODELABEL(dma2d)), DT_IRQ(DT_NODELABEL(dma2d), priority), zephyr_dma2d_irq_handler, NULL, 0); + irq_enable(DT_IRQN(DT_NODELABEL(dma2d))); +#else /* enable the interrupt */ NVIC_EnableIRQ(DMA2D_IRQn); +#endif } void lv_draw_dma2d_deinit(void) @@ -263,6 +276,15 @@ void lv_draw_dma2d_clean_cache(const lv_draw_dma2d_cache_area_t * mem_area) /********************** * STATIC FUNCTIONS **********************/ +#if defined(__ZEPHYR__) && LV_USE_DRAW_DMA2D_INTERRUPT +static void zephyr_dma2d_irq_handler(void *) +{ + /* Clear Transfer Complete flag */ + DMA2D->IFCR = DMA2D_IFCR_CTCIF; + + lv_draw_dma2d_transfer_complete_interrupt_handler(); +} +#endif static int32_t evaluate_cb(lv_draw_unit_t * draw_unit, lv_draw_task_t * task) {