Skip to content

Commit 29d2264

Browse files
committed
fix: unable to deinit correctly
Signed-off-by: lbuque <1102390310@qq.com>
1 parent 953458c commit 29d2264

File tree

3 files changed

+47
-6
lines changed

3 files changed

+47
-6
lines changed

lcd/bus/spi/spi_panel.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ STATIC void lcd_spi_panel_print(
2525
lcd_spi_panel_obj_t *self = MP_OBJ_TO_PTR(self_in);
2626
mp_printf(
2727
print,
28-
"<SPI Panel SPI=%p, dc=%p, write=%pcs=%p, width=%u, height=%u, cmd_bits=%u, param_bits=%u>",
28+
"<SPI Panel SPI=%p, dc=%p, write=%p, cs=%p, width=%u, height=%u, cmd_bits=%u, param_bits=%u>",
2929
self->spi_obj,
3030
self->dc,
3131
self->wr,
@@ -132,7 +132,7 @@ STATIC mp_obj_t lcd_spi_panel_deinit(mp_obj_t self_in) {
132132
mp_obj_base_t *self = (mp_obj_base_t *)MP_OBJ_TO_PTR(self_in);
133133

134134
hal_lcd_spi_panel_deinit(self);
135-
// m_del_obj(lcd_spi_panel_obj_t, self);
135+
136136
return mp_const_none;
137137
}
138138
STATIC MP_DEFINE_CONST_FUN_OBJ_1(lcd_spi_panel_deinit_obj, lcd_spi_panel_deinit);

lcd/bus/spi/spi_panel.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ typedef struct lcd_spi_panel_obj_t {
2727
#else
2828
void (*write_color)(mp_hal_pin_obj_t *databus, mp_hal_pin_obj_t wr, const uint8_t *buf, int len);
2929
#endif
30+
31+
enum {
32+
LCD_SPI_PANEL_STATE_NONE,
33+
LCD_SPI_PANEL_STATE_INIT,
34+
LCD_SPI_PANEL_STATE_DEINIT
35+
} state;
3036
} lcd_spi_panel_obj_t;
3137

3238
extern const mp_obj_type_t lcd_spi_panel_type;

lcd/hal/esp32/esp32.c

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,20 @@
1616
void 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

105110
inline 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

Comments
 (0)