Skip to content

Commit dae0ca2

Browse files
authored
Merge pull request #101 from kennygarreau/dma-branch
add DMA display capability
2 parents 5fb5840 + 5cf0132 commit dae0ca2

File tree

5 files changed

+106
-1
lines changed

5 files changed

+106
-1
lines changed

src/LV_Helper.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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*/
3444
static 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+
112168
void beginLvglHelper(LilyGo_Display &board, bool debug)
113169
{
114170

src/LV_Helper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515

1616
void beginLvglHelper(LilyGo_Display &board, bool debug = false);
17-
17+
void beginLvglHelperDMA(LilyGo_Display &board, bool debug);
1818
void beginLvglInputDevice(struct InputParams prams);
1919

2020

src/LilyGo_AMOLED.cpp

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,53 @@ void LilyGo_AMOLED::pushColors(uint16_t x, uint16_t y, uint16_t width, uint16_t
971971
}
972972
}
973973

974+
void LilyGo_AMOLED::pushColorsDMA(uint16_t *data, uint32_t len) {
975+
if (!spi) return;
976+
977+
bool first_send = true;
978+
setCS();
979+
980+
while (len > 0) {
981+
size_t chunk_size = len;
982+
if (chunk_size > SEND_BUF_SIZE) {
983+
chunk_size = SEND_BUF_SIZE;
984+
}
985+
986+
spi_transaction_ext_t t = {0};
987+
memset(&t, 0, sizeof(t));
988+
989+
if (first_send) {
990+
t.base.flags = SPI_TRANS_MODE_QIO;
991+
t.base.cmd = 0x32;
992+
t.base.addr = 0x002C00;
993+
first_send = 0;
994+
} else {
995+
t.base.flags = SPI_TRANS_MODE_QIO | SPI_TRANS_VARIABLE_CMD | SPI_TRANS_VARIABLE_ADDR | SPI_TRANS_VARIABLE_DUMMY;
996+
t.command_bits = 0;
997+
t.address_bits = 0;
998+
t.dummy_bits = 0;
999+
}
1000+
1001+
t.base.tx_buffer = data;
1002+
t.base.length = chunk_size * 16;
1003+
1004+
esp_err_t ret = spi_device_queue_trans(spi, &t.base, portMAX_DELAY);
1005+
if (ret != ESP_OK) {
1006+
log_e("DMA transfer failed!");
1007+
}
1008+
1009+
spi_transaction_t *trans_result;
1010+
ret = spi_device_get_trans_result(spi, &trans_result, portMAX_DELAY);
1011+
if (ret != ESP_OK) {
1012+
log_e("DMA SPI transfer failed!");
1013+
}
1014+
1015+
data += chunk_size;
1016+
len -= chunk_size;
1017+
}
1018+
1019+
clrCS();
1020+
}
9741021

9751022
void LilyGo_AMOLED::beginCore()
9761023
{

src/LilyGo_AMOLED.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ class LilyGo_AMOLED:
353353
void setAddrWindow(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye);
354354
void pushColors(uint16_t *data, uint32_t len);
355355
void pushColors(uint16_t x, uint16_t y, uint16_t width, uint16_t hight, uint16_t *data);
356+
void pushColorsDMA(uint16_t *data, uint32_t len);
356357

357358
/**
358359
* @brief Hang on SD card

src/LilyGo_Display.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class LilyGo_Display
2424
virtual void setAddrWindow(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye) = 0;
2525
virtual void pushColors(uint16_t *data, uint32_t len) = 0;
2626
virtual void pushColors(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t *data) = 0;
27+
virtual void pushColorsDMA(uint16_t *data, uint32_t len) = 0;
2728
virtual uint16_t width() = 0;
2829
virtual uint16_t height() = 0;
2930

0 commit comments

Comments
 (0)