@@ -30,6 +30,16 @@ static void disp_flush( lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color
3030 lv_disp_flush_ready ( disp_drv );
3131}
3232
33+ static void disp_flushDMA ( lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p )
34+ {
35+ uint32_t w = ( area->x2 - area->x1 + 1 );
36+ uint32_t h = ( area->y2 - area->y1 + 1 );
37+ static_cast <LilyGo_Display *>(disp_drv->user_data )->setAddrWindow (area->x1 , area->y1 , area->x2 , area->y2 );
38+ static_cast <LilyGo_Display *>(disp_drv->user_data )->pushColorsDMA ((uint16_t *)color_p, w * h);
39+
40+ lv_disp_flush_ready ( disp_drv );
41+ }
42+
3343/* Read the touchpad*/
3444static void touchpad_read ( lv_indev_drv_t *indev_driver, lv_indev_data_t *data )
3545{
@@ -109,6 +119,52 @@ static void lv_rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area)
109119 area->y2 ++;
110120}
111121
122+ void beginLvglHelperDMA (LilyGo_Display &board, bool debug) {
123+ lv_init ();
124+
125+ #if LV_USE_LOG
126+ if (debug) {
127+ lv_log_register_print_cb (lv_log_print_g_cb);
128+ }
129+ #endif
130+
131+ size_t lv_buffer_size = (board.width () * board.height () / 10 ) * sizeof (lv_color_t );
132+
133+ lv_color_t *buf1 = (lv_color_t *)heap_caps_malloc (lv_buffer_size, MALLOC_CAP_DMA);
134+ lv_color_t *buf2 = (lv_color_t *)heap_caps_malloc (lv_buffer_size, MALLOC_CAP_DMA);
135+
136+ assert (buf1 && buf2);
137+
138+ if (!esp_ptr_dma_capable (buf1) || !esp_ptr_dma_capable (buf2)) {
139+ Serial.println (" Error: Buffers are not DMA-capable!" );
140+ }
141+
142+ /* Initialize the display*/
143+ lv_disp_drv_init ( &disp_drv );
144+ /* display resolution */
145+ disp_drv.hor_res = board.width ();
146+ disp_drv.ver_res = board.height ();
147+ disp_drv.flush_cb = disp_flushDMA;
148+ disp_drv.draw_buf = &draw_buf;
149+ bool full_refresh = board.needFullRefresh ();
150+ disp_drv.full_refresh = full_refresh;
151+ disp_drv.user_data = &board;
152+ if (!full_refresh) {
153+ disp_drv.rounder_cb = lv_rounder_cb;
154+ }
155+ lv_disp_drv_register ( &disp_drv );
156+
157+ if (board.hasTouch ()) {
158+ lv_indev_drv_init ( &indev_drv );
159+ indev_drv.type = LV_INDEV_TYPE_POINTER;
160+ indev_drv.read_cb = touchpad_read;
161+ indev_drv.user_data = &board;
162+ lv_indev_drv_register ( &indev_drv );
163+ }
164+
165+ lv_group_set_default (lv_group_create ());
166+ }
167+
112168void beginLvglHelper (LilyGo_Display &board, bool debug)
113169{
114170
0 commit comments