summaryrefslogtreecommitdiff
path: root/shared-module/board
diff options
context:
space:
mode:
authorScott Shawcroft <scott@tannewt.org>2019-08-14 15:53:58 -0700
committerScott Shawcroft <scott@tannewt.org>2019-08-14 15:53:58 -0700
commitb3de7efc07365bd4cb3a8c89196dfbc29bcc9c04 (patch)
tree2c2f90333b56dadd67fa8b8bc8060a81150c6c04 /shared-module/board
parent583392a5c694c082f628b07d4a435a93903dcf2b (diff)
Fix I2CDisplay lifecycle and splash lifecycle.
Fixes https://github.com/adafruit/Adafruit_CircuitPython_DisplayIO_SSD1306/issues/2
Diffstat (limited to 'shared-module/board')
-rw-r--r--shared-module/board/__init__.c29
1 files changed, 24 insertions, 5 deletions
diff --git a/shared-module/board/__init__.c b/shared-module/board/__init__.c
index 5a1dead78..dd07d7190 100644
--- a/shared-module/board/__init__.c
+++ b/shared-module/board/__init__.c
@@ -40,17 +40,25 @@
#endif
#if BOARD_I2C
+// Statically allocate the I2C object so it can live past the end of the heap and into the next VM.
+// That way it can be used by built-in I2CDisplay displays and be accessible through board.I2C().
+STATIC busio_i2c_obj_t i2c_obj;
+STATIC mp_obj_t i2c_singleton = NULL;
+
mp_obj_t common_hal_board_get_i2c(void) {
- return MP_STATE_VM(shared_i2c_bus);
+ return i2c_singleton;
}
mp_obj_t common_hal_board_create_i2c(void) {
- busio_i2c_obj_t *self = m_new_ll_obj(busio_i2c_obj_t);
+ if (i2c_singleton != NULL) {
+ return i2c_singleton;
+ }
+ busio_i2c_obj_t *self = &i2c_obj;
self->base.type = &busio_i2c_type;
common_hal_busio_i2c_construct(self, DEFAULT_I2C_BUS_SCL, DEFAULT_I2C_BUS_SDA, 400000, 0);
- MP_STATE_VM(shared_i2c_bus) = MP_OBJ_FROM_PTR(self);
- return MP_STATE_VM(shared_i2c_bus);
+ i2c_singleton = (mp_obj_t)self;
+ return i2c_singleton;
}
#endif
@@ -101,7 +109,18 @@ mp_obj_t common_hal_board_create_uart(void) {
void reset_board_busses(void) {
#if BOARD_I2C
- MP_STATE_VM(shared_i2c_bus) = NULL;
+ bool display_using_i2c = false;
+ #if CIRCUITPY_DISPLAYIO
+ for (uint8_t i = 0; i < CIRCUITPY_DISPLAY_LIMIT; i++) {
+ if (displays[i].i2cdisplay_bus.bus == i2c_singleton) {
+ display_using_i2c = true;
+ break;
+ }
+ }
+ #endif
+ if (!display_using_i2c) {
+ i2c_singleton = NULL;
+ }
#endif
#if BOARD_SPI
bool display_using_spi = false;