Skip to content

Commit 851dd91

Browse files
committed
Add DMA manager for optimized bitmap transfers and update related functions
1 parent da184c6 commit 851dd91

File tree

7 files changed

+584
-4
lines changed

7 files changed

+584
-4
lines changed

include/esp32_smartdisplay_dma.h

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
#ifndef ESP32_SMARTDISPLAY_DMA_H
2+
#define ESP32_SMARTDISPLAY_DMA_H
3+
4+
#include <esp_err.h>
5+
#include <esp_lcd_panel_ops.h>
6+
#include <freertos/FreeRTOS.h>
7+
#include <freertos/queue.h>
8+
#include <freertos/semphr.h>
9+
#include <freertos/task.h>
10+
#include <lvgl.h>
11+
12+
#ifdef __cplusplus
13+
extern "C"
14+
{
15+
#endif
16+
17+
// DMA transfer configuration (default values, can be overridden via build flags)
18+
#ifndef SMARTDISPLAY_DMA_BUFFER_SIZE
19+
#define SMARTDISPLAY_DMA_BUFFER_SIZE (32 * 1024) // 32KB DMA buffer
20+
#endif
21+
22+
#ifndef SMARTDISPLAY_DMA_QUEUE_SIZE
23+
#define SMARTDISPLAY_DMA_QUEUE_SIZE 8 // Number of pending transfers
24+
#endif
25+
26+
#ifndef SMARTDISPLAY_DMA_CHUNK_THRESHOLD
27+
#define SMARTDISPLAY_DMA_CHUNK_THRESHOLD (4 * 1024) // Use DMA for transfers > 4KB
28+
#endif
29+
30+
#ifndef SMARTDISPLAY_DMA_TIMEOUT_MS
31+
#define SMARTDISPLAY_DMA_TIMEOUT_MS 1000 // DMA operation timeout
32+
#endif
33+
34+
// DMA transfer states
35+
typedef enum
36+
{
37+
SMARTDISPLAY_DMA_STATE_IDLE = 0,
38+
SMARTDISPLAY_DMA_STATE_BUSY,
39+
SMARTDISPLAY_DMA_STATE_ERROR
40+
} smartdisplay_dma_state_t;
41+
42+
// DMA transfer completion callback
43+
typedef void (*smartdisplay_dma_callback_t)(bool success, void *user_data);
44+
45+
// DMA transfer descriptor
46+
typedef struct
47+
{
48+
const void *src_data; // Source data pointer
49+
size_t data_len; // Data length in bytes
50+
int x_start, y_start; // Display coordinates
51+
int x_end, y_end; // Display coordinates
52+
smartdisplay_dma_callback_t callback; // Completion callback
53+
void *user_data; // User data for callback
54+
bool high_priority; // High priority transfer
55+
} smartdisplay_dma_transfer_t;
56+
57+
// DMA manager structure
58+
typedef struct
59+
{
60+
QueueHandle_t transfer_queue; // Queue for pending transfers
61+
SemaphoreHandle_t state_mutex; // Mutex for state protection
62+
TaskHandle_t worker_task; // DMA worker task handle
63+
smartdisplay_dma_state_t state; // Current DMA state
64+
void *dma_buffer; // DMA-capable buffer
65+
size_t dma_buffer_size; // DMA buffer size
66+
esp_lcd_panel_handle_t panel_handle; // LCD panel handle
67+
uint32_t active_transfers; // Number of active transfers
68+
uint32_t completed_transfers; // Total completed transfers
69+
uint32_t failed_transfers; // Total failed transfers
70+
} smartdisplay_dma_manager_t;
71+
72+
/**
73+
* @brief Initialize DMA manager for display transfers
74+
*
75+
* @param panel_handle LCD panel handle
76+
* @return esp_err_t ESP_OK on success
77+
*/
78+
esp_err_t smartdisplay_dma_init(esp_lcd_panel_handle_t panel_handle);
79+
80+
/**
81+
* @brief Deinitialize DMA manager
82+
*
83+
* @return esp_err_t ESP_OK on success
84+
*/
85+
esp_err_t smartdisplay_dma_deinit();
86+
87+
/**
88+
* @brief Queue a bitmap transfer with DMA optimization
89+
*
90+
* @param x_start Start X coordinate
91+
* @param y_start Start Y coordinate
92+
* @param x_end End X coordinate
93+
* @param y_end End Y coordinate
94+
* @param color_data Pixel data to transfer
95+
* @param callback Completion callback (optional)
96+
* @param user_data User data for callback (optional)
97+
* @param high_priority High priority transfer flag
98+
* @return esp_err_t ESP_OK on success
99+
*/
100+
esp_err_t smartdisplay_dma_draw_bitmap(int x_start, int y_start, int x_end, int y_end, const void *color_data, smartdisplay_dma_callback_t callback, void *user_data, bool high_priority);
101+
102+
/**
103+
* @brief Check if DMA transfer is recommended for given size
104+
*
105+
* @param data_len Data length in bytes
106+
* @return true if DMA should be used
107+
*/
108+
bool smartdisplay_dma_should_use_dma(size_t data_len);
109+
110+
/**
111+
* @brief Wait for all pending DMA transfers to complete
112+
*
113+
* @param timeout_ms Timeout in milliseconds
114+
* @return esp_err_t ESP_OK on success, ESP_ERR_TIMEOUT on timeout
115+
*/
116+
esp_err_t smartdisplay_dma_wait_all_done(uint32_t timeout_ms);
117+
118+
/**
119+
* @brief Get DMA manager statistics
120+
*
121+
* @param active_transfers Number of active transfers
122+
* @param completed_transfers Total completed transfers
123+
* @param failed_transfers Total failed transfers
124+
* @return esp_err_t ESP_OK on success
125+
*/
126+
esp_err_t smartdisplay_dma_get_stats(uint32_t *active_transfers, uint32_t *completed_transfers, uint32_t *failed_transfers);
127+
128+
/**
129+
* @brief Flush LVGL display with DMA optimization
130+
*
131+
* @param display LVGL display handle
132+
* @param area Display area to flush
133+
* @param px_map Pixel data
134+
*/
135+
void smartdisplay_dma_lvgl_flush(lv_display_t *display, const lv_area_t *area, uint8_t *px_map);
136+
137+
#ifdef __cplusplus
138+
}
139+
#endif
140+
141+
#endif // ESP32_SMARTDISPLAY_DMA_H

platformio.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
#default_envs = esp32-8048S050C
3838
#default_envs = esp32-8048S050N
3939
#default_envs = esp32-8048S050R
40-
#default_envs = esp32-8048S070C
40+
default_envs = esp32-8048S070C
4141
#default_envs = esp32-8048S070N
4242
#default_envs = esp32-8048S070R
4343
#default_envs = esp32-8048S550C

src/esp32_smartdisplay.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,18 @@ void smartdisplay_init()
199199
// Setup TFT display
200200
display = lvgl_lcd_init();
201201

202+
// Initialize DMA manager for optimized bitmap transfers
203+
esp_err_t dma_init_result = smartdisplay_dma_init((esp_lcd_panel_handle_t)display->user_data);
204+
if (dma_init_result != ESP_OK)
205+
{
206+
log_w("Failed to initialize DMA manager: %s", esp_err_to_name(dma_init_result));
207+
log_i("Continuing with standard bitmap transfers");
208+
}
209+
else
210+
{
211+
log_i("DMA manager initialized for optimized transfers");
212+
}
213+
202214
#ifndef DISPLAY_SOFTWARE_ROTATION
203215
// Register callback for hardware rotation
204216
lv_display_add_event_cb(display, lvgl_display_resolution_changed_callback, LV_EVENT_RESOLUTION_CHANGED, NULL);

0 commit comments

Comments
 (0)