Skip to content

Commit 388f554

Browse files
committed
nrf: Rewrite the DigitalInOut hal using nRFx
1 parent 25ece8f commit 388f554

File tree

8 files changed

+80
-267
lines changed

8 files changed

+80
-267
lines changed

ports/nrf/common-hal/analogio/AnalogIn.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ void common_hal_analogio_analogin_construct(analogio_analogin_obj_t *self, const
3737
if (pin->adc_channel == 0)
3838
mp_raise_ValueError("Pin does not have ADC capabilities");
3939

40-
hal_gpio_cfg_pin(pin->port, pin->pin, HAL_GPIO_MODE_INPUT, HAL_GPIO_PULL_DISABLED);
40+
nrf_gpio_cfg_default(NRF_GPIO_PIN_MAP(pin->port, pin->pin));
4141

4242
self->pin = pin;
4343
}

ports/nrf/common-hal/digitalio/DigitalInOut.c

Lines changed: 70 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -24,146 +24,148 @@
2424
* THE SOFTWARE.
2525
*/
2626

27-
#include <stdint.h>
28-
#include <string.h>
29-
27+
#include "shared-bindings/digitalio/DigitalInOut.h"
3028
#include "py/runtime.h"
31-
#include "py/mphal.h"
3229

33-
#include "hal/hal_gpio.h"
34-
35-
#include "common-hal/microcontroller/Pin.h"
36-
#include "shared-bindings/digitalio/DigitalInOut.h"
30+
#include "nrf_gpio.h"
3731

3832
digitalinout_result_t common_hal_digitalio_digitalinout_construct(
39-
digitalio_digitalinout_obj_t* self, const mcu_pin_obj_t* pin) {
33+
digitalio_digitalinout_obj_t *self, const mcu_pin_obj_t *pin) {
4034
self->pin = pin;
41-
hal_gpio_cfg_pin(pin->port, pin->pin, HAL_GPIO_MODE_INPUT, HAL_GPIO_PULL_DISABLED);
35+
36+
nrf_gpio_cfg_input(NRF_GPIO_PIN_MAP(pin->port, pin->pin), NRF_GPIO_PIN_NOPULL);
37+
4238
return DIGITALINOUT_OK;
4339
}
4440

45-
bool common_hal_digitalio_digitalinout_deinited(digitalio_digitalinout_obj_t* self) {
41+
bool common_hal_digitalio_digitalinout_deinited(digitalio_digitalinout_obj_t *self) {
4642
return self->pin == mp_const_none;
4743
}
4844

49-
void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t* self) {
45+
void common_hal_digitalio_digitalinout_deinit(digitalio_digitalinout_obj_t *self) {
5046
if (common_hal_digitalio_digitalinout_deinited(self)) {
5147
return;
5248
}
53-
reset_pin(self->pin->pin);
49+
50+
const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin);
51+
nrf_gpio_cfg_default(pin);
52+
5453
self->pin = mp_const_none;
5554
}
5655

5756
void common_hal_digitalio_digitalinout_switch_to_input(
58-
digitalio_digitalinout_obj_t* self, digitalio_pull_t pull) {
59-
self->output = false;
57+
digitalio_digitalinout_obj_t *self, digitalio_pull_t pull) {
58+
const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin);
59+
60+
nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL);
6061

61-
hal_gpio_cfg_pin(self->pin->port, self->pin->pin, HAL_GPIO_MODE_INPUT, HAL_GPIO_PULL_DISABLED);
6262
common_hal_digitalio_digitalinout_set_pull(self, pull);
6363
}
6464

6565
void common_hal_digitalio_digitalinout_switch_to_output(
66-
digitalio_digitalinout_obj_t* self, bool value,
66+
digitalio_digitalinout_obj_t *self, bool value,
6767
digitalio_drive_mode_t drive_mode) {
68-
const uint8_t pin = self->pin->pin;
68+
const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin);
6969

70-
self->output = true;
7170
self->open_drain = (drive_mode == DRIVE_MODE_OPEN_DRAIN);
7271

73-
hal_gpio_cfg_pin(self->pin->port, pin, HAL_GPIO_MODE_OUTPUT, HAL_GPIO_PULL_DISABLED);
72+
nrf_gpio_cfg_input(pin, NRF_GPIO_PIN_NOPULL);
73+
7474
common_hal_digitalio_digitalinout_set_value(self, value);
7575
}
7676

7777
digitalio_direction_t common_hal_digitalio_digitalinout_get_direction(
78-
digitalio_digitalinout_obj_t* self) {
79-
return self->output? DIRECTION_OUTPUT : DIRECTION_INPUT;
78+
digitalio_digitalinout_obj_t *self) {
79+
const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin);
80+
81+
return (nrf_gpio_pin_dir_get(pin) == NRF_GPIO_PIN_DIR_OUTPUT) ? DIRECTION_OUTPUT : DIRECTION_INPUT;
8082
}
8183

8284
void common_hal_digitalio_digitalinout_set_value(
83-
digitalio_digitalinout_obj_t* self, bool value) {
84-
if (value) {
85-
if (self->open_drain) {
86-
hal_gpio_dir_set(self->pin->port, self->pin->pin, HAL_GPIO_MODE_INPUT);
87-
} else {
88-
hal_gpio_pin_set(self->pin->port, self->pin->pin);
89-
hal_gpio_dir_set(self->pin->port, self->pin->pin, HAL_GPIO_MODE_OUTPUT);
90-
}
85+
digitalio_digitalinout_obj_t *self, bool value) {
86+
const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin);
87+
88+
if (value && self->open_drain) {
89+
nrf_gpio_pin_dir_set(pin, NRF_GPIO_PIN_DIR_INPUT);
9190
} else {
92-
hal_gpio_pin_clear(self->pin->port, self->pin->pin);
93-
hal_gpio_dir_set(self->pin->port, self->pin->pin, HAL_GPIO_MODE_OUTPUT);
91+
nrf_gpio_pin_dir_set(pin, NRF_GPIO_PIN_DIR_OUTPUT);
92+
nrf_gpio_pin_write(pin, value);
9493
}
9594
}
9695

9796
bool common_hal_digitalio_digitalinout_get_value(
98-
digitalio_digitalinout_obj_t* self) {
99-
const uint8_t pin = self->pin->pin;
100-
if (!self->output) {
101-
return hal_gpio_pin_read(self->pin);
102-
} else {
103-
if (self->open_drain && hal_gpio_dir_get(self->pin->port, self->pin->pin) == HAL_GPIO_MODE_INPUT) {
97+
digitalio_digitalinout_obj_t *self) {
98+
const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin);
99+
const nrf_gpio_pin_dir_t dir = nrf_gpio_pin_dir_get(pin);
100+
101+
if (dir == NRF_GPIO_PIN_DIR_INPUT) {
102+
if (self->open_drain)
104103
return true;
105-
} else {
106-
return (GPIO_BASE(self->pin->port)->OUT >> pin) & 1;
107-
}
104+
105+
return nrf_gpio_pin_read(pin);
108106
}
107+
108+
return nrf_gpio_pin_out_read(pin);
109109
}
110110

111111
void common_hal_digitalio_digitalinout_set_drive_mode(
112-
digitalio_digitalinout_obj_t* self,
112+
digitalio_digitalinout_obj_t *self,
113113
digitalio_drive_mode_t drive_mode) {
114-
bool value = common_hal_digitalio_digitalinout_get_value(self);
114+
const bool value = common_hal_digitalio_digitalinout_get_value(self);
115115
self->open_drain = drive_mode == DRIVE_MODE_OPEN_DRAIN;
116+
116117
// True is implemented differently between modes so reset the value to make
117118
// sure its correct for the new mode.
118-
if (value) {
119+
if (value)
119120
common_hal_digitalio_digitalinout_set_value(self, value);
120-
}
121121
}
122122

123123
digitalio_drive_mode_t common_hal_digitalio_digitalinout_get_drive_mode(
124-
digitalio_digitalinout_obj_t* self) {
125-
if (self->open_drain) {
124+
digitalio_digitalinout_obj_t *self) {
125+
if (self->open_drain)
126126
return DRIVE_MODE_OPEN_DRAIN;
127-
} else {
128-
return DRIVE_MODE_PUSH_PULL;
129-
}
127+
128+
return DRIVE_MODE_PUSH_PULL;
130129
}
131130

132131
void common_hal_digitalio_digitalinout_set_pull(
133-
digitalio_digitalinout_obj_t* self, digitalio_pull_t pull) {
134-
hal_gpio_pull_t asf_pull = HAL_GPIO_PULL_DISABLED;
132+
digitalio_digitalinout_obj_t *self, digitalio_pull_t pull) {
133+
const uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin);
134+
nrf_gpio_pin_pull_t hal_pull = NRF_GPIO_PIN_NOPULL;
135+
135136
switch (pull) {
136137
case PULL_UP:
137-
asf_pull = HAL_GPIO_PULL_UP;
138+
hal_pull = NRF_GPIO_PIN_PULLUP;
138139
break;
139140
case PULL_DOWN:
140-
asf_pull = HAL_GPIO_PULL_DOWN;
141+
hal_pull = NRF_GPIO_PIN_PULLDOWN;
141142
break;
142143
case PULL_NONE:
143144
default:
144145
break;
145146
}
146-
hal_gpio_pull_set(self->pin->port, self->pin->pin, asf_pull);
147+
148+
nrf_gpio_cfg_input(pin, hal_pull);
147149
}
148150

149151
digitalio_pull_t common_hal_digitalio_digitalinout_get_pull(
150-
digitalio_digitalinout_obj_t* self) {
151-
uint32_t pin = self->pin->pin;
152-
if (self->output) {
152+
digitalio_digitalinout_obj_t *self) {
153+
uint32_t pin = NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin);
154+
NRF_GPIO_Type *reg = nrf_gpio_pin_port_decode(&pin);
155+
156+
if (nrf_gpio_pin_dir_get(pin) == NRF_GPIO_PIN_DIR_OUTPUT) {
153157
mp_raise_AttributeError("Cannot get pull while in output mode");
154158
return PULL_NONE;
155-
} else {
156-
hal_gpio_pull_t pull = hal_gpio_pull_get(self->pin->port, pin);
159+
}
157160

158-
switch(pull)
159-
{
160-
case HAL_GPIO_PULL_UP:
161-
return PULL_UP;
161+
switch (reg->PIN_CNF[self->pin->pin] & GPIO_PIN_CNF_PULL_Msk) {
162+
case NRF_GPIO_PIN_PULLUP:
163+
return PULL_UP;
162164

163-
case HAL_GPIO_PULL_DOWN:
164-
return PULL_DOWN;
165+
case NRF_GPIO_PIN_PULLDOWN:
166+
return PULL_DOWN;
165167

166-
default: return PULL_NONE;
167-
}
168+
default:
169+
return PULL_NONE;
168170
}
169171
}

ports/nrf/common-hal/digitalio/DigitalInOut.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,10 @@
2828
#define MICROPY_INCLUDED_NRF_COMMON_HAL_DIGITALIO_DIGITALINOUT_H
2929

3030
#include "common-hal/microcontroller/Pin.h"
31-
#include "py/obj.h"
3231

3332
typedef struct {
3433
mp_obj_base_t base;
35-
const mcu_pin_obj_t * pin;
36-
bool output;
34+
const mcu_pin_obj_t *pin;
3735
bool open_drain;
3836
} digitalio_digitalinout_obj_t;
3937

ports/nrf/common-hal/microcontroller/Pin.c

Lines changed: 5 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -25,51 +25,15 @@
2525
*/
2626

2727
#include "common-hal/microcontroller/Pin.h"
28-
#include "shared-bindings/microcontroller/Pin.h"
29-
28+
#include "nrf_gpio.h"
3029
#include "py/mphal.h"
3130

32-
#if 0
33-
34-
extern volatile bool adc_in_use;
35-
36-
bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin) {
37-
if (pin == &pin_TOUT) {
38-
return !adc_in_use;
39-
}
40-
if (pin->gpio_number == NO_GPIO || pin->gpio_number == SPECIAL_CASE) {
41-
return false;
42-
}
43-
return (READ_PERI_REG(pin->peripheral) &
44-
(PERIPHS_IO_MUX_FUNC<<PERIPHS_IO_MUX_FUNC_S)) == 0 &&
45-
(GPIO_REG_READ(GPIO_ENABLE_ADDRESS) & (1 << pin->gpio_number)) == 0 &&
46-
(READ_PERI_REG(pin->peripheral) & PERIPHS_IO_MUX_PULLUP) == 0;
47-
}
48-
49-
void reset_pins(void) {
50-
for (int i = 0; i < 17; i++) {
51-
// 5 is RXD, 6 is TXD
52-
if ((i > 4 && i < 13) || i == 12) {
53-
continue;
54-
}
55-
uint32_t peripheral = PERIPHS_IO_MUX + i * 4;
56-
PIN_FUNC_SELECT(peripheral, 0);
57-
PIN_PULLUP_DIS(peripheral);
58-
// Disable the pin.
59-
gpio_output_set(0x0, 0x0, 0x0, 1 << i);
60-
}
61-
}
62-
#endif
63-
64-
bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t* pin) {
65-
return true;
31+
bool common_hal_mcu_pin_is_free(const mcu_pin_obj_t *pin) {
32+
return true;
6633
}
6734

6835
void reset_all_pins(void) {
36+
for (uint32_t pin = 0; pin < NUMBER_OF_PINS; ++pin)
37+
nrf_gpio_cfg_default(pin);
6938
}
7039

71-
void reset_pin(uint8_t pin) {
72-
73-
}
74-
75-

ports/nrf/common-hal/microcontroller/Pin.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,5 @@
3232

3333
#define mcu_pin_obj_t pin_obj_t
3434
void reset_all_pins(void);
35-
void reset_pin(uint8_t pin);
3635

3736
#endif // MICROPY_INCLUDED_NRF_COMMON_HAL_MICROCONTROLLER_PIN_H

ports/nrf/common-hal/pulseio/PWMOut.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#include "py/runtime.h"
3232
#include "common-hal/pulseio/PWMOut.h"
33+
#include "nrf_gpio.h"
3334
#include "shared-bindings/pulseio/PWMOut.h"
3435

3536
#define PWM_MAX_MODULE 3
@@ -161,7 +162,7 @@ void common_hal_pulseio_pwmout_construct(pulseio_pwmout_obj_t* self,
161162

162163
if (self->pwm)
163164
{
164-
hal_gpio_cfg_pin(pin->port, pin->pin, HAL_GPIO_MODE_OUTPUT, HAL_GPIO_PULL_DISABLED);
165+
nrf_gpio_cfg_output(NRF_GPIO_PIN_MAP(pin->port, pin->pin));
165166

166167
// disable before mapping pin channel
167168
self->pwm->ENABLE = 0;
@@ -201,7 +202,7 @@ void common_hal_pulseio_pwmout_deinit(pulseio_pwmout_obj_t* self) {
201202
}
202203
}
203204

204-
hal_gpio_cfg_pin(self->pin->port, self->pin->pin, HAL_GPIO_MODE_INPUT, HAL_GPIO_PULL_DISABLED);
205+
nrf_gpio_cfg_default(NRF_GPIO_PIN_MAP(self->pin->port, self->pin->pin));
205206

206207
self->pwm = NULL;
207208
self->pin = mp_const_none;

0 commit comments

Comments
 (0)