1616void hal_lcd_spi_panel_construct (mp_obj_base_t * self ) {
1717 lcd_spi_panel_obj_t * spi_panel_obj = (lcd_spi_panel_obj_t * )self ;
1818 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 ;
1920 if (spi_obj -> state == MACHINE_HW_SPI_STATE_INIT ) {
2021 spi_obj -> state = MACHINE_HW_SPI_STATE_DEINIT ;
21- machine_hw_spi_deinit_internal (spi_obj );
22+ machine_hw_spi_deinit_internal (& old_self );
2223 }
24+
2325 spi_bus_config_t buscfg = {
2426 .sclk_io_num = spi_obj -> sck ,
2527 .mosi_io_num = spi_obj -> mosi ,
2628 .miso_io_num = -1 ,
2729 .quadwp_io_num = -1 ,
2830 .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 ,
3033 };
3134 esp_err_t ret = spi_bus_initialize (spi_obj -> host , & buscfg , SPI_DMA_CH_AUTO );
3235 if (ret != 0 ) {
@@ -40,7 +43,8 @@ void hal_lcd_spi_panel_construct(mp_obj_base_t *self) {
4043 .pclk_hz = spi_panel_obj -> pclk ,
4144 .lcd_cmd_bits = spi_panel_obj -> cmd_bits ,
4245 .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 ,
4448 .trans_queue_depth = 10 ,
4549 };
4650
@@ -53,6 +57,7 @@ void hal_lcd_spi_panel_construct(mp_obj_base_t *self) {
5357 if (ret != 0 ) {
5458 mp_raise_msg_varg (& mp_type_OSError , "%d(esp_lcd_new_panel_io_spi)" , ret );
5559 }
60+ spi_panel_obj -> state = LCD_SPI_PANEL_STATE_INIT ;
5661}
5762
5863
@@ -104,7 +109,37 @@ inline void hal_lcd_spi_panel_tx_color(
104109
105110inline void hal_lcd_spi_panel_deinit (mp_obj_base_t * self ) {
106111 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+ }
108143}
109144
110145
0 commit comments