summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Walther <cwalther@gmx.ch>2020-10-24 17:23:17 +0200
committerChristian Walther <cwalther@gmx.ch>2020-10-26 22:44:38 +0100
commitf4f80e07ca3dc2f5a93484e5342540837a94a505 (patch)
tree024acc7c8b36101a0bf8a325fa53ae4cfb0bb40e
parent1117edae63df7b66f1575980bf54d6836f9a8aa8 (diff)
Fix lost board.SPI and board.I2C after being used by display.
Fixes #3581. Pins were marked as never_reset by common_hal_displayio_fourwire_construct() and common_hal_sharpdisplay_framebuffer_construct(), but these marks were never removed, so at the end of a session after displayio.release_displays(), {spi|i2c}_singleton would be set to NULL but the pins would not be reset. In the next session, board.SPI() and board.I2C() were unable to reconstruct the object because the pins were still in use. For symmetry with creation of the singleton, add deinitialization before setting it to NULL in reset_board_busses(). This makes the pins resettable, so that reset_port(), moved behind it, then resets them.
-rwxr-xr-xmain.c4
-rw-r--r--shared-module/board/__init__.c14
2 files changed, 12 insertions, 6 deletions
diff --git a/main.c b/main.c
index b43b3b8c8..80b163f60 100755
--- a/main.c
+++ b/main.c
@@ -234,10 +234,12 @@ void cleanup_after_vm(supervisor_allocation* heap) {
common_hal_canio_reset();
#endif
- reset_port();
+ // reset_board_busses() first because it may release pins from the never_reset state, so that
+ // reset_port() can reset them.
#if CIRCUITPY_BOARD
reset_board_busses();
#endif
+ reset_port();
reset_board();
reset_status_led();
}
diff --git a/shared-module/board/__init__.c b/shared-module/board/__init__.c
index 856103b7b..967b430d2 100644
--- a/shared-module/board/__init__.c
+++ b/shared-module/board/__init__.c
@@ -145,8 +145,11 @@ void reset_board_busses(void) {
}
}
#endif
- if (!display_using_i2c) {
- i2c_singleton = NULL;
+ if (i2c_singleton != NULL) {
+ if (!display_using_i2c) {
+ common_hal_busio_i2c_deinit(i2c_singleton);
+ i2c_singleton = NULL;
+ }
}
#endif
#if BOARD_SPI
@@ -169,9 +172,10 @@ void reset_board_busses(void) {
// make sure SPI lock is not held over a soft reset
if (spi_singleton != NULL) {
common_hal_busio_spi_unlock(spi_singleton);
- }
- if (!display_using_spi) {
- spi_singleton = NULL;
+ if (!display_using_spi) {
+ common_hal_busio_spi_deinit(spi_singleton);
+ spi_singleton = NULL;
+ }
}
#endif
#if BOARD_UART