summaryrefslogtreecommitdiff
path: root/esp8266
diff options
context:
space:
mode:
authorDan Halbert <halbert@halwitz.org>2017-10-02 20:49:40 -0400
committerScott Shawcroft <scott@tannewt.org>2017-10-03 12:07:17 -0700
commitc478c10923b9085b2abe135470e968029aaf2fdb (patch)
tree6d76c8aa9cc4553d68fe3ff766f2f36b59378ec5 /esp8266
parentc2bb9e2eb50e0dee6d7405fd738f1b4b0f94d10b (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/Makefile6
-rw-r--r--esp8266/common-hal/analogio/AnalogIn.c8
-rw-r--r--esp8266/common-hal/analogio/AnalogIn.h2
-rw-r--r--esp8266/common-hal/analogio/AnalogOut.c4
-rw-r--r--esp8266/common-hal/busio/SPI.c10
-rw-r--r--esp8266/common-hal/busio/SPI.h1
-rw-r--r--esp8266/common-hal/busio/UART.c8
-rw-r--r--esp8266/common-hal/busio/UART.h3
-rw-r--r--esp8266/common-hal/digitalio/DigitalInOut.c8
-rw-r--r--esp8266/common-hal/pulseio/PWMOut.c12
-rw-r--r--esp8266/common-hal/pulseio/PulseIn.c5
-rw-r--r--esp8266/common-hal/pulseio/PulseOut.c4
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) {
}