1
1
#include "esp32.h"
2
2
3
+ #include "spi_panel.h"
4
+ #include "i80_panel.h"
5
+
3
6
#include "esp_lcd_panel_io.h"
4
7
#include "esp_lcd_panel_vendor.h"
5
8
#include "esp_lcd_panel_ops.h"
10
13
11
14
#define DEBUG_printf (...) // mp_printf(&mp_plat_print, __VA_ARGS__);
12
15
13
- void hal_lcd_spi_panel_construct (lcd_spi_panel_obj_t * self ) {
14
- machine_hw_spi_obj_t * spi_obj = ((machine_hw_spi_obj_t * )self -> spi_obj );
15
- // if (spi_obj == NULL) {
16
- // mp_raise_msg_varg(&mp_type_OSError, "null");
17
- // }
18
- // machine_hw_spi_deinit_internal(spi_obj);
19
- // spi_bus_config_t buscfg = {
20
- // .sclk_io_num = spi_obj->sck,
21
- // .mosi_io_num = spi_obj->mosi,
22
- // .miso_io_num = -1,
23
- // .quadwp_io_num = -1,
24
- // .quadhd_io_num = -1,
25
- // .max_transfer_sz = self->width * self->height * 2 + 8
26
- // };
27
- // esp_err_t ret = spi_bus_initialize(spi_obj->host, &buscfg, SPI_DMA_CH_AUTO);
28
- // if (ret != 0) {
29
- // mp_raise_msg_varg(&mp_type_OSError, "%d(spi_bus_initialize)", ret);
30
- // }
16
+ void hal_lcd_spi_panel_construct (mp_obj_base_t * self ) {
17
+ lcd_spi_panel_obj_t * spi_panel_obj = (lcd_spi_panel_obj_t * )self ;
18
+ machine_hw_spi_obj_t * spi_obj = ((machine_hw_spi_obj_t * )spi_panel_obj -> spi_obj );
19
+ if (spi_obj -> state == MACHINE_HW_SPI_STATE_INIT ) {
20
+ spi_obj -> state = MACHINE_HW_SPI_STATE_DEINIT ;
21
+ machine_hw_spi_deinit_internal (spi_obj );
22
+ }
23
+ spi_bus_config_t buscfg = {
24
+ .sclk_io_num = spi_obj -> sck ,
25
+ .mosi_io_num = spi_obj -> mosi ,
26
+ .miso_io_num = -1 ,
27
+ .quadwp_io_num = -1 ,
28
+ .quadhd_io_num = -1 ,
29
+ #if CONFIG_ESP32_SPIRAM_SUPPORT
30
+ .max_transfer_sz = spi_panel_obj -> width * spi_panel_obj -> height * 2 + 8 ,
31
+ #else
32
+ .max_transfer_sz = spi_panel_obj -> width * 2 + 8 ,
33
+ #endif
34
+ };
35
+ esp_err_t ret = spi_bus_initialize (spi_obj -> host , & buscfg , SPI_DMA_CH_AUTO );
36
+ if (ret != 0 ) {
37
+ mp_raise_msg_varg (& mp_type_OSError , "%d(spi_bus_initialize)" , ret );
38
+ }
39
+ spi_obj -> state = MACHINE_HW_SPI_STATE_INIT ;
31
40
32
41
esp_lcd_panel_io_spi_config_t io_config = {
33
- .dc_gpio_num = mp_hal_get_pin_obj (self -> dc ),
34
- .cs_gpio_num = mp_hal_get_pin_obj (self -> cs ),
35
- .pclk_hz = self -> pclk ,
36
- .lcd_cmd_bits = self -> cmd_bits ,
37
- .lcd_param_bits = self -> param_bits ,
42
+ .dc_gpio_num = mp_hal_get_pin_obj (spi_panel_obj -> dc ),
43
+ .cs_gpio_num = mp_hal_get_pin_obj (spi_panel_obj -> cs ),
44
+ .pclk_hz = spi_panel_obj -> pclk ,
45
+ .lcd_cmd_bits = spi_panel_obj -> cmd_bits ,
46
+ .lcd_param_bits = spi_panel_obj -> param_bits ,
38
47
.spi_mode = 0 ,
39
- .trans_queue_depth = 4 ,
48
+ .trans_queue_depth = 10 ,
40
49
};
41
50
42
51
// Attach the LCD to the SPI bus
43
- esp_err_t ret = esp_lcd_new_panel_io_spi ((esp_lcd_spi_bus_handle_t )spi_obj -> host , & io_config , & self -> io_handle );
52
+ ret = esp_lcd_new_panel_io_spi (
53
+ (esp_lcd_spi_bus_handle_t )spi_obj -> host ,
54
+ & io_config ,
55
+ & spi_panel_obj -> io_handle
56
+ );
44
57
if (ret != 0 ) {
45
58
mp_raise_msg_varg (& mp_type_OSError , "%d(esp_lcd_new_panel_io_spi)" , ret );
46
59
}
47
60
}
48
61
49
62
50
- inline void hal_lcd_spi_panel_tx_param (lcd_spi_panel_obj_t * self , int lcd_cmd , const void * param , size_t param_size ) {
63
+ inline void hal_lcd_spi_panel_tx_param (
64
+ mp_obj_base_t * self ,
65
+ int lcd_cmd ,
66
+ const void * param ,
67
+ size_t param_size
68
+ ) {
51
69
DEBUG_printf ("tx_param cmd: %x, param_size: %u\n" , lcd_cmd , param_size );
52
- esp_lcd_panel_io_tx_param (self -> io_handle , lcd_cmd , param , param_size );
70
+
71
+ lcd_spi_panel_obj_t * spi_panel_obj = (lcd_spi_panel_obj_t * )self ;
72
+ esp_lcd_panel_io_tx_param (spi_panel_obj -> io_handle , lcd_cmd , param , param_size );
53
73
}
54
74
55
75
56
- inline void hal_lcd_spi_panel_tx_color (lcd_spi_panel_obj_t * self , int lcd_cmd , const void * color , size_t color_size ) {
76
+ inline void hal_lcd_spi_panel_tx_color (
77
+ mp_obj_base_t * self ,
78
+ int lcd_cmd ,
79
+ const void * color ,
80
+ size_t color_size
81
+ ) {
57
82
DEBUG_printf ("tx_color cmd: %x, color_size: %u\n" , lcd_cmd , color_size );
58
- esp_lcd_panel_io_tx_color (self -> io_handle , lcd_cmd , color , color_size );
83
+ lcd_spi_panel_obj_t * spi_panel_obj = (lcd_spi_panel_obj_t * )self ;
84
+
85
+ #if CONFIG_ESP32_SPIRAM_SUPPORT
86
+ esp_lcd_panel_io_tx_color (spi_panel_obj -> io_handle , lcd_cmd , color , color_size );
87
+ #else
88
+ size_t i = 0 ;
89
+ esp_lcd_panel_io_tx_param (spi_panel_obj -> io_handle , lcd_cmd , NULL , 0 );
90
+
91
+ for (i = 0 ; i < (color_size / (spi_panel_obj -> width * 2 )); i ++ ) {
92
+ esp_lcd_panel_io_tx_color (
93
+ spi_panel_obj -> io_handle ,
94
+ -1 ,
95
+ (const void * )& ((const uint8_t * )color )[i * spi_panel_obj -> width * 2 ],
96
+ spi_panel_obj -> width * 2
97
+ );
98
+ }
99
+ esp_lcd_panel_io_tx_color (
100
+ spi_panel_obj -> io_handle ,
101
+ -1 ,
102
+ (const void * )& ((const uint8_t * )color )[i * spi_panel_obj -> width * 2 ],
103
+ color_size - (i * spi_panel_obj -> width * 2 )
104
+ );
105
+ #endif
59
106
}
60
107
61
108
62
- inline void hal_lcd_spi_panel_deinit (lcd_spi_panel_obj_t * self ) {
63
- esp_lcd_panel_io_del (self -> io_handle );
109
+ inline void hal_lcd_spi_panel_deinit (mp_obj_base_t * self ) {
110
+ lcd_spi_panel_obj_t * spi_panel_obj = (lcd_spi_panel_obj_t * )self ;
111
+ esp_lcd_panel_io_del (spi_panel_obj -> io_handle );
64
112
}
65
113
66
114
67
- void hal_lcd_i80_construct (lcd_i80_obj_t * self ) {
115
+ void hal_lcd_i80_construct (mp_obj_base_t * self ) {
116
+ lcd_i80_obj_t * i80_obj = (lcd_i80_obj_t * )self ;
68
117
esp_lcd_i80_bus_config_t bus_config = {
69
- .dc_gpio_num = mp_hal_get_pin_obj (self -> dc ),
70
- .wr_gpio_num = mp_hal_get_pin_obj (self -> wr ),
118
+ .dc_gpio_num = mp_hal_get_pin_obj (i80_obj -> dc ),
119
+ .wr_gpio_num = mp_hal_get_pin_obj (i80_obj -> wr ),
71
120
.clk_src = LCD_CLK_SRC_PLL160M ,
72
121
.data_gpio_nums = {
73
- mp_hal_get_pin_obj (self -> databus [0 ]),
74
- mp_hal_get_pin_obj (self -> databus [1 ]),
75
- mp_hal_get_pin_obj (self -> databus [2 ]),
76
- mp_hal_get_pin_obj (self -> databus [3 ]),
77
- mp_hal_get_pin_obj (self -> databus [4 ]),
78
- mp_hal_get_pin_obj (self -> databus [5 ]),
79
- mp_hal_get_pin_obj (self -> databus [6 ]),
80
- mp_hal_get_pin_obj (self -> databus [7 ]),
122
+ mp_hal_get_pin_obj (i80_obj -> databus [0 ]),
123
+ mp_hal_get_pin_obj (i80_obj -> databus [1 ]),
124
+ mp_hal_get_pin_obj (i80_obj -> databus [2 ]),
125
+ mp_hal_get_pin_obj (i80_obj -> databus [3 ]),
126
+ mp_hal_get_pin_obj (i80_obj -> databus [4 ]),
127
+ mp_hal_get_pin_obj (i80_obj -> databus [5 ]),
128
+ mp_hal_get_pin_obj (i80_obj -> databus [6 ]),
129
+ mp_hal_get_pin_obj (i80_obj -> databus [7 ]),
81
130
},
82
- .bus_width = self -> bus_width ,
83
- .max_transfer_bytes = self -> width * self -> height * sizeof (uint16_t )
131
+ .bus_width = i80_obj -> bus_width ,
132
+ .max_transfer_bytes = i80_obj -> width * i80_obj -> height * sizeof (uint16_t )
84
133
};
85
- esp_err_t ret = esp_lcd_new_i80_bus (& bus_config , & self -> i80_bus );
134
+ esp_err_t ret = esp_lcd_new_i80_bus (& bus_config , & i80_obj -> i80_bus );
86
135
if (ret != 0 ) {
87
136
mp_raise_msg_varg (& mp_type_OSError , "%d(esp_lcd_new_i80_bus)" , ret );
88
137
}
89
138
esp_lcd_panel_io_i80_config_t io_config = {
90
- .pclk_hz = self -> pclk ,
139
+ .pclk_hz = i80_obj -> pclk ,
91
140
.trans_queue_depth = 10 ,
92
141
.dc_levels = {
93
142
.dc_idle_level = 0 ,
@@ -96,38 +145,53 @@ void hal_lcd_i80_construct(lcd_i80_obj_t *self) {
96
145
.dc_data_level = 1 ,
97
146
},
98
147
.flags = {
99
- .swap_color_bytes = self -> swap_color_bytes ,
148
+ .swap_color_bytes = i80_obj -> swap_color_bytes ,
100
149
},
101
- .lcd_cmd_bits = self -> cmd_bits ,
102
- .lcd_param_bits = self -> param_bits ,
150
+ .lcd_cmd_bits = i80_obj -> cmd_bits ,
151
+ .lcd_param_bits = i80_obj -> param_bits ,
103
152
};
104
- if (self -> cs != MP_OBJ_NULL ) {
105
- io_config .cs_gpio_num = mp_hal_get_pin_obj (self -> cs );
153
+ if (i80_obj -> cs != MP_OBJ_NULL ) {
154
+ io_config .cs_gpio_num = mp_hal_get_pin_obj (i80_obj -> cs );
106
155
} else {
107
156
io_config .cs_gpio_num = -1 ;
108
157
}
109
- ret = esp_lcd_new_panel_io_i80 (self -> i80_bus , & io_config , & self -> io_handle );
158
+ ret = esp_lcd_new_panel_io_i80 (i80_obj -> i80_bus , & io_config , & i80_obj -> io_handle );
110
159
if (ret != 0 ) {
111
160
mp_raise_msg_varg (& mp_type_OSError , "%d(esp_lcd_new_panel_io_i80)" , ret );
112
161
}
113
162
}
114
163
115
164
116
- inline void hal_lcd_i80_tx_param (lcd_i80_obj_t * self , int lcd_cmd , const void * param , size_t param_size ) {
165
+ inline void hal_lcd_i80_tx_param (
166
+ mp_obj_base_t * self ,
167
+ int lcd_cmd ,
168
+ const void * param ,
169
+ size_t param_size
170
+ ) {
117
171
DEBUG_printf ("tx_param cmd: %x, param_size: %u\n" , lcd_cmd , param_size );
118
- esp_lcd_panel_io_tx_param (self -> io_handle , lcd_cmd , param , param_size );
172
+
173
+ lcd_i80_obj_t * i80_obj = (lcd_i80_obj_t * )self ;
174
+ esp_lcd_panel_io_tx_param (i80_obj -> io_handle , lcd_cmd , param , param_size );
119
175
}
120
176
121
177
122
- inline void hal_lcd_i80_tx_color (lcd_i80_obj_t * self , int lcd_cmd , const void * color , size_t color_size ) {
178
+ inline void hal_lcd_i80_tx_color (
179
+ mp_obj_base_t * self ,
180
+ int lcd_cmd ,
181
+ const void * color ,
182
+ size_t color_size
183
+ ) {
123
184
DEBUG_printf ("tx_color cmd: %x, color_size: %u\n" , lcd_cmd , color_size );
124
- esp_lcd_panel_io_tx_color (self -> io_handle , lcd_cmd , color , color_size );
185
+
186
+ lcd_i80_obj_t * i80_obj = (lcd_i80_obj_t * )self ;
187
+ esp_lcd_panel_io_tx_color (i80_obj -> io_handle , lcd_cmd , color , color_size );
125
188
}
126
189
127
190
128
- inline void hal_lcd_i80_deinit (lcd_i80_obj_t * self ) {
129
- esp_lcd_panel_io_del (self -> io_handle );
130
- esp_lcd_del_i80_bus (self -> i80_bus );
191
+ inline void hal_lcd_i80_deinit (mp_obj_base_t * self ) {
192
+ lcd_i80_obj_t * i80_obj = (lcd_i80_obj_t * )self ;
193
+ esp_lcd_panel_io_del (i80_obj -> io_handle );
194
+ esp_lcd_del_i80_bus (i80_obj -> i80_bus );
131
195
}
132
196
133
197
@@ -211,12 +275,30 @@ inline void hal_lcd_rgb_del(lcd_rgb_obj_t *self) {
211
275
}
212
276
213
277
214
- inline void hal_lcd_rgb_bitmap (lcd_rgb_obj_t * self , int x_start , int y_start , int x_end , int y_end , const void * color_data ) {
215
- esp_lcd_panel_draw_bitmap (self -> panel_handle , x_start , y_start , x_end , y_end , color_data );
278
+ inline void hal_lcd_rgb_bitmap (
279
+ lcd_rgb_obj_t * self ,
280
+ int x_start ,
281
+ int y_start ,
282
+ int x_end ,
283
+ int y_end ,
284
+ const void * color_data
285
+ ) {
286
+ esp_lcd_panel_draw_bitmap (
287
+ self -> panel_handle ,
288
+ x_start ,
289
+ y_start ,
290
+ x_end ,
291
+ y_end ,
292
+ color_data
293
+ );
216
294
}
217
295
218
296
219
- inline void hal_lcd_rgb_mirror (lcd_rgb_obj_t * self , bool mirror_x , bool mirror_y ) {
297
+ inline void hal_lcd_rgb_mirror (
298
+ lcd_rgb_obj_t * self ,
299
+ bool mirror_x ,
300
+ bool mirror_y
301
+ ) {
220
302
esp_lcd_panel_mirror (self -> panel_handle , mirror_x , mirror_y );
221
303
}
222
304
@@ -231,7 +313,10 @@ inline void hal_lcd_rgb_set_gap(lcd_rgb_obj_t *self, int x_gap, int y_gap) {
231
313
}
232
314
233
315
234
- inline void hal_lcd_rgb_invert_color (lcd_rgb_obj_t * self , bool invert_color_data ) {
316
+ inline void hal_lcd_rgb_invert_color (
317
+ lcd_rgb_obj_t * self ,
318
+ bool invert_color_data
319
+ ) {
235
320
esp_lcd_panel_invert_color (self -> panel_handle , invert_color_data );
236
321
}
237
322
0 commit comments