diff options
| author | Dan Halbert <halbert@halwitz.org> | 2018-08-31 17:46:03 -0400 |
|---|---|---|
| committer | Dan Halbert <halbert@halwitz.org> | 2018-08-31 18:38:05 -0400 |
| commit | 9ea809bef73e6862103cd71802803122e97bf80b (patch) | |
| tree | fd918c0aec0e93abdefbff69052349446e15e0cc /ports/nrf | |
| parent | 585597a252be431fd4efe11a9120329b233ebba5 (diff) | |
add pin claiming to devices
Diffstat (limited to 'ports/nrf')
| -rw-r--r-- | ports/nrf/boards/feather_nrf52832/board.c | 4 | ||||
| -rw-r--r-- | ports/nrf/common-hal/analogio/AnalogIn.c | 2 | ||||
| -rw-r--r-- | ports/nrf/common-hal/analogio/AnalogOut.c | 2 | ||||
| -rw-r--r-- | ports/nrf/common-hal/busio/I2C.c | 17 | ||||
| -rw-r--r-- | ports/nrf/common-hal/busio/I2C.h | 3 | ||||
| -rw-r--r-- | ports/nrf/common-hal/busio/SPI.c | 28 | ||||
| -rw-r--r-- | ports/nrf/common-hal/busio/SPI.h | 4 | ||||
| -rw-r--r-- | ports/nrf/common-hal/digitalio/DigitalInOut.c | 20 | ||||
| -rw-r--r-- | ports/nrf/common-hal/digitalio/DigitalInOut.h | 1 | ||||
| -rw-r--r-- | ports/nrf/common-hal/microcontroller/Pin.c | 23 | ||||
| -rw-r--r-- | ports/nrf/common-hal/microcontroller/Pin.h | 4 | ||||
| -rw-r--r-- | ports/nrf/peripherals/nrf/nrf52832/pins.h | 2 | ||||
| -rw-r--r-- | ports/nrf/peripherals/nrf/nrf52840/pins.h | 2 | ||||
| -rw-r--r-- | ports/nrf/peripherals/nrf/pins.h | 3 |
14 files changed, 74 insertions, 41 deletions
diff --git a/ports/nrf/boards/feather_nrf52832/board.c b/ports/nrf/boards/feather_nrf52832/board.c index e0b77437b..dde63b553 100644 --- a/ports/nrf/boards/feather_nrf52832/board.c +++ b/ports/nrf/boards/feather_nrf52832/board.c @@ -52,8 +52,8 @@ bool board_requests_safe_mode(void) { // gpio_set_pin_pull_mode(PIN_PA28, GPIO_PULL_DOWN); // bool safe_mode = gpio_get_pin_level(PIN_PA14) && // gpio_get_pin_level(PIN_PA28); -// reset_pin(PIN_PA14); -// reset_pin(PIN_PA28); +// reset_pin_number(PIN_PA14); +// reset_pin_number(PIN_PA28); // return safe_mode; return false; diff --git a/ports/nrf/common-hal/analogio/AnalogIn.c b/ports/nrf/common-hal/analogio/AnalogIn.c index 1ebd5ea1a..1e572f7cb 100644 --- a/ports/nrf/common-hal/analogio/AnalogIn.c +++ b/ports/nrf/common-hal/analogio/AnalogIn.c @@ -40,6 +40,7 @@ void common_hal_analogio_analogin_construct(analogio_analogin_obj_t *self, const nrf_gpio_cfg_default(pin->number); + claim_pin(pin); self->pin = pin; } @@ -53,6 +54,7 @@ void common_hal_analogio_analogin_deinit(analogio_analogin_obj_t *self) { nrf_gpio_cfg_default(self->pin->number); + reset_pin_number(self->pin->number); self->pin = mp_const_none; } diff --git a/ports/nrf/common-hal/analogio/AnalogOut.c b/ports/nrf/common-hal/analogio/AnalogOut.c index 654639b59..dc0f53740 100644 --- a/ports/nrf/common-hal/analogio/AnalogOut.c +++ b/ports/nrf/common-hal/analogio/AnalogOut.c @@ -42,9 +42,7 @@ bool common_hal_analogio_analogout_deinited(analogio_analogout_obj_t *self) { } void common_hal_analogio_analogout_deinit(analogio_analogout_obj_t *self) { - } void common_hal_analogio_analogout_set_value(analogio_analogout_obj_t *self, uint16_t value) { - } diff --git a/ports/nrf/common-hal/busio/I2C.c b/ports/nrf/common-hal/busio/I2C.c index 9390b1fd8..8ac76c304 100644 --- a/ports/nrf/common-hal/busio/I2C.c +++ b/ports/nrf/common-hal/busio/I2C.c @@ -71,6 +71,11 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, const mcu_pin_obj_t * config.frequency = NRF_TWIM_FREQ_250K; } + self->scl_pin_number = scl->number; + self->sda_pin_number = sda->number; + claim_pin(sda); + claim_pin(scl); + nrfx_err_t err = nrfx_twim_init(&self->twim, &config, NULL, NULL); // A soft reset doesn't uninit the driver so we might end up with a invalid state @@ -79,14 +84,15 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self, const mcu_pin_obj_t * err = nrfx_twim_init(&self->twim, &config, NULL, NULL); } - if (err != NRFX_SUCCESS) + if (err != NRFX_SUCCESS) { + common_hal_busio_i2c_deinit(self); mp_raise_OSError(MP_EIO); + } - self->inited = true; } bool common_hal_busio_i2c_deinited(busio_i2c_obj_t *self) { - return !self->inited; + return self->sda_pin_number == NO_PIN; } void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) { @@ -95,7 +101,10 @@ void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) { nrfx_twim_uninit(&self->twim); - self->inited = false; + reset_pin_number(self->sda_pin_number); + reset_pin_number(self->scl_pin_number); + self->sda_pin_number = NO_PIN; + self->scl_pin_number = NO_PIN; } // nrfx_twim_tx doesn't support 0-length data so we fall back to the hal API diff --git a/ports/nrf/common-hal/busio/I2C.h b/ports/nrf/common-hal/busio/I2C.h index 331e73062..a133ff071 100644 --- a/ports/nrf/common-hal/busio/I2C.h +++ b/ports/nrf/common-hal/busio/I2C.h @@ -34,8 +34,9 @@ typedef struct { mp_obj_base_t base; nrfx_twim_t twim; - bool inited; bool has_lock; + uint8_t scl_pin_number; + uint8_t sda_pin_number; } busio_i2c_obj_t; #endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BUSIO_I2C_H diff --git a/ports/nrf/common-hal/busio/SPI.c b/ports/nrf/common-hal/busio/SPI.c index d4cf1b7ae..e2d6a0daa 100644 --- a/ports/nrf/common-hal/busio/SPI.c +++ b/ports/nrf/common-hal/busio/SPI.c @@ -78,12 +78,24 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, const mcu_pin_obj_t * config.frequency = NRF_SPIM_FREQ_8M; config.sck_pin = clock->number; + self->clock_pin_number = clock->number; + claim_pin(clock); - if (mosi != (mcu_pin_obj_t*)&mp_const_none_obj) + if (mosi != (mcu_pin_obj_t*)&mp_const_none_obj) { config.mosi_pin = mosi->number; + self->MOSI_pin_number = mosi->number; + claim_pin(mosi); + } else { + self->MOSI_pin_number = NO_PIN; + } - if (miso != (mcu_pin_obj_t*)&mp_const_none_obj) + if (miso != (mcu_pin_obj_t*)&mp_const_none_obj) { config.miso_pin = miso->number; + self->MISO_pin_number = mosi->number; + claim_pin(miso); + } else { + self->MISO_pin_number = NO_PIN; + } nrfx_err_t err = nrfx_spim_init(&self->spim, &config, NULL, NULL); @@ -93,14 +105,14 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self, const mcu_pin_obj_t * err = nrfx_spim_init(&self->spim, &config, NULL, NULL); } - if (err != NRFX_SUCCESS) + if (err != NRFX_SUCCESS) { + common_hal_busio_spi_deinit(self); mp_raise_OSError(MP_EIO); - - self->inited = true; + } } bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) { - return !self->inited; + return self->clock_pin_number == NO_PIN; } void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { @@ -109,7 +121,9 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) { nrfx_spim_uninit(&self->spim); - self->inited = false; + reset_pin_number(self->clock_pin_number); + reset_pin_number(self->MOSI_pin_number); + reset_pin_number(self->MISO_pin_number); } bool common_hal_busio_spi_configure(busio_spi_obj_t *self, uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t bits) { diff --git a/ports/nrf/common-hal/busio/SPI.h b/ports/nrf/common-hal/busio/SPI.h index c3999ae94..8b637b4a5 100644 --- a/ports/nrf/common-hal/busio/SPI.h +++ b/ports/nrf/common-hal/busio/SPI.h @@ -33,8 +33,10 @@ typedef struct { mp_obj_base_t base; nrfx_spim_t spim; - bool inited; bool has_lock; + uint8_t clock_pin_number; + uint8_t MOSI_pin_number; + uint8_t MISO_pin_number; } busio_spi_obj_t; #endif // MICROPY_INCLUDED_NRF_COMMON_HAL_BUSIO_SPI_H diff --git a/ports/nrf/common-hal/digitalio/DigitalInOut.c b/ports/nrf/common-hal/digitalio/DigitalInOut.c index c8ec12c03..b7a1a5001 100644 --- a/ports/nrf/common-hal/digitalio/DigitalInOut.c +++ b/ports/nrf/common-hal/digitalio/DigitalInOut.c @@ -32,7 +32,10 @@ digitalinout_result_t common_hal_digitalio_digitalinout_construct( digitalio_digitalinout_obj_t *self, const mcu_pin_obj_t *pin) { + claim_pin(pin); self->pin = pin; + self->output = false; + self->open_drain = false; nrf_gpio_cfg_input(pin->number, NRF_GPIO_PIN_NOPULL); @@ -49,11 +52,13 @@ void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t *self } nrf_gpio_cfg_default(self->pin->number); + reset_pin_number(self->pin->number); self->pin = mp_const_none; } void common_hal_digitalio_digitalinout_switch_to_input( digitalio_digitalinout_obj_t *self, digitalio_pull_t pull) { + self->output = false; nrf_gpio_cfg_input(self->pin->number, NRF_GPIO_PIN_NOPULL); common_hal_digitalio_digitalinout_set_pull(self, pull); } @@ -61,6 +66,7 @@ void common_hal_digitalio_digitalinout_switch_to_input( void common_hal_digitalio_digitalinout_switch_to_output( digitalio_digitalinout_obj_t *self, bool value, digitalio_drive_mode_t drive_mode) { + self->output = true; self->open_drain = (drive_mode == DRIVE_MODE_OPEN_DRAIN); nrf_gpio_cfg_input(self->pin->number, NRF_GPIO_PIN_NOPULL); @@ -70,8 +76,7 @@ void common_hal_digitalio_digitalinout_switch_to_output( digitalio_direction_t common_hal_digitalio_digitalinout_get_direction( digitalio_digitalinout_obj_t *self) { - return (nrf_gpio_pin_dir_get(self->pin->number) == NRF_GPIO_PIN_DIR_OUTPUT) - ? DIRECTION_OUTPUT : DIRECTION_INPUT; + return self->output ? DIRECTION_OUTPUT : DIRECTION_INPUT; } void common_hal_digitalio_digitalinout_set_value( @@ -87,8 +92,9 @@ void common_hal_digitalio_digitalinout_set_value( bool common_hal_digitalio_digitalinout_get_value( digitalio_digitalinout_obj_t *self) { if (nrf_gpio_pin_dir_get(self->pin->number) == NRF_GPIO_PIN_DIR_INPUT) { - if (self->open_drain) + if (self->open_drain) { return true; + } return nrf_gpio_pin_read(self->pin->number); } @@ -104,14 +110,16 @@ void common_hal_digitalio_digitalinout_set_drive_mode( // True is implemented differently between modes so reset the value to make // sure its correct for the new mode. - if (value) + if (value) { common_hal_digitalio_digitalinout_set_value(self, value); + } } digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode( digitalio_digitalinout_obj_t *self) { - if (self->open_drain) + if (self->open_drain) { return DRIVE_MODE_OPEN_DRAIN; + } return DRIVE_MODE_PUSH_PULL; } @@ -141,7 +149,7 @@ digitalio_pull_t common_hal_digitalio_digitalinout_get_pull( // Changes pin to be a relative pin number in port. NRF_GPIO_Type *reg = nrf_gpio_pin_port_decode(&pin); - if (nrf_gpio_pin_dir_get(pin) == NRF_GPIO_PIN_DIR_OUTPUT) { + if (nrf_gpio_pin_dir_get(self->pin->number) == NRF_GPIO_PIN_DIR_OUTPUT) { mp_raise_AttributeError(translate("Cannot get pull while in output mode")); return PULL_NONE; } diff --git a/ports/nrf/common-hal/digitalio/DigitalInOut.h b/ports/nrf/common-hal/digitalio/DigitalInOut.h index ee59eb498..afe8a8b42 100644 --- a/ports/nrf/common-hal/digitalio/DigitalInOut.h +++ b/ports/nrf/common-hal/digitalio/DigitalInOut.h @@ -32,6 +32,7 @@ typedef struct { mp_obj_base_t base; const mcu_pin_obj_t *pin; + bool output; bool open_drain; } digitalio_digitalinout_obj_t; diff --git a/ports/nrf/common-hal/microcontroller/Pin.c b/ports/nrf/common-hal/microcontroller/Pin.c index 4d2dea31e..01142fa15 100644 --- a/ports/nrf/common-hal/microcontroller/Pin.c +++ b/ports/nrf/common-hal/microcontroller/Pin.c @@ -44,7 +44,7 @@ bool speaker_enable_in_use; #endif // Bit mask of claimed pins on each of up to two ports. nrf52832 has one port; nrf52840 has two. -STATIC bool claimed_pins[2]; +STATIC uint32_t claimed_pins[2]; void reset_all_pins(void) { claimed_pins[0] = 0; @@ -70,17 +70,16 @@ void reset_all_pins(void) { } // Mark pin as free and return it to a quiescent state. -void reset_pin(uint8_t pin) { - // Ignore out-of-bound pin numbers. NUMBER_OF_PINS is from nrf_gpio.h. - if (pin >= NUMBER_OF_PINS) { +void reset_pin_number(uint8_t pin_number) { + if (pin_number == NO_PIN) { return; } // Clear claimed bit. - claimed_pins[nrf_pin_port(pin)] &= ~(1 << nrf_relative_pin_number(pin)); + claimed_pins[nrf_pin_port(pin_number)] &= ~(1 << nrf_relative_pin_number(pin_number)); #ifdef MICROPY_HW_NEOPIXEL - if (pin == MICROPY_HW_NEOPIXEL->number) { + if (pin_number == MICROPY_HW_NEOPIXEL->number) { neopixel_in_use = false; rgb_led_status_init(); return; @@ -89,8 +88,8 @@ void reset_pin(uint8_t pin) { #ifdef MICROPY_HW_APA102_MOSI if (pin == MICROPY_HW_APA102_MOSI->number || pin == MICROPY_HW_APA102_SCK->number) { - apa102_mosi_in_use = apa102_mosi_in_use && pin != MICROPY_HW_APA102_MOSI->number; - apa102_sck_in_use = apa102_sck_in_use && pin != MICROPY_HW_APA102_SCK->number; + apa102_mosi_in_use = apa102_mosi_in_use && pin_number != MICROPY_HW_APA102_MOSI->number; + apa102_sck_in_use = apa102_sck_in_use && pin_number != MICROPY_HW_APA102_SCK->number; if (!apa102_sck_in_use && !apa102_mosi_in_use) { rgb_led_status_init(); } @@ -99,11 +98,11 @@ void reset_pin(uint8_t pin) { #endif #ifdef SPEAKER_ENABLE_PIN - if (pin == SPEAKER_ENABLE_PIN->number) { + if (pin_number == SPEAKER_ENABLE_PIN->number) { speaker_enable_in_use = false; common_hal_digitalio_digitalinout_switch_to_output( - nrf_gpio_pin_dir_set(pin, NRF_GPIO_PIN_DIR_OUTPUT); - nrf_gpio_pin_write(pin, false); + nrf_gpio_pin_dir_set(pin_number, NRF_GPIO_PIN_DIR_OUTPUT); + nrf_gpio_pin_write(pin_number, false); } #endif } @@ -154,5 +153,5 @@ bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t *pin) { } #endif - return !(claimed_pins[nrf_pin_port(pin->number)] & (nrf_relative_pin_number(pin->number))); + return !(claimed_pins[nrf_pin_port(pin->number)] & (1 << nrf_relative_pin_number(pin->number))); } diff --git a/ports/nrf/common-hal/microcontroller/Pin.h b/ports/nrf/common-hal/microcontroller/Pin.h index 1e751c714..2cdf440b5 100644 --- a/ports/nrf/common-hal/microcontroller/Pin.h +++ b/ports/nrf/common-hal/microcontroller/Pin.h @@ -40,9 +40,9 @@ extern bool apa102_mosi_in_use; #endif void reset_all_pins(void); -// reset_pin takes the pin number instead of the pointer so that objects don't +// reset_pin_number takes the pin number instead of the pointer so that objects don't // need to store a full pointer. -void reset_pin(uint8_t pin); +void reset_pin_number(uint8_t pin); void claim_pin(const mcu_pin_obj_t* pin); // Lower 5 bits of a pin number are the pin number in a port. diff --git a/ports/nrf/peripherals/nrf/nrf52832/pins.h b/ports/nrf/peripherals/nrf/nrf52832/pins.h index 0bc039df0..f8ef85ad0 100644 --- a/ports/nrf/peripherals/nrf/nrf52832/pins.h +++ b/ports/nrf/peripherals/nrf/nrf52832/pins.h @@ -27,8 +27,6 @@ #ifndef MICROPY_INCLUDED_NRF_PERIPHERALS_NRF52832_PINS_H #define MICROPY_INCLUDED_NRF_PERIPHERALS_NRF52832_PINS_H -void reset_pin(uint8_t pin); - extern const mcu_pin_obj_t pin_P0_00; extern const mcu_pin_obj_t pin_P0_01; extern const mcu_pin_obj_t pin_P0_02; diff --git a/ports/nrf/peripherals/nrf/nrf52840/pins.h b/ports/nrf/peripherals/nrf/nrf52840/pins.h index 80f1d14af..3ad72ff63 100644 --- a/ports/nrf/peripherals/nrf/nrf52840/pins.h +++ b/ports/nrf/peripherals/nrf/nrf52840/pins.h @@ -27,8 +27,6 @@ #ifndef MICROPY_INCLUDED_NRF_PERIPHERALS_NRF52840_PINS_H #define MICROPY_INCLUDED_NRF_PERIPHERALS_NRF52840_PINS_H -void reset_pin(uint8_t pin); - extern const mcu_pin_obj_t pin_P0_00; extern const mcu_pin_obj_t pin_P0_01; extern const mcu_pin_obj_t pin_P0_02; diff --git a/ports/nrf/peripherals/nrf/pins.h b/ports/nrf/peripherals/nrf/pins.h index ca58f5fad..1a87c0d88 100644 --- a/ports/nrf/peripherals/nrf/pins.h +++ b/ports/nrf/peripherals/nrf/pins.h @@ -55,6 +55,9 @@ extern const mp_obj_type_t mcu_pin_type; .adc_channel = (p_adc_channel), \ } +// Use illegal pin value to mark unassigned pins. +#define NO_PIN 0xff + // Choose based on chip, but not specifically revision (e.g., not NRF52832_XXAA) #ifdef NRF52832 #include "nrf52832/pins.h" |
