summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorrobert-hh <robert@hammelrath.com>2021-05-25 14:49:21 +0200
committerrobert-hh <robert@hammelrath.com>2021-05-25 20:43:52 +0200
commitc732b80f0584156b6ff98e8baa90c011539bf88a (patch)
treec3a6eb102dedba644955549b517b293dffff3946
parent5f68f0d08ab1effd0fae8a00bdda46dbc788d9db (diff)
downloadmicropython-c732b80f0584156b6ff98e8baa90c011539bf88a.tar.gz
micropython-c732b80f0584156b6ff98e8baa90c011539bf88a.zip
mimxrt: Extend the Pin module for SoftI2C, SoftSPI support.
This change consists mostly of changing and extending the required definitions in mphalport.h.
-rw-r--r--ports/mimxrt/machine_pin.c14
-rw-r--r--ports/mimxrt/mphalport.h14
-rw-r--r--ports/mimxrt/pin.h1
3 files changed, 28 insertions, 1 deletions
diff --git a/ports/mimxrt/machine_pin.c b/ports/mimxrt/machine_pin.c
index 583ee4a265..f63778cbe5 100644
--- a/ports/mimxrt/machine_pin.c
+++ b/ports/mimxrt/machine_pin.c
@@ -68,6 +68,20 @@ const mp_obj_type_t machine_pin_board_pins_obj_type = {
.locals_dict = (mp_obj_t)&machine_pin_board_pins_locals_dict,
};
+// Simplified mode setting used by the extmod modules
+void machine_pin_set_mode(const machine_pin_obj_t *self, uint8_t mode) {
+ gpio_pin_config_t pin_config = {kGPIO_DigitalInput, 1, kGPIO_NoIntmode};
+
+ pin_config.direction = (mode == PIN_MODE_IN ? kGPIO_DigitalInput : kGPIO_DigitalOutput);
+ GPIO_PinInit(self->gpio, self->pin, &pin_config);
+ if (mode == PIN_MODE_OPEN_DRAIN) {
+ uint32_t pad_config = *(uint32_t *)self->configRegister;
+ pad_config |= IOMUXC_SW_PAD_CTL_PAD_ODE(0b1) | IOMUXC_SW_PAD_CTL_PAD_DSE(0b110);
+ IOMUXC_SetPinMux(self->muxRegister, PIN_AF_MODE_ALT5, 0, 0, self->configRegister, 1U); // Software Input On Field: Input Path is determined by functionality
+ IOMUXC_SetPinConfig(self->muxRegister, PIN_AF_MODE_ALT5, 0, 0, self->configRegister, pad_config);
+ }
+}
+
STATIC mp_obj_t machine_pin_obj_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
mp_arg_check_num(n_args, n_kw, 0, 1, false);
machine_pin_obj_t *self = self_in;
diff --git a/ports/mimxrt/mphalport.h b/ports/mimxrt/mphalport.h
index a6a28ab4a5..78b390b4eb 100644
--- a/ports/mimxrt/mphalport.h
+++ b/ports/mimxrt/mphalport.h
@@ -31,12 +31,22 @@
#include "ticks.h"
#include "pin.h"
+#define MP_HAL_PIN_FMT "%q"
+
#define mp_hal_pin_obj_t const machine_pin_obj_t *
+#define mp_hal_get_pin_obj(o) pin_find(o)
+#define mp_hal_pin_name(p) ((p)->name)
+#define mp_hal_pin_input(p) machine_pin_set_mode(p, PIN_MODE_IN);
+#define mp_hal_pin_output(p) machine_pin_set_mode(p, PIN_MODE_OUT);
+#define mp_hal_pin_open_drain(p) machine_pin_set_mode(p, PIN_MODE_OPEN_DRAIN);
#define mp_hal_pin_high(p) (GPIO_PinWrite(p->gpio, p->pin, 1U))
#define mp_hal_pin_low(p) (GPIO_PinWrite(p->gpio, p->pin, 0U))
#define mp_hal_pin_write(p, value) (GPIO_PinWrite(p->gpio, p->pin, value))
#define mp_hal_pin_toggle(p) (GPIO_PortToggle(p->gpio, (1 << p->pin)))
-#define mp_hal_pin_read(p) (GPIO_PinRead(p->gpio, p->pin))
+#define mp_hal_pin_read(p) (GPIO_PinReadPadStatus(p->gpio, p->pin))
+
+#define mp_hal_pin_od_low(p) mp_hal_pin_low(p)
+#define mp_hal_pin_od_high(p) mp_hal_pin_high(p)
void mp_hal_set_interrupt_char(int c);
@@ -57,6 +67,8 @@ static inline void mp_hal_delay_us(mp_uint_t us) {
ticks_delay_us64(us);
}
+#define mp_hal_delay_us_fast(us) mp_hal_delay_us(us)
+
static inline mp_uint_t mp_hal_ticks_cpu(void) {
return 0;
}
diff --git a/ports/mimxrt/pin.h b/ports/mimxrt/pin.h
index 268b505b38..6afedd1f59 100644
--- a/ports/mimxrt/pin.h
+++ b/ports/mimxrt/pin.h
@@ -140,5 +140,6 @@ const machine_pin_obj_t *pin_find_named_pin(const mp_obj_dict_t *named_pins, mp_
const machine_pin_af_obj_t *pin_find_af(const machine_pin_obj_t *pin, uint8_t fn);
const machine_pin_af_obj_t *pin_find_af_by_index(const machine_pin_obj_t *pin, mp_uint_t af_idx);
const machine_pin_af_obj_t *pin_find_af_by_name(const machine_pin_obj_t *pin, const char *name);
+void machine_pin_set_mode(const machine_pin_obj_t *pin, uint8_t mode);
#endif // MICROPY_INCLUDED_MIMXRT_PIN_H