1 /**
2  * @file lv_draw_dma2d_private.h
3  *
4  */
5 
6 #ifndef LV_DRAW_DMA2D_PRIVATE_H
7 #define LV_DRAW_DMA2D_PRIVATE_H
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 /*********************
14  *      INCLUDES
15  *********************/
16 
17 #include "lv_draw_dma2d.h"
18 #if LV_USE_DRAW_DMA2D
19 
20 #include "../lv_draw_private.h"
21 #include "../sw/lv_draw_sw.h"
22 #include LV_DRAW_DMA2D_HAL_INCLUDE
23 
24 /*********************
25  *      DEFINES
26  *********************/
27 
28 #if LV_USE_DRAW_DMA2D_INTERRUPT && LV_USE_OS
29 #define LV_DRAW_DMA2D_ASYNC 1
30 #else
31 #define LV_DRAW_DMA2D_ASYNC 0
32 #endif
33 
34 #if defined(__CORTEX_M) && (__CORTEX_M == 7)
35 #define LV_DRAW_DMA2D_CACHE 1
36 #else
37 #define LV_DRAW_DMA2D_CACHE 0
38 #endif
39 
40 /**********************
41  *      TYPEDEFS
42  **********************/
43 
44 typedef enum {
45     LV_DRAW_DMA2D_OUTPUT_CF_ARGB8888 = 0,
46     LV_DRAW_DMA2D_OUTPUT_CF_RGB888,
47     LV_DRAW_DMA2D_OUTPUT_CF_RGB565,
48     LV_DRAW_DMA2D_OUTPUT_CF_ARGB1555,
49     LV_DRAW_DMA2D_OUTPUT_CF_ARGB4444
50 } lv_draw_dma2d_output_cf_t;
51 
52 typedef enum {
53     LV_DRAW_DMA2D_FGBG_CF_ARGB8888 = 0,
54     LV_DRAW_DMA2D_FGBG_CF_RGB888,
55     LV_DRAW_DMA2D_FGBG_CF_RGB565,
56     LV_DRAW_DMA2D_FGBG_CF_ARGB1555,
57     LV_DRAW_DMA2D_FGBG_CF_ARGB4444,
58     LV_DRAW_DMA2D_FGBG_CF_L8,
59     LV_DRAW_DMA2D_FGBG_CF_AL44,
60     LV_DRAW_DMA2D_FGBG_CF_AL88,
61     LV_DRAW_DMA2D_FGBG_CF_L4,
62     LV_DRAW_DMA2D_FGBG_CF_A8,
63     LV_DRAW_DMA2D_FGBG_CF_A4,
64     LV_DRAW_DMA2D_FGBG_CF_YCBCR
65 } lv_draw_dma2d_fgbg_cf_t;
66 
67 typedef enum {
68     LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY = 0,
69     LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_PFC,
70     LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_BLENDING,
71     LV_DRAW_DMA2D_MODE_REGISTER_TO_MEMORY,
72     LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_BLENDING_AND_FIXED_COLOR_FG,
73     LV_DRAW_DMA2D_MODE_MEMORY_TO_MEMORY_WITH_BLENDING_AND_FIXED_COLOR_BG
74 } lv_draw_dma2d_mode_t;
75 
76 typedef enum {
77     LV_DRAW_DMA2D_ALPHA_MODE_NO_MODIFY_IMAGE_ALPHA_CHANNEL = 0,
78     LV_DRAW_DMA2D_ALPHA_MODE_REPLACE_ALPHA_CHANNEL,
79     LV_DRAW_DMA2D_ALPHA_MODE_MULTIPLY_IMAGE_ALPHA_CHANNEL
80 } lv_draw_dma2d_alpha_mode_t;
81 
82 typedef struct {
83     lv_draw_dma2d_mode_t mode;
84     uint32_t w;
85     uint32_t h;
86 
87     void * output_address;
88     uint32_t output_offset;
89     lv_draw_dma2d_output_cf_t output_cf;
90 
91     uint32_t reg_to_mem_mode_color;
92 
93     const void * fg_address;
94     uint32_t fg_offset;
95     lv_draw_dma2d_fgbg_cf_t fg_cf;
96     uint32_t fg_color;
97     uint32_t fg_alpha_mode;
98     uint32_t fg_alpha;
99 
100     const void * bg_address;
101     uint32_t bg_offset;
102     lv_draw_dma2d_fgbg_cf_t bg_cf;
103     uint32_t bg_color;
104     uint32_t bg_alpha_mode;
105     uint32_t bg_alpha;
106 
107 } lv_draw_dma2d_configuration_t;
108 
109 typedef struct {
110     const void * first_byte;
111     uint32_t width_bytes;
112     uint32_t height;
113     uint32_t stride;
114 } lv_draw_dma2d_cache_area_t;
115 
116 typedef struct {
117     lv_draw_unit_t base_unit;
118     lv_draw_task_t * volatile task_act;
119 #if LV_DRAW_DMA2D_CACHE
120     lv_draw_dma2d_cache_area_t writing_area;
121 #endif
122 #if LV_DRAW_DMA2D_ASYNC
123     lv_thread_t thread;
124     lv_thread_sync_t interrupt_signal;
125 #endif
126 } lv_draw_dma2d_unit_t;
127 
128 /**********************
129  * GLOBAL PROTOTYPES
130  **********************/
131 
132 void lv_draw_dma2d_opaque_fill(lv_draw_dma2d_unit_t * u, void * first_pixel, int32_t w, int32_t h, int32_t stride);
133 void lv_draw_dma2d_fill(lv_draw_dma2d_unit_t * u, void * first_pixel, int32_t w, int32_t h, int32_t stride);
134 void lv_draw_dma2d_opaque_image(lv_draw_dma2d_unit_t * u, void * dest_first_pixel, lv_area_t * clipped_coords,
135                                 int32_t dest_stride);
136 void lv_draw_dma2d_image(lv_draw_dma2d_unit_t * u, void * dest_first_pixel, lv_area_t * clipped_coords,
137                          int32_t dest_stride);
138 lv_draw_dma2d_output_cf_t lv_draw_dma2d_cf_to_dma2d_output_cf(lv_color_format_t cf);
139 uint32_t lv_draw_dma2d_color_to_dma2d_color(lv_draw_dma2d_output_cf_t cf, lv_color_t color);
140 void lv_draw_dma2d_configure_and_start_transfer(const lv_draw_dma2d_configuration_t * conf);
141 #if LV_DRAW_DMA2D_CACHE
142 void lv_draw_dma2d_invalidate_cache(const lv_draw_dma2d_cache_area_t * mem_area);
143 void lv_draw_dma2d_clean_cache(const lv_draw_dma2d_cache_area_t * mem_area);
144 #endif
145 
146 /**********************
147  *      MACROS
148  **********************/
149 
150 #endif /*LV_USE_DRAW_DMA2D*/
151 
152 #ifdef __cplusplus
153 } /*extern "C"*/
154 #endif
155 
156 #endif /*LV_DRAW_DMA2D_PRIVATE_H*/
157