Skip to content

Commit c478c10

Browse files
dhalberttannewt
authored andcommitted
Do not allow a *io object to be used after deinit().
Fixes adafruit#278, adafruit#277, adafruit#276, adafruit#275.
1 parent c2bb9e2 commit c478c10

67 files changed

Lines changed: 445 additions & 59 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

atmel-samd/Makefile

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,13 @@ ifeq ($(DEBUG), 1)
135135
# -DMICROPY_DEBUG_MODULES may also be added to an -flto build, if you wish.
136136
CFLAGS += -Os -ggdb -DNDEBUG -DENABLE_MICRO_TRACE_BUFFER -DMICROPY_DEBUG_MODULES
137137
else
138-
# -finline-limit can shrink the image size. -finline-limit=80 or so is similar to not having it on.
138+
# GCC_INLINE_LIMIT specifies -finline-limit, which can shrink the image size.
139+
# -finline-limit=80 or so is similar to not having it on.
139140
# There is no simple default value, though.
140-
CFLAGS += -Os -DNDEBUG -flto -finline-limit=39
141+
ifeq ($(FLASH_IMPL),internal_flash.c)
142+
GCC_INLINE_LIMIT = -finline-limit=19
143+
endif
144+
CFLAGS += -Os -DNDEBUG -flto $(GCC_INLINE_LIMIT)
141145
endif
142146

143147
ifneq ($(FROZEN_DIR),)
@@ -272,7 +276,8 @@ SRC_BINDINGS_ENUMS = \
272276
digitalio/Direction.c \
273277
digitalio/DriveMode.c \
274278
digitalio/Pull.c \
275-
help.c
279+
help.c \
280+
util.c
276281

277282
SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \
278283
$(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \

atmel-samd/boards/feather_m0_basic/mpconfigboard.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ USB_PID = 0x8015
55
FLASH_IMPL = internal_flash.c
66

77
CHIP_VARIANT = SAMD21G18A
8+

atmel-samd/common-hal/analogio/AnalogIn.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,14 @@ void common_hal_analogio_analogin_construct(analogio_analogin_obj_t* self,
7777
active_channel_count++;
7878
}
7979

80+
bool common_hal_analogio_analogin_deinited(analogio_analogin_obj_t *self) {
81+
return self->pin == mp_const_none;
82+
}
83+
8084
void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t *self) {
85+
if (common_hal_analogio_analogin_deinited(self)) {
86+
return;
87+
}
8188
active_channel_count--;
8289
if (active_channel_count == 0) {
8390
adc_reset(adc_instance);
@@ -89,6 +96,7 @@ void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t *self) {
8996
config_adc = NULL;
9097
}
9198
reset_pin(self->pin->pin);
99+
self->pin = mp_const_none;
92100
}
93101

94102
void analogin_reset() {

atmel-samd/common-hal/analogio/AnalogOut.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,18 @@ void common_hal_analogio_analogout_construct(analogio_analogout_obj_t* self,
5959
dac_enable(&self->dac_instance);
6060
}
6161

62+
bool common_hal_analogio_analogout_deinited(analogio_analogout_obj_t *self) {
63+
return self->deinited;
64+
}
65+
6266
void common_hal_analogio_analogout_deinit(analogio_analogout_obj_t *self) {
67+
if (common_hal_analogio_analogout_deinited(self)) {
68+
return;
69+
}
6370
dac_disable(&self->dac_instance);
6471
dac_chan_disable(&self->dac_instance, DAC_CHANNEL_0);
6572
reset_pin(PIN_PA02);
73+
self->deinited = true;
6674
}
6775

6876
void common_hal_analogio_analogout_set_value(analogio_analogout_obj_t *self,

atmel-samd/common-hal/analogio/AnalogOut.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
typedef struct {
3737
mp_obj_base_t base;
3838
struct dac_module dac_instance;
39+
bool deinited;
3940
} analogio_analogout_obj_t;
4041

4142
#endif // MICROPY_INCLUDED_ATMEL_SAMD_COMMON_HAL_ANALOGIO_ANALOGOUT_H

atmel-samd/common-hal/audiobusio/PDMIn.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,20 @@ void common_hal_audiobusio_pdmin_construct(audiobusio_pdmin_obj_t* self,
145145
self->bit_depth = bit_depth;
146146
}
147147

148+
bool common_hal_audiobusio_pdmin_deinited(audiobusio_pdmin_obj_t* self) {
149+
return self->clock_pin == mp_const_none;
150+
}
151+
148152
void common_hal_audiobusio_pdmin_deinit(audiobusio_pdmin_obj_t* self) {
153+
if (common_hal_audiobusio_pdmin_deinited(self)) {
154+
return;
155+
}
149156
i2s_disable(&self->i2s_instance);
150157
i2s_reset(&self->i2s_instance);
151158
reset_pin(self->clock_pin->pin);
152159
reset_pin(self->data_pin->pin);
160+
self->clock_pin = mp_const_none;
161+
self->data_pin = mp_const_none;
153162
}
154163

155164
uint8_t common_hal_audiobusio_pdmin_get_bit_depth(audiobusio_pdmin_obj_t* self) {

atmel-samd/common-hal/audioio/AudioOut.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,14 @@ void common_hal_audioio_audioout_construct_from_file(audioio_audioout_obj_t* sel
381381
}
382382
}
383383

384+
bool common_hal_audioio_audioout_deinited(audioio_audioout_obj_t* self) {
385+
return self->pin == mp_const_none;
386+
}
387+
384388
void common_hal_audioio_audioout_deinit(audioio_audioout_obj_t* self) {
389+
if (common_hal_audioio_audioout_deinited(self)) {
390+
return;
391+
}
385392
refcount--;
386393
if (refcount == 0) {
387394
if (MP_STATE_VM(audioout_sample_timer) != NULL) {
@@ -407,6 +414,8 @@ void common_hal_audioio_audioout_deinit(audioio_audioout_obj_t* self) {
407414
}
408415
reset_pin(self->pin->pin);
409416
}
417+
418+
self->pin = mp_const_none;
410419
}
411420

412421
static void set_timer_frequency(uint32_t frequency) {

atmel-samd/common-hal/busio/I2C.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,19 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
9595
i2c_master_enable(&self->i2c_master_instance);
9696
}
9797

98+
bool common_hal_busio_i2c_deinited(busio_i2c_obj_t *self) {
99+
return self->sda_pin == NO_PIN;
100+
}
101+
98102
void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) {
103+
if (common_hal_busio_i2c_deinited(self)) {
104+
return;
105+
}
99106
i2c_master_reset(&self->i2c_master_instance);
100107
reset_pin(self->sda_pin);
101108
reset_pin(self->scl_pin);
109+
self->sda_pin = NO_PIN;
110+
self->scl_pin = NO_PIN;
102111
}
103112

104113
bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) {

atmel-samd/common-hal/busio/SPI.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,11 +159,19 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
159159
spi_enable(&self->spi_master_instance);
160160
}
161161

162+
bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) {
163+
return self->clock_pin == NO_PIN;
164+
}
165+
162166
void common_hal_busio_spi_deinit(busio_spi_obj_t *self) {
167+
if (common_hal_busio_spi_deinited(self)) {
168+
return;
169+
}
163170
spi_disable(&self->spi_master_instance);
164171
reset_pin(self->clock_pin);
165172
reset_pin(self->MOSI_pin);
166173
reset_pin(self->MISO_pin);
174+
self->clock_pin = NO_PIN;
167175
}
168176

169177
bool common_hal_busio_spi_configure(busio_spi_obj_t *self,

atmel-samd/common-hal/busio/UART.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,14 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self,
243243
self->uart_instance.hw->USART.INTENSET.bit.RXC = true;
244244
}
245245

246+
bool common_hal_busio_uart_deinited(busio_uart_obj_t *self) {
247+
return self->rx_pin == NO_PIN && self->tx_pin == NO_PIN;
248+
}
249+
246250
void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
251+
if (common_hal_busio_uart_deinited(self)) {
252+
return;
253+
}
247254
self->uart_instance.hw->USART.INTENCLR.bit.RXC = true;
248255

249256
uint8_t instance_index = _sercom_get_sercom_inst_index(self->uart_instance.hw);
@@ -256,6 +263,8 @@ void common_hal_busio_uart_deinit(busio_uart_obj_t *self) {
256263
usart_disable(&self->uart_instance);
257264
reset_pin(self->rx_pin);
258265
reset_pin(self->tx_pin);
266+
self->rx_pin = NO_PIN;
267+
self->tx_pin = NO_PIN;
259268
}
260269

261270
// Read characters.

0 commit comments

Comments
 (0)