16
16
void hal_lcd_spi_panel_construct (mp_obj_base_t * self ) {
17
17
lcd_spi_panel_obj_t * spi_panel_obj = (lcd_spi_panel_obj_t * )self ;
18
18
machine_hw_spi_obj_t * spi_obj = ((machine_hw_spi_obj_t * )spi_panel_obj -> spi_obj );
19
+ machine_hw_spi_obj_t old_self = * spi_obj ;
19
20
if (spi_obj -> state == MACHINE_HW_SPI_STATE_INIT ) {
20
21
spi_obj -> state = MACHINE_HW_SPI_STATE_DEINIT ;
21
- machine_hw_spi_deinit_internal (spi_obj );
22
+ machine_hw_spi_deinit_internal (& old_self );
22
23
}
24
+
23
25
spi_bus_config_t buscfg = {
24
26
.sclk_io_num = spi_obj -> sck ,
25
27
.mosi_io_num = spi_obj -> mosi ,
26
28
.miso_io_num = -1 ,
27
29
.quadwp_io_num = -1 ,
28
30
.quadhd_io_num = -1 ,
29
- .max_transfer_sz = spi_panel_obj -> width * spi_panel_obj -> height * 2 + 8 ,
31
+ // .max_transfer_sz = spi_panel_obj->width * spi_panel_obj->height * 2 + 8,
32
+ .max_transfer_sz = 0x4000 * 2 + 8 ,
30
33
};
31
34
esp_err_t ret = spi_bus_initialize (spi_obj -> host , & buscfg , SPI_DMA_CH_AUTO );
32
35
if (ret != 0 ) {
@@ -40,7 +43,8 @@ void hal_lcd_spi_panel_construct(mp_obj_base_t *self) {
40
43
.pclk_hz = spi_panel_obj -> pclk ,
41
44
.lcd_cmd_bits = spi_panel_obj -> cmd_bits ,
42
45
.lcd_param_bits = spi_panel_obj -> param_bits ,
43
- .spi_mode = 0 ,
46
+ .spi_mode = spi_obj -> phase | (spi_obj -> polarity << 1 ),
47
+ .flags .lsb_first = spi_obj -> firstbit == MICROPY_PY_MACHINE_SPI_LSB ? SPI_DEVICE_TXBIT_LSBFIRST | SPI_DEVICE_RXBIT_LSBFIRST : 0 ,
44
48
.trans_queue_depth = 10 ,
45
49
};
46
50
@@ -53,6 +57,7 @@ void hal_lcd_spi_panel_construct(mp_obj_base_t *self) {
53
57
if (ret != 0 ) {
54
58
mp_raise_msg_varg (& mp_type_OSError , "%d(esp_lcd_new_panel_io_spi)" , ret );
55
59
}
60
+ spi_panel_obj -> state = LCD_SPI_PANEL_STATE_INIT ;
56
61
}
57
62
58
63
@@ -104,7 +109,37 @@ inline void hal_lcd_spi_panel_tx_color(
104
109
105
110
inline void hal_lcd_spi_panel_deinit (mp_obj_base_t * self ) {
106
111
lcd_spi_panel_obj_t * spi_panel_obj = (lcd_spi_panel_obj_t * )self ;
107
- esp_lcd_panel_io_del (spi_panel_obj -> io_handle );
112
+ if (spi_panel_obj -> state == LCD_SPI_PANEL_STATE_INIT ) {
113
+ spi_panel_obj -> state = LCD_SPI_PANEL_STATE_DEINIT ;
114
+ esp_lcd_panel_io_del (spi_panel_obj -> io_handle );
115
+
116
+ // esp_lcd_panel_io_del has already executed the operation of spi_bus_remove_device,
117
+ // so only need to execute spi_bus_free here.
118
+ machine_hw_spi_obj_t * spi_obj = ((machine_hw_spi_obj_t * )spi_panel_obj -> spi_obj );
119
+ if (spi_obj -> state == MACHINE_HW_SPI_STATE_INIT ) {
120
+ spi_obj -> state = MACHINE_HW_SPI_STATE_DEINIT ;
121
+
122
+ switch (spi_bus_free (spi_obj -> host )) {
123
+ case ESP_ERR_INVALID_ARG :
124
+ mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("invalid configuration" ));
125
+ return ;
126
+
127
+ case ESP_ERR_INVALID_STATE :
128
+ mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("SPI bus already freed" ));
129
+ return ;
130
+ }
131
+
132
+ int8_t pins [3 ] = {spi_obj -> miso , spi_obj -> mosi , spi_obj -> sck };
133
+
134
+ for (int i = 0 ; i < 3 ; i ++ ) {
135
+ if (pins [i ] != -1 ) {
136
+ gpio_pad_select_gpio (pins [i ]);
137
+ gpio_matrix_out (pins [i ], SIG_GPIO_OUT_IDX , false, false);
138
+ gpio_set_direction (pins [i ], GPIO_MODE_INPUT );
139
+ }
140
+ }
141
+ }
142
+ }
108
143
}
109
144
110
145
0 commit comments