Skip to content

Commit 25707d3

Browse files
committed
Track creation of board.I2C(), etc.
1 parent 3fb5023 commit 25707d3

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

shared-module/board/__init__.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ typedef struct {
5757

5858
static const board_i2c_pin_t i2c_pin[CIRCUITPY_BOARD_I2C] = CIRCUITPY_BOARD_I2C_PIN;
5959
static busio_i2c_obj_t i2c_obj[CIRCUITPY_BOARD_I2C];
60+
static bool i2c_obj_created[CIRCUITPY_BOARD_I2C];
6061

6162
bool common_hal_board_is_i2c(mp_obj_t obj) {
6263
for (uint8_t instance = 0; instance < CIRCUITPY_BOARD_I2C; instance++) {
@@ -68,7 +69,7 @@ bool common_hal_board_is_i2c(mp_obj_t obj) {
6869
}
6970

7071
mp_obj_t common_hal_board_get_i2c(const mp_int_t instance) {
71-
return &i2c_obj[instance];
72+
return i2c_obj_created[instance] ? &i2c_obj[instance] : NULL;
7273
}
7374

7475
mp_obj_t common_hal_board_create_i2c(const mp_int_t instance) {
@@ -85,6 +86,7 @@ mp_obj_t common_hal_board_create_i2c(const mp_int_t instance) {
8586

8687
common_hal_busio_i2c_construct(self, i2c_pin[instance].scl, i2c_pin[instance].sda, 100000, 255);
8788

89+
i2c_obj_created[instance] = true;
8890
return &i2c_obj[instance];
8991
}
9092
#endif
@@ -101,6 +103,7 @@ typedef struct {
101103

102104
static const board_spi_pin_t spi_pin[CIRCUITPY_BOARD_SPI] = CIRCUITPY_BOARD_SPI_PIN;
103105
static busio_spi_obj_t spi_obj[CIRCUITPY_BOARD_SPI];
106+
static bool spi_obj_created[CIRCUITPY_BOARD_SPI];
104107

105108
bool common_hal_board_is_spi(mp_obj_t obj) {
106109
for (uint8_t instance = 0; instance < CIRCUITPY_BOARD_SPI; instance++) {
@@ -112,7 +115,7 @@ bool common_hal_board_is_spi(mp_obj_t obj) {
112115
}
113116

114117
mp_obj_t common_hal_board_get_spi(const mp_int_t instance) {
115-
return &spi_obj[instance];
118+
return spi_obj_created[instance] ? &spi_obj[instance] : NULL;
116119
}
117120

118121
mp_obj_t common_hal_board_create_spi(const mp_int_t instance) {
@@ -130,6 +133,7 @@ mp_obj_t common_hal_board_create_spi(const mp_int_t instance) {
130133

131134
common_hal_busio_spi_construct(self, spi_pin[instance].clock, spi_pin[instance].mosi, spi_pin[instance].miso);
132135

136+
spi_obj_created[instance] = true;
133137
return &spi_obj[instance];
134138
}
135139
#endif
@@ -143,6 +147,7 @@ typedef struct {
143147

144148
static const board_uart_pin_t uart_pin[CIRCUITPY_BOARD_UART] = CIRCUITPY_BOARD_UART_PIN;
145149
static busio_uart_obj_t uart_obj[CIRCUITPY_BOARD_UART];
150+
static bool uart_obj_created[CIRCUITPY_BOARD_UART];
146151

147152
bool common_hal_board_is_uart(mp_obj_t obj) {
148153
for (uint8_t instance = 0; instance < CIRCUITPY_BOARD_UART; instance++) {
@@ -154,7 +159,7 @@ bool common_hal_board_is_uart(mp_obj_t obj) {
154159
}
155160

156161
mp_obj_t common_hal_board_get_uart(const mp_int_t instance) {
157-
return &uart_obj[instance];
162+
return uart_obj_created[instance] ? &uart_obj[instance] : NULL;
158163
}
159164

160165
mp_obj_t common_hal_board_create_uart(const mp_int_t instance) {
@@ -174,6 +179,7 @@ mp_obj_t common_hal_board_create_uart(const mp_int_t instance) {
174179
common_hal_busio_uart_construct(self, uart_pin[instance].tx, uart_pin[instance].rx,
175180
NULL, NULL, NULL, false, 9600, 8, BUSIO_UART_PARITY_NONE, 1, 1.0f, 64, NULL, false);
176181

182+
uart_obj_created[instance] = true;
177183
return &uart_obj[instance];
178184
}
179185
#endif
@@ -190,11 +196,12 @@ void reset_board_buses(void) {
190196
}
191197
}
192198
#endif
193-
if (!common_hal_busio_i2c_deinited(&i2c_obj[instance])) {
199+
if (i2c_obj_created[instance]) {
194200
// make sure I2C lock is not held over a soft reset
195201
common_hal_busio_i2c_unlock(&i2c_obj[instance]);
196202
if (!display_using_i2c) {
197203
common_hal_busio_i2c_deinit(&i2c_obj[instance]);
204+
i2c_obj_created[instance] = false;
198205
}
199206
}
200207
}
@@ -217,18 +224,22 @@ void reset_board_buses(void) {
217224
#endif
218225
}
219226
#endif
220-
if (!common_hal_busio_spi_deinited(&spi_obj[instance])) {
227+
if (spi_obj_created[instance]) {
221228
// make sure SPI lock is not held over a soft reset
222229
common_hal_busio_spi_unlock(&spi_obj[instance]);
223230
if (!display_using_spi) {
224231
common_hal_busio_spi_deinit(&spi_obj[instance]);
232+
spi_obj_created[instance] = false;
225233
}
226234
}
227235
}
228236
#endif
229237
#if CIRCUITPY_BOARD_UART
230238
for (uint8_t instance = 0; instance < CIRCUITPY_BOARD_UART; instance++) {
231-
common_hal_busio_uart_deinit(&uart_obj[instance]);
239+
if (uart_obj_created[instance]) {
240+
common_hal_busio_uart_deinit(&uart_obj[instance]);
241+
uart_obj_created[instance] = false;
242+
}
232243
}
233244
#endif
234245
}

0 commit comments

Comments
 (0)