Skip to content

Commit c478c10

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

Some content is hidden

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

67 files changed

+445
-59
lines changed

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.

atmel-samd/common-hal/digitalio/DigitalInOut.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,16 @@ digitalinout_result_t common_hal_digitalio_digitalinout_construct(
5151
return DIGITALINOUT_OK;
5252
}
5353

54+
bool common_hal_digitalio_digitalinout_deinited(digitalio_digitalinout_obj_t* self) {
55+
return self->pin == mp_const_none;
56+
}
57+
5458
void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t* self) {
59+
if (common_hal_digitalio_digitalinout_deinited(self)) {
60+
return;
61+
}
5562
reset_pin(self->pin->pin);
63+
self->pin = mp_const_none;
5664
}
5765

5866
void common_hal_digitalio_digitalinout_switch_to_input(

atmel-samd/common-hal/pulseio/PWMOut.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,14 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
238238
common_hal_pulseio_pwmout_set_duty_cycle(self, duty);
239239
}
240240

241-
extern void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self) {
241+
bool common_hal_pulseio_pwmout_deinited(pulseio_pwmout_obj_t* self) {
242+
return self->pin == mp_const_none;
243+
}
244+
245+
void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self) {
246+
if (common_hal_pulseio_pwmout_deinited(self)) {
247+
return;
248+
}
242249
const pin_timer_t* t = self->timer;
243250
uint8_t index = (((uint32_t) t->tcc) - ((uint32_t) TCC0)) / 0x400;
244251
timer_refcount[index]--;
@@ -260,6 +267,7 @@ extern void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self) {
260267
}
261268
}
262269
reset_pin(self->pin->pin);
270+
self->pin = mp_const_none;
263271
}
264272

265273
extern void common_hal_pulseio_pwmout_set_duty_cycle(pulseio_pwmout_obj_t* self, uint16_t duty) {

atmel-samd/common-hal/pulseio/PulseIn.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,18 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self,
152152
extint_chan_enable_callback(self->channel, EXTINT_CALLBACK_TYPE_DETECT);
153153
}
154154

155+
bool common_hal_pulseio_pulsein_deinited(pulseio_pulsein_obj_t* self) {
156+
return self->pin == NO_PIN;
157+
}
158+
155159
void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) {
160+
if (common_hal_pulseio_pulsein_deinited(self)) {
161+
return;
162+
}
156163
extint_chan_disable_callback(self->channel, EXTINT_CALLBACK_TYPE_DETECT);
157164
active_pulseins[self->channel] = NULL;
158165
reset_pin(self->pin);
166+
self->pin = NO_PIN;
159167
}
160168

161169
void common_hal_pulseio_pulsein_pause(pulseio_pulsein_obj_t* self) {

atmel-samd/common-hal/pulseio/PulseOut.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "mpconfigport.h"
3535
#include "py/gc.h"
3636
#include "py/runtime.h"
37+
#include "samd21_pins.h"
3738
#include "shared-bindings/pulseio/PulseOut.h"
3839

3940
#undef ENABLE
@@ -128,7 +129,14 @@ void common_hal_pulseio_pulseout_construct(pulseio_pulseout_obj_t* self,
128129
turn_off(self->pincfg);
129130
}
130131

132+
bool common_hal_pulseio_pulseout_deinited(pulseio_pulseout_obj_t* self) {
133+
return self->pin == NO_PIN;
134+
}
135+
131136
void common_hal_pulseio_pulseout_deinit(pulseio_pulseout_obj_t* self) {
137+
if (common_hal_pulseio_pulseout_deinited(self)) {
138+
return;
139+
}
132140
PortGroup *const port_base = port_get_group_from_gpio_pin(self->pin);
133141
port_base->DIRCLR.reg = 1 << (self->pin % 32);
134142

@@ -140,6 +148,7 @@ void common_hal_pulseio_pulseout_deinit(pulseio_pulseout_obj_t* self) {
140148
gc_free(MP_STATE_VM(pulseout_tc_instance));
141149
MP_STATE_VM(pulseout_tc_instance) = NULL;
142150
}
151+
self->pin = NO_PIN;
143152
}
144153

145154
void common_hal_pulseio_pulseout_send(pulseio_pulseout_obj_t* self, uint16_t* pulses, uint16_t length) {

atmel-samd/common-hal/touchio/TouchIn.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "py/mphal.h"
3434
#include "shared-bindings/touchio/TouchIn.h"
3535

36+
#include "samd21_pins.h"
3637
#include "tick.h"
3738

3839
#include "adafruit_ptc.h"
@@ -81,9 +82,17 @@ void common_hal_touchio_touchin_construct(touchio_touchin_obj_t* self,
8182
self->threshold = get_raw_reading(self) + 100;
8283
}
8384

85+
bool common_hal_touchio_touchin_deinited(touchio_touchin_obj_t* self) {
86+
return self->config.pin == NO_PIN;
87+
}
88+
8489
void common_hal_touchio_touchin_deinit(touchio_touchin_obj_t* self) {
8590
// TODO(tannewt): Reset the PTC.
86-
reset_pin(self->pin->pin);
91+
if (common_hal_touchio_touchin_deinited(self)) {
92+
return;
93+
}
94+
reset_pin(self->config.pin);
95+
self->config.pin = NO_PIN;
8796
}
8897

8998
void touchin_reset() {

atmel-samd/common-hal/touchio/TouchIn.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636

3737
typedef struct {
3838
mp_obj_base_t base;
39-
const mcu_pin_obj_t * pin;
4039
struct adafruit_ptc_config config;
4140
uint16_t threshold;
4241
} touchio_touchin_obj_t;

esp8266/Makefile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,14 @@ SRC_COMMON_HAL = \
121121
time/__init__.c \
122122
board/__init__.c
123123

124+
124125
# These don't have corresponding files in each port but are still located in
125126
# shared-bindings to make it clear what the contents of the modules are.
126127
SRC_BINDINGS_ENUMS = \
127128
digitalio/Direction.c \
128129
digitalio/DriveMode.c \
129-
digitalio/Pull.c
130+
digitalio/Pull.c \
131+
util.c
130132

131133
SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \
132134
$(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \
@@ -141,7 +143,7 @@ SRC_SHARED_MODULE = \
141143
multiterminal/__init__.c \
142144
os/__init__.c \
143145
random/__init__.c \
144-
storage/__init__.c \
146+
storage/__init__.c
145147

146148
SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \
147149
$(addprefix shared-module/, $(SRC_SHARED_MODULE))

esp8266/common-hal/analogio/AnalogIn.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,16 @@ void common_hal_analogio_analogin_construct(analogio_analogin_obj_t* self,
4646
adc_in_use = true;
4747
}
4848

49+
bool common_hal_analogio_analogin_deinited(analogio_analogin_obj_t* self) {
50+
return self->deinited;
51+
}
52+
4953
void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t* self) {
54+
if (common_hal_analogio_analogin_deinited(self)) {
55+
return;
56+
}
5057
adc_in_use = false;
58+
self->deinited = true;
5159
}
5260

5361
uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) {

esp8266/common-hal/analogio/AnalogIn.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
typedef struct {
3535
mp_obj_base_t base;
36-
const mcu_pin_obj_t * pin;
36+
bool deinited;
3737
} analogio_analogin_obj_t;
3838

3939
#endif // MICROPY_INCLUDED_ESP8266_COMMON_HAL_ANALOGIO_ANALOGIN_H

esp8266/common-hal/analogio/AnalogOut.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ void common_hal_analogio_analogout_construct(analogio_analogout_obj_t* self,
3838
"No hardware support for analog out."));
3939
}
4040

41+
bool common_hal_analogio_analogout_deinited(analogio_analogout_obj_t *self) {
42+
return true;
43+
}
44+
4145
void common_hal_analogio_analogout_deinit(analogio_analogout_obj_t *self) {
4246
}
4347

0 commit comments

Comments
 (0)