summaryrefslogtreecommitdiffstatshomepage
path: root/ports/zephyr/machine_pin.c
diff options
context:
space:
mode:
Diffstat (limited to 'ports/zephyr/machine_pin.c')
-rw-r--r--ports/zephyr/machine_pin.c37
1 files changed, 25 insertions, 12 deletions
diff --git a/ports/zephyr/machine_pin.c b/ports/zephyr/machine_pin.c
index 2240196690..e0718588d6 100644
--- a/ports/zephyr/machine_pin.c
+++ b/ports/zephyr/machine_pin.c
@@ -36,6 +36,7 @@
#include "py/gc.h"
#include "py/mphal.h"
#include "extmod/modmachine.h"
+#include "extmod/virtpin.h"
#include "shared/runtime/mpirq.h"
#include "modmachine.h"
#include "zephyr_device.h"
@@ -115,6 +116,10 @@ static mp_obj_t machine_pin_obj_init_helper(machine_pin_obj_t *self, size_t n_ar
}
int ret = gpio_pin_configure(self->port, self->pin, mode | pull | init);
+ if (ret == -ENOTSUP && mode == (GPIO_OUTPUT | GPIO_INPUT)) {
+ // Some targets (eg frdm_k64f) don't support GPIO_OUTPUT|GPIO_INPUT, so try again with just GPIO_OUTPUT.
+ ret = gpio_pin_configure(self->port, self->pin, GPIO_OUTPUT | pull | init);
+ }
if (ret) {
mp_raise_ValueError(MP_ERROR_TEXT("invalid pin"));
}
@@ -126,19 +131,26 @@ static mp_obj_t machine_pin_obj_init_helper(machine_pin_obj_t *self, size_t n_ar
mp_obj_t mp_pin_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true);
- // get the wanted port
- if (!mp_obj_is_type(args[0], &mp_type_tuple)) {
+ machine_pin_obj_t *pin;
+ if (mp_obj_is_type(args[0], &machine_pin_type)) {
+ // Already a Pin object, reuse it.
+ pin = MP_OBJ_TO_PTR(args[0]);
+ } else if (mp_obj_is_type(args[0], &mp_type_tuple)) {
+ // Get the wanted (port, pin) values.
+ mp_obj_t *items;
+ mp_obj_get_array_fixed_n(args[0], 2, &items);
+ const struct device *wanted_port = zephyr_device_find(items[0]);
+ int wanted_pin = mp_obj_get_int(items[1]);
+
+ pin = m_new_obj(machine_pin_obj_t);
+ pin->base = machine_pin_obj_template;
+ pin->port = wanted_port;
+ pin->pin = wanted_pin;
+ pin->irq = NULL;
+ } else {
+ // Unknown Pin.
mp_raise_ValueError(MP_ERROR_TEXT("Pin id must be tuple of (\"GPIO_x\", pin#)"));
}
- mp_obj_t *items;
- mp_obj_get_array_fixed_n(args[0], 2, &items);
- const struct device *wanted_port = zephyr_device_find(items[0]);
- int wanted_pin = mp_obj_get_int(items[1]);
-
- machine_pin_obj_t *pin = m_new_obj(machine_pin_obj_t);
- pin->base = machine_pin_obj_template;
- pin->port = wanted_port;
- pin->pin = wanted_pin;
if (n_args > 1 || n_kw > 0) {
// pin mode given, so configure this GPIO
@@ -270,7 +282,8 @@ static const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
// class constants
{ MP_ROM_QSTR(MP_QSTR_IN), MP_ROM_INT(GPIO_INPUT) },
- { MP_ROM_QSTR(MP_QSTR_OUT), MP_ROM_INT(GPIO_OUTPUT) },
+ { MP_ROM_QSTR(MP_QSTR_OUT), MP_ROM_INT(GPIO_OUTPUT | GPIO_INPUT) },
+ { MP_ROM_QSTR(MP_QSTR_OPEN_DRAIN), MP_ROM_INT(GPIO_OUTPUT | GPIO_INPUT | GPIO_OPEN_DRAIN) },
{ MP_ROM_QSTR(MP_QSTR_PULL_UP), MP_ROM_INT(GPIO_PULL_UP) },
{ MP_ROM_QSTR(MP_QSTR_PULL_DOWN), MP_ROM_INT(GPIO_PULL_DOWN) },
{ MP_ROM_QSTR(MP_QSTR_IRQ_RISING), MP_ROM_INT(GPIO_INT_EDGE_RISING) },