diff options
| author | Dan Halbert <halbert@halwitz.org> | 2017-10-02 20:49:40 -0400 |
|---|---|---|
| committer | Scott Shawcroft <scott@tannewt.org> | 2017-10-03 12:07:17 -0700 |
| commit | c478c10923b9085b2abe135470e968029aaf2fdb (patch) | |
| tree | 6d76c8aa9cc4553d68fe3ff766f2f36b59378ec5 /esp8266 | |
| parent | c2bb9e2eb50e0dee6d7405fd738f1b4b0f94d10b (diff) | |
Do not allow a *io object to be used after deinit().
Fixes #278, #277, #276, #275.
Diffstat (limited to 'esp8266')
| -rw-r--r-- | esp8266/Makefile | 6 | ||||
| -rw-r--r-- | esp8266/common-hal/analogio/AnalogIn.c | 8 | ||||
| -rw-r--r-- | esp8266/common-hal/analogio/AnalogIn.h | 2 | ||||
| -rw-r--r-- | esp8266/common-hal/analogio/AnalogOut.c | 4 | ||||
| -rw-r--r-- | esp8266/common-hal/busio/SPI.c | 10 | ||||
| -rw-r--r-- | esp8266/common-hal/busio/SPI.h | 1 | ||||
| -rw-r--r-- | esp8266/common-hal/busio/UART.c | 8 | ||||
| -rw-r--r-- | esp8266/common-hal/busio/UART.h | 3 | ||||
| -rw-r--r-- | esp8266/common-hal/digitalio/DigitalInOut.c | 8 | ||||
| -rw-r--r-- | esp8266/common-hal/pulseio/PWMOut.c | 12 | ||||
| -rw-r--r-- | esp8266/common-hal/pulseio/PulseIn.c | 5 | ||||
| -rw-r--r-- | esp8266/common-hal/pulseio/PulseOut.c | 4 |
12 files changed, 64 insertions, 7 deletions
diff --git a/esp8266/Makefile b/esp8266/Makefile index 3daff9c62..bfaefb465 100644 --- a/esp8266/Makefile +++ b/esp8266/Makefile @@ -121,12 +121,14 @@ SRC_COMMON_HAL = \ time/__init__.c \ board/__init__.c + # These don't have corresponding files in each port but are still located in # shared-bindings to make it clear what the contents of the modules are. SRC_BINDINGS_ENUMS = \ digitalio/Direction.c \ digitalio/DriveMode.c \ - digitalio/Pull.c + digitalio/Pull.c \ + util.c SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ @@ -141,7 +143,7 @@ SRC_SHARED_MODULE = \ multiterminal/__init__.c \ os/__init__.c \ random/__init__.c \ - storage/__init__.c \ + storage/__init__.c SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ $(addprefix shared-module/, $(SRC_SHARED_MODULE)) diff --git a/esp8266/common-hal/analogio/AnalogIn.c b/esp8266/common-hal/analogio/AnalogIn.c index 0f43a0879..d3a81272e 100644 --- a/esp8266/common-hal/analogio/AnalogIn.c +++ b/esp8266/common-hal/analogio/AnalogIn.c @@ -46,8 +46,16 @@ void common_hal_analogio_analogin_construct(analogio_analogin_obj_t* self, adc_in_use = true; } +bool common_hal_analogio_analogin_deinited(analogio_analogin_obj_t* self) { + return self->deinited; +} + void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t* self) { + if (common_hal_analogio_analogin_deinited(self)) { + return; + } adc_in_use = false; + self->deinited = true; } uint16_t common_hal_analogio_analogin_get_value(analogio_analogin_obj_t *self) { diff --git a/esp8266/common-hal/analogio/AnalogIn.h b/esp8266/common-hal/analogio/AnalogIn.h index 0f529957a..b20b8cc61 100644 --- a/esp8266/common-hal/analogio/AnalogIn.h +++ b/esp8266/common-hal/analogio/AnalogIn.h @@ -33,7 +33,7 @@ typedef struct { mp_obj_base_t base; - const mcu_pin_obj_t * pin; + bool deinited; } analogio_analogin_obj_t; #endif // MICROPY_INCLUDED_ESP8266_COMMON_HAL_ANALOGIO_ANALOGIN_H diff --git a/esp8266/common-hal/analogio/AnalogOut.c b/esp8266/common-hal/analogio/AnalogOut.c index 30dc44830..15e9ee277 100644 --- a/esp8266/common-hal/analogio/AnalogOut.c +++ b/esp8266/common-hal/analogio/AnalogOut.c @@ -38,6 +38,10 @@ void common_hal_analogio_analogout_construct(analogio_analogout_obj_t* self, "No hardware support for analog out.")); } +bool common_hal_analogio_analogout_deinited(analogio_analogout_obj_t *self) { + return true; +} + void common_hal_analogio_analogout_deinit(analogio_analogout_obj_t *self) { } diff --git a/esp8266/common-hal/busio/SPI.c b/esp8266/common-hal/busio/SPI.c index 910e1e40d..b372d0764 100644 --- a/esp8266/common-hal/busio/SPI.c +++ b/esp8266/common-hal/busio/SPI.c @@ -74,7 +74,15 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, CLEAR_PERI_REG_MASK(SPI_USER(HSPI), SPI_FLASH_MODE); } +bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { + return self->deinited; +} + void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { + if (common_hal_busio_spi_deinited(self)) { + return; + } + PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, 0); PIN_PULLUP_DIS(PERIPHS_IO_MUX_MTDI_U); @@ -86,6 +94,8 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { // Turn off outputs 12 - 14. gpio_output_set(0x0, 0x0, 0x0, 0x7 << 12); + + self->deinited = true; } bool common_hal_busio_spi_configure(busio_spi_obj_t *self, diff --git a/esp8266/common-hal/busio/SPI.h b/esp8266/common-hal/busio/SPI.h index ea2f3d9ef..24822ca3c 100644 --- a/esp8266/common-hal/busio/SPI.h +++ b/esp8266/common-hal/busio/SPI.h @@ -34,6 +34,7 @@ typedef struct { mp_obj_base_t base; bool locked; + bool deinited; } busio_spi_obj_t; #endif // MICROPY_INCLUDED_ESP8266_COMMON_HAL_BUSIO_SPI_H diff --git a/esp8266/common-hal/busio/UART.c b/esp8266/common-hal/busio/UART.c index b2a1d69b8..8d6e0b7bc 100644 --- a/esp8266/common-hal/busio/UART.c +++ b/esp8266/common-hal/busio/UART.c @@ -92,8 +92,16 @@ void common_hal_busio_uart_construct(busio_uart_obj_t *self, uart_setup(UART1); } +bool common_hal_busio_uart_deinited(busio_uart_obj_t *self) { + return self->deinited; +} + void common_hal_busio_uart_deinit(busio_uart_obj_t *self) { + if (common_hal_busio_uart_deinited(self)) { + return; + } PIN_FUNC_SELECT(FUNC_U1TXD_BK, 0); + self->deinited = true; } size_t common_hal_busio_uart_read(busio_uart_obj_t *self, uint8_t *data, size_t len, int *errcode) { diff --git a/esp8266/common-hal/busio/UART.h b/esp8266/common-hal/busio/UART.h index 75e68c78e..d5dd138ad 100644 --- a/esp8266/common-hal/busio/UART.h +++ b/esp8266/common-hal/busio/UART.h @@ -32,7 +32,8 @@ #include "py/obj.h" typedef struct { - mp_obj_base_t base; + mp_obj_base_t base; + bool deinited; } busio_uart_obj_t; #endif // MICROPY_INCLUDED_ESP8266_COMMON_HAL_BUSIO_UART_H diff --git a/esp8266/common-hal/digitalio/DigitalInOut.c b/esp8266/common-hal/digitalio/DigitalInOut.c index ba6589d88..70ed207d5 100644 --- a/esp8266/common-hal/digitalio/DigitalInOut.c +++ b/esp8266/common-hal/digitalio/DigitalInOut.c @@ -41,13 +41,21 @@ digitalinout_result_t common_hal_digitalio_digitalinout_construct( return DIGITALINOUT_OK; } +bool common_hal_digitalio_digitalinout_deinited(digitalio_digitalinout_obj_t* self) { + return self->pin == mp_const_none; +} + void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t* self) { + if (common_hal_digitalio_digitalinout_deinited(self)) { + return; + } if (self->pin->gpio_number < 16) { uint32_t pin_mask = 1 << self->pin->gpio_number; gpio_output_set(0x0, 0x0, 0x0, pin_mask); PIN_FUNC_SELECT(self->pin->peripheral, 0); PIN_PULLUP_DIS(self->pin->peripheral); } + self->pin = mp_const_none; } void common_hal_digitalio_digitalinout_switch_to_input( diff --git a/esp8266/common-hal/pulseio/PWMOut.c b/esp8266/common-hal/pulseio/PWMOut.c index 40a46e392..9cc869794 100644 --- a/esp8266/common-hal/pulseio/PWMOut.c +++ b/esp8266/common-hal/pulseio/PWMOut.c @@ -77,7 +77,14 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, const mcu_p } } -extern void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self) { +bool common_hal_pulseio_pwmout_deinited(pulseio_pwmout_obj_t* self) { + return self->pin == mp_const_none; +} + +void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self) { + if (common_hal_pulseio_pwmout_deinited(self)) { + return; + } pwm_delete(self->channel); pwm_start(); if (self->pin->gpio_number < 16) { @@ -86,9 +93,10 @@ extern void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self) { PIN_FUNC_SELECT(self->pin->peripheral, 0); PIN_PULLUP_DIS(self->pin->peripheral); } + self->pin = mp_const_none; } -extern void common_hal_pulseio_pwmout_set_duty_cycle(pulseio_pwmout_obj_t* self, uint16_t duty) { +void common_hal_pulseio_pwmout_set_duty_cycle(pulseio_pwmout_obj_t* self, uint16_t duty) { // We get 16 bits of duty in but the underlying code is only ten bit. pwm_set_duty(duty >> 6, self->channel); pwm_start(); diff --git a/esp8266/common-hal/pulseio/PulseIn.c b/esp8266/common-hal/pulseio/PulseIn.c index 784116bef..783442b35 100644 --- a/esp8266/common-hal/pulseio/PulseIn.c +++ b/esp8266/common-hal/pulseio/PulseIn.c @@ -37,8 +37,11 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t* self, mp_raise_NotImplementedError(""); } -void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) { +bool common_hal_pulseio_pulsein_deinited(pulseio_pulsein_obj_t* self) { + return true; +} +void common_hal_pulseio_pulsein_deinit(pulseio_pulsein_obj_t* self) { } void common_hal_pulseio_pulsein_pause(pulseio_pulsein_obj_t* self) { diff --git a/esp8266/common-hal/pulseio/PulseOut.c b/esp8266/common-hal/pulseio/PulseOut.c index 1301abbf3..db2f7cbd9 100644 --- a/esp8266/common-hal/pulseio/PulseOut.c +++ b/esp8266/common-hal/pulseio/PulseOut.c @@ -35,6 +35,10 @@ void common_hal_pulseio_pulseout_construct(pulseio_pulseout_obj_t* self, nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "No hardware support for PulseOut.")); } +bool common_hal_pulseio_pulseout_deinited(pulseio_pulseout_obj_t* self) { + return true; +} + void common_hal_pulseio_pulseout_deinit(pulseio_pulseout_obj_t* self) { } |
