diff options
| author | arturo182 <arturo182@tlen.pl> | 2018-07-08 17:48:32 +0200 |
|---|---|---|
| committer | arturo182 <arturo182@tlen.pl> | 2018-07-08 17:48:32 +0200 |
| commit | 388f554ff6516ce19ad52830f26b623ded395bb5 (patch) | |
| tree | 302fb9f8d4b65214851c42df9e96ea088361a720 /ports/nrf/common-hal | |
| parent | 25ece8fb3d96969dffb0726ba57d42cf7ed95b4d (diff) | |
nrf: Rewrite the DigitalInOut hal using nRFx
Diffstat (limited to 'ports/nrf/common-hal')
| -rw-r--r-- | ports/nrf/common-hal/analogio/AnalogIn.c | 2 | ||||
| -rw-r--r-- | ports/nrf/common-hal/digitalio/DigitalInOut.c | 138 | ||||
| -rw-r--r-- | ports/nrf/common-hal/digitalio/DigitalInOut.h | 4 | ||||
| -rw-r--r-- | ports/nrf/common-hal/microcontroller/Pin.c | 46 | ||||
| -rw-r--r-- | ports/nrf/common-hal/microcontroller/Pin.h | 1 | ||||
| -rw-r--r-- | ports/nrf/common-hal/pulseio/PWMOut.c | 5 |
6 files changed, 80 insertions, 116 deletions
diff --git a/ports/nrf/common-hal/analogio/AnalogIn.c b/ports/nrf/common-hal/analogio/AnalogIn.c index 043f66852..a2f452b35 100644 --- a/ports/nrf/common-hal/analogio/AnalogIn.c +++ b/ports/nrf/common-hal/analogio/AnalogIn.c @@ -37,7 +37,7 @@ void common_hal_analogio_analogin_construct(analogio_analogin_obj_t *self, const if (pin->adc_channel == 0) mp_raise_ValueError("Pin does not have ADC capabilities"); - hal_gpio_cfg_pin(pin->port, pin->pin, HAL_GPIO_MODE_INPUT, HAL_GPIO_PULL_DISABLED); + nrf_gpio_cfg_default(NRF_GPIO_PIN_MAP(pin->port, pin->pin)); self->pin = pin; } diff --git a/ports/nrf/common-hal/digitalio/DigitalInOut.c b/ports/nrf/common-hal/digitalio/DigitalInOut.c index 66fd0eb03..b84877703 100644 --- a/ports/nrf/common-hal/digitalio/DigitalInOut.c +++ b/ports/nrf/common-hal/digitalio/DigitalInOut.c @@ -24,146 +24,148 @@ * THE SOFTWARE. */ -#include <stdint.h> -#include <string.h> - +#include "shared-bindings/digitalio/DigitalInOut.h" #include "py/runtime.h" -#include "py/mphal.h" -#include "hal/hal_gpio.h" - -#include "common-hal/microcontroller/Pin.h" -#include "shared-bindings/digitalio/DigitalInOut.h" +#include "nrf_gpio.h" digitalinout_result_t common_hal_digitalio_digitalinout_construct( - digitalio_digitalinout_obj_t* self, const mcu_pin_obj_t* pin) { + digitalio_digitalinout_obj_t *self, const mcu_pin_obj_t *pin) { self->pin = pin; - hal_gpio_cfg_pin(pin->port, pin->pin, HAL_GPIO_MODE_INPUT, HAL_GPIO_PULL_DISABLED); + + nrf_gpio_cfg_input(NRF_GPIO_PIN_MAP(pin->port, pin->pin), NRF_GPIO_PIN_NOPULL); + return DIGITALINOUT_OK; } -bool common_hal_digitalio_digitalinout_deinited(digitalio_digitalinout_obj_t* self) { +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) { +void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t *self) { if (common_hal_digitalio_digitalinout_deinited(self)) { return; } - reset_pin(self->pin->pin); + + const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin); + nrf_gpio_cfg_default(pin); + 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; + digitalio_digitalinout_obj_t *self, digitalio_pull_t pull) { + const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin); + + nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); - hal_gpio_cfg_pin(self->pin->port, self->pin->pin, HAL_GPIO_MODE_INPUT, HAL_GPIO_PULL_DISABLED); common_hal_digitalio_digitalinout_set_pull(self, pull); } void common_hal_digitalio_digitalinout_switch_to_output( - digitalio_digitalinout_obj_t* self, bool value, + digitalio_digitalinout_obj_t *self, bool value, digitalio_drive_mode_t drive_mode) { - const uint8_t pin = self->pin->pin; + const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin); - self->output = true; self->open_drain = (drive_mode == DRIVE_MODE_OPEN_DRAIN); - hal_gpio_cfg_pin(self->pin->port, pin, HAL_GPIO_MODE_OUTPUT, HAL_GPIO_PULL_DISABLED); + nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL); + common_hal_digitalio_digitalinout_set_value(self, value); } digitalio_direction_t common_hal_digitalio_digitalinout_get_direction( - digitalio_digitalinout_obj_t* self) { - return self->output? DIRECTION_OUTPUT : DIRECTION_INPUT; + digitalio_digitalinout_obj_t *self) { + const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin); + + return (nrf_gpio_pin_dir_get(pin) == NRF_GPIO_PIN_DIR_OUTPUT) ? DIRECTION_OUTPUT : DIRECTION_INPUT; } void common_hal_digitalio_digitalinout_set_value( - digitalio_digitalinout_obj_t* self, bool value) { - if (value) { - if (self->open_drain) { - hal_gpio_dir_set(self->pin->port, self->pin->pin, HAL_GPIO_MODE_INPUT); - } else { - hal_gpio_pin_set(self->pin->port, self->pin->pin); - hal_gpio_dir_set(self->pin->port, self->pin->pin, HAL_GPIO_MODE_OUTPUT); - } + digitalio_digitalinout_obj_t *self, bool value) { + const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin); + + if (value && self->open_drain) { + nrf_gpio_pin_dir_set(pin, NRF_GPIO_PIN_DIR_INPUT); } else { - hal_gpio_pin_clear(self->pin->port, self->pin->pin); - hal_gpio_dir_set(self->pin->port, self->pin->pin, HAL_GPIO_MODE_OUTPUT); + nrf_gpio_pin_dir_set(pin, NRF_GPIO_PIN_DIR_OUTPUT); + nrf_gpio_pin_write(pin, value); } } bool common_hal_digitalio_digitalinout_get_value( - digitalio_digitalinout_obj_t* self) { - const uint8_t pin = self->pin->pin; - if (!self->output) { - return hal_gpio_pin_read(self->pin); - } else { - if (self->open_drain && hal_gpio_dir_get(self->pin->port, self->pin->pin) == HAL_GPIO_MODE_INPUT) { + digitalio_digitalinout_obj_t *self) { + const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin); + const nrf_gpio_pin_dir_t dir = nrf_gpio_pin_dir_get(pin); + + if (dir == NRF_GPIO_PIN_DIR_INPUT) { + if (self->open_drain) return true; - } else { - return (GPIO_BASE(self->pin->port)->OUT >> pin) & 1; - } + + return nrf_gpio_pin_read(pin); } + + return nrf_gpio_pin_out_read(pin); } void common_hal_digitalio_digitalinout_set_drive_mode( - digitalio_digitalinout_obj_t* self, + digitalio_digitalinout_obj_t *self, digitalio_drive_mode_t drive_mode) { - bool value = common_hal_digitalio_digitalinout_get_value(self); + const bool value = common_hal_digitalio_digitalinout_get_value(self); self->open_drain = drive_mode == DRIVE_MODE_OPEN_DRAIN; + // 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) { + digitalio_digitalinout_obj_t *self) { + if (self->open_drain) return DRIVE_MODE_OPEN_DRAIN; - } else { - return DRIVE_MODE_PUSH_PULL; - } + + return DRIVE_MODE_PUSH_PULL; } void common_hal_digitalio_digitalinout_set_pull( - digitalio_digitalinout_obj_t* self, digitalio_pull_t pull) { - hal_gpio_pull_t asf_pull = HAL_GPIO_PULL_DISABLED; + digitalio_digitalinout_obj_t *self, digitalio_pull_t pull) { + const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin); + nrf_gpio_pin_pull_t hal_pull = NRF_GPIO_PIN_NOPULL; + switch (pull) { case PULL_UP: - asf_pull = HAL_GPIO_PULL_UP; + hal_pull = NRF_GPIO_PIN_PULLUP; break; case PULL_DOWN: - asf_pull = HAL_GPIO_PULL_DOWN; + hal_pull = NRF_GPIO_PIN_PULLDOWN; break; case PULL_NONE: default: break; } - hal_gpio_pull_set(self->pin->port, self->pin->pin, asf_pull); + + nrf_gpio_cfg_input(pin, hal_pull); } digitalio_pull_t common_hal_digitalio_digitalinout_get_pull( - digitalio_digitalinout_obj_t* self) { - uint32_t pin = self->pin->pin; - if (self->output) { + digitalio_digitalinout_obj_t *self) { + uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin); + NRF_GPIO_Type *reg = nrf_gpio_pin_port_decode(&pin); + + if (nrf_gpio_pin_dir_get(pin) == NRF_GPIO_PIN_DIR_OUTPUT) { mp_raise_AttributeError("Cannot get pull while in output mode"); return PULL_NONE; - } else { - hal_gpio_pull_t pull = hal_gpio_pull_get(self->pin->port, pin); + } - switch(pull) - { - case HAL_GPIO_PULL_UP: - return PULL_UP; + switch (reg->PIN_CNF[self->pin->pin] & GPIO_PIN_CNF_PULL_Msk) { + case NRF_GPIO_PIN_PULLUP: + return PULL_UP; - case HAL_GPIO_PULL_DOWN: - return PULL_DOWN; + case NRF_GPIO_PIN_PULLDOWN: + return PULL_DOWN; - default: return PULL_NONE; - } + default: + return PULL_NONE; } } diff --git a/ports/nrf/common-hal/digitalio/DigitalInOut.h b/ports/nrf/common-hal/digitalio/DigitalInOut.h index 8089d8bac..ee59eb498 100644 --- a/ports/nrf/common-hal/digitalio/DigitalInOut.h +++ b/ports/nrf/common-hal/digitalio/DigitalInOut.h @@ -28,12 +28,10 @@ #define MICROPY_INCLUDED_NRF_COMMON_HAL_DIGITALIO_DIGITALINOUT_H #include "common-hal/microcontroller/Pin.h" -#include "py/obj.h" typedef struct { mp_obj_base_t base; - const mcu_pin_obj_t * pin; - bool output; + const mcu_pin_obj_t *pin; 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 ee07ff09a..837e813ac 100644 --- a/ports/nrf/common-hal/microcontroller/Pin.c +++ b/ports/nrf/common-hal/microcontroller/Pin.c @@ -25,51 +25,15 @@ */ #include "common-hal/microcontroller/Pin.h" -#include "shared-bindings/microcontroller/Pin.h" - +#include "nrf_gpio.h" #include "py/mphal.h" -#if 0 - -extern volatile bool adc_in_use; - -bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin) { - if (pin == &pin_TOUT) { - return !adc_in_use; - } - if (pin->gpio_number == NO_GPIO || pin->gpio_number == SPECIAL_CASE) { - return false; - } - return (READ_PERI_REG(pin->peripheral) & - (PERIPHS_IO_MUX_FUNC<<PERIPHS_IO_MUX_FUNC_S)) == 0 && - (GPIO_REG_READ(GPIO_ENABLE_ADDRESS) & (1 << pin->gpio_number)) == 0 && - (READ_PERI_REG(pin->peripheral) & PERIPHS_IO_MUX_PULLUP) == 0; -} - -void reset_pins(void) { - for (int i = 0; i < 17; i++) { - // 5 is RXD, 6 is TXD - if ((i > 4 && i < 13) || i == 12) { - continue; - } - uint32_t peripheral = PERIPHS_IO_MUX + i * 4; - PIN_FUNC_SELECT(peripheral, 0); - PIN_PULLUP_DIS(peripheral); - // Disable the pin. - gpio_output_set(0x0, 0x0, 0x0, 1 << i); - } -} -#endif - -bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin) { - return true; +bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t *pin) { + return true; } void reset_all_pins(void) { + for (uint32_t pin = 0; pin < NUMBER_OF_PINS; ++pin) + nrf_gpio_cfg_default(pin); } -void reset_pin(uint8_t pin) { - -} - - diff --git a/ports/nrf/common-hal/microcontroller/Pin.h b/ports/nrf/common-hal/microcontroller/Pin.h index b04151184..66cd011da 100644 --- a/ports/nrf/common-hal/microcontroller/Pin.h +++ b/ports/nrf/common-hal/microcontroller/Pin.h @@ -32,6 +32,5 @@ #define mcu_pin_obj_t pin_obj_t void reset_all_pins(void); -void reset_pin(uint8_t pin); #endif // MICROPY_INCLUDED_NRF_COMMON_HAL_MICROCONTROLLER_PIN_H diff --git a/ports/nrf/common-hal/pulseio/PWMOut.c b/ports/nrf/common-hal/pulseio/PWMOut.c index ea9ba3f0e..d23662948 100644 --- a/ports/nrf/common-hal/pulseio/PWMOut.c +++ b/ports/nrf/common-hal/pulseio/PWMOut.c @@ -30,6 +30,7 @@ #include "py/runtime.h" #include "common-hal/pulseio/PWMOut.h" +#include "nrf_gpio.h" #include "shared-bindings/pulseio/PWMOut.h" #define PWM_MAX_MODULE 3 @@ -161,7 +162,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self, if (self->pwm) { - hal_gpio_cfg_pin(pin->port, pin->pin, HAL_GPIO_MODE_OUTPUT, HAL_GPIO_PULL_DISABLED); + nrf_gpio_cfg_output(NRF_GPIO_PIN_MAP(pin->port, pin->pin)); // disable before mapping pin channel self->pwm->ENABLE = 0; @@ -201,7 +202,7 @@ void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self) { } } - hal_gpio_cfg_pin(self->pin->port, self->pin->pin, HAL_GPIO_MODE_INPUT, HAL_GPIO_PULL_DISABLED); + nrf_gpio_cfg_default(NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin)); self->pwm = NULL; self->pin = mp_const_none; |
