summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Ebensberger <philipp.ebensberger@3bricks-software.de>2020-04-12 22:00:06 +0200
committerDamien George <damien.p.george@gmail.com>2020-06-05 11:47:48 +1000
commit02cc4462b70729a42cb127c840fee891dd08a0d4 (patch)
tree9e513737b654a71aa04b4ea0ed83bbfd7ebbe295
parente54626f4c1b5cb4de0b5dc86d820bb36c1d6499f (diff)
mimxrt: Add initial impl of machine.LED class, and basic pin support.
This commit implements an LED class with rudimentary parts of a pin C API to support it. The LED class does not yet support setting an intensity. This LED class is put in the machine module for the time being, until a better place is found. One LED is supported on TEENSY40 and MIMXRT1010_EVK boards.
-rw-r--r--ports/mimxrt/Makefile11
-rw-r--r--ports/mimxrt/board_init.c14
-rw-r--r--ports/mimxrt/boards/MIMXRT1010_EVK/mpconfigboard.h7
-rw-r--r--ports/mimxrt/boards/MIMXRT1010_EVK/pins.c33
-rw-r--r--ports/mimxrt/boards/MIMXRT1010_EVK/pins.h30
-rw-r--r--ports/mimxrt/boards/TEENSY40/mpconfigboard.h7
-rw-r--r--ports/mimxrt/boards/TEENSY40/pins.c33
-rw-r--r--ports/mimxrt/boards/TEENSY40/pins.h30
-rw-r--r--ports/mimxrt/led.c102
-rw-r--r--ports/mimxrt/led.h56
-rw-r--r--ports/mimxrt/machine_led.c91
-rw-r--r--ports/mimxrt/main.c2
-rw-r--r--ports/mimxrt/modmachine.c4
-rw-r--r--ports/mimxrt/mphalport.h4
-rw-r--r--ports/mimxrt/pin.c37
-rw-r--r--ports/mimxrt/pin.h100
16 files changed, 540 insertions, 21 deletions
diff --git a/ports/mimxrt/Makefile b/ports/mimxrt/Makefile
index cbd2b8595..c4ea70128 100644
--- a/ports/mimxrt/Makefile
+++ b/ports/mimxrt/Makefile
@@ -88,9 +88,13 @@ SRC_TINYUSB_IMX_C += \
SRC_C = \
main.c \
+ led.c \
+ pin.c \
tusb_port.c \
board_init.c \
$(BOARD_DIR)/flash_config.c \
+ $(BOARD_DIR)/pins.c \
+ machine_led.c \
modutime.c \
modmachine.c \
mphalport.c \
@@ -108,7 +112,12 @@ SRC_SS = $(MCU_DIR)/gcc/startup_$(MCU_SERIES).S
SRC_S = lib/utils/gchelper_m3.s \
# List of sources for qstr extraction
-SRC_QSTR += modutime.c modmachine.c
+SRC_QSTR += \
+ machine_led.c \
+ modutime.c \
+ modmachine.c \
+ pin.c \
+ $(BOARD_DIR)/pins.c \
OBJ += $(PY_O)
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
diff --git a/ports/mimxrt/board_init.c b/ports/mimxrt/board_init.c
index a3c27b045..6f5235d3b 100644
--- a/ports/mimxrt/board_init.c
+++ b/ports/mimxrt/board_init.c
@@ -45,8 +45,6 @@ volatile uint32_t systick_ms = 0;
const uint8_t dcd_data[] = { 0x00 };
-void board_led_write(bool state);
-
void board_init(void) {
// Init clock
BOARD_BootClockRUN();
@@ -58,14 +56,6 @@ void board_init(void) {
// 1ms tick timer
SysTick_Config(SystemCoreClock / 1000);
- // LED
- IOMUXC_SetPinMux(MICROPY_HW_LED_PINMUX, 0U);
- IOMUXC_SetPinConfig(MICROPY_HW_LED_PINMUX, 0x10B0U);
-
- gpio_pin_config_t led_config = { kGPIO_DigitalOutput, 0, kGPIO_NoIntmode };
- GPIO_PinInit(MICROPY_HW_LED_PORT, MICROPY_HW_LED_PIN, &led_config);
- board_led_write(true);
-
// ------------- USB0 ------------- //
// Clock
@@ -95,10 +85,6 @@ void board_init(void) {
// CLOCK_EnableUsbhs1Clock(kCLOCK_Usb480M, 480000000U);
}
-void board_led_write(bool state) {
- GPIO_PinWrite(MICROPY_HW_LED_PORT, MICROPY_HW_LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));
-}
-
void SysTick_Handler(void) {
systick_ms++;
}
diff --git a/ports/mimxrt/boards/MIMXRT1010_EVK/mpconfigboard.h b/ports/mimxrt/boards/MIMXRT1010_EVK/mpconfigboard.h
index 02d34fc42..eeddd0e02 100644
--- a/ports/mimxrt/boards/MIMXRT1010_EVK/mpconfigboard.h
+++ b/ports/mimxrt/boards/MIMXRT1010_EVK/mpconfigboard.h
@@ -3,6 +3,7 @@
#define BOARD_FLASH_SIZE (16 * 1024 * 1024)
-#define MICROPY_HW_LED_PINMUX IOMUXC_GPIO_11_GPIOMUX_IO11
-#define MICROPY_HW_LED_PORT GPIO1
-#define MICROPY_HW_LED_PIN 11
+// i.MX RT1010 EVK has 1 board LED
+#define MICROPY_HW_LED1_PIN (GPIO_11)
+#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
+#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
diff --git a/ports/mimxrt/boards/MIMXRT1010_EVK/pins.c b/ports/mimxrt/boards/MIMXRT1010_EVK/pins.c
new file mode 100644
index 000000000..e0397e09e
--- /dev/null
+++ b/ports/mimxrt/boards/MIMXRT1010_EVK/pins.c
@@ -0,0 +1,33 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Philipp Ebensberger
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "pin.h"
+
+static pin_af_obj_t GPIO_11_af[] = {
+ PIN_AF(GPIOMUX_IO11, PIN_AF_MODE_ALT5, GPIO1, 0x10B0U),
+};
+
+pin_obj_t GPIO_11 = PIN(GPIO_11, GPIO1, 5, GPIO_11_af);
diff --git a/ports/mimxrt/boards/MIMXRT1010_EVK/pins.h b/ports/mimxrt/boards/MIMXRT1010_EVK/pins.h
new file mode 100644
index 000000000..99534932a
--- /dev/null
+++ b/ports/mimxrt/boards/MIMXRT1010_EVK/pins.h
@@ -0,0 +1,30 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Philipp Ebensberger
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+// NOTE: pins.h shall only be included in in pin.h
+// hence no include guards are needed since they will be provided by pin.h
+
+extern pin_obj_t GPIO_11;
diff --git a/ports/mimxrt/boards/TEENSY40/mpconfigboard.h b/ports/mimxrt/boards/TEENSY40/mpconfigboard.h
index 10c8b7a6d..7d5647857 100644
--- a/ports/mimxrt/boards/TEENSY40/mpconfigboard.h
+++ b/ports/mimxrt/boards/TEENSY40/mpconfigboard.h
@@ -3,6 +3,7 @@
#define BOARD_FLASH_SIZE (2 * 1024 * 1024)
-#define MICROPY_HW_LED_PINMUX IOMUXC_GPIO_B0_03_GPIO2_IO03 // D13
-#define MICROPY_HW_LED_PORT GPIO2
-#define MICROPY_HW_LED_PIN 3
+// Teensy 4.0 has 1 board LED
+#define MICROPY_HW_LED1_PIN (GPIO_B0_03)
+#define MICROPY_HW_LED_ON(pin) (mp_hal_pin_high(pin))
+#define MICROPY_HW_LED_OFF(pin) (mp_hal_pin_low(pin))
diff --git a/ports/mimxrt/boards/TEENSY40/pins.c b/ports/mimxrt/boards/TEENSY40/pins.c
new file mode 100644
index 000000000..c7bfc102d
--- /dev/null
+++ b/ports/mimxrt/boards/TEENSY40/pins.c
@@ -0,0 +1,33 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Philipp Ebensberger
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "pin.h"
+
+static pin_af_obj_t GPIO_B0_03_af[] = {
+ PIN_AF(GPIO2_IO03, PIN_AF_MODE_ALT5, GPIO2, 0x10B0U),
+};
+
+pin_obj_t GPIO_B0_03 = PIN(GPIO_B0_03, GPIO2, 3, GPIO_B0_03_af);
diff --git a/ports/mimxrt/boards/TEENSY40/pins.h b/ports/mimxrt/boards/TEENSY40/pins.h
new file mode 100644
index 000000000..c0b6dcdfa
--- /dev/null
+++ b/ports/mimxrt/boards/TEENSY40/pins.h
@@ -0,0 +1,30 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Philipp Ebensberger
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+// NOTE: pins.h shall only be included in in pin.h
+// hence no include guards are needed since they will be provided by pin.h
+
+extern pin_obj_t GPIO_B0_03;
diff --git a/ports/mimxrt/led.c b/ports/mimxrt/led.c
new file mode 100644
index 000000000..bec97dd8f
--- /dev/null
+++ b/ports/mimxrt/led.c
@@ -0,0 +1,102 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Philipp Ebensberger
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "fsl_gpio.h"
+#include "fsl_iomuxc.h"
+
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "led.h"
+
+#if NUM_LEDS
+
+const machine_led_obj_t machine_led_obj[NUM_LEDS] = {
+ {
+ .base = {&machine_led_type},
+ .led_id = 1U,
+ .led_pin = &MICROPY_HW_LED1_PIN,
+ }
+};
+
+void led_init(void) {
+ // Turn off LEDs and initialize
+ for (mp_int_t led = 0; led < NUM_LEDS; led++) {
+ const pin_obj_t *led_pin = machine_led_obj[led].led_pin;
+
+ gpio_pin_config_t pin_config = {
+ .outputLogic = 1U,
+ .direction = kGPIO_DigitalOutput,
+ .interruptMode = kGPIO_NoIntmode,
+ };
+
+ GPIO_PinInit(led_pin->gpio, led_pin->pin, &pin_config);
+
+ // ALT mode for GPIO is always 5
+ IOMUXC_SetPinMux(led_pin->muxRegister, 5U, 0, 0, led_pin->configRegister,
+ 1U); // Software Input On Field: Input Path is determined by functionality
+ IOMUXC_SetPinConfig(led_pin->muxRegister, 5U, 0, 0, led_pin->configRegister, 0x10B0U);
+ MICROPY_HW_LED_OFF(led_pin);
+ }
+}
+
+void led_state(machine_led_t led, int state) {
+ if (led < 1 || led > NUM_LEDS) {
+ return;
+ }
+
+ const pin_obj_t *led_pin = machine_led_obj[led - 1].led_pin;
+
+ if (state == 0) {
+ // turn LED off
+ MICROPY_HW_LED_OFF(led_pin);
+ } else {
+ // turn LED on
+ MICROPY_HW_LED_ON(led_pin);
+ }
+}
+
+void led_toggle(machine_led_t led) {
+ if (led < 1 || led > NUM_LEDS) {
+ return;
+ }
+
+ const pin_obj_t *led_pin = machine_led_obj[led - 1].led_pin;
+ mp_hal_pin_toggle(led_pin);
+}
+
+void led_debug(int value, int delay) {
+ for (mp_int_t i = 0; i < NUM_LEDS; i++) {
+ led_state(i + 1, (value & (1 << i)));
+ }
+ mp_hal_delay_ms(delay);
+}
+
+#else
+
+void led_init(void) {
+}
+
+#endif
diff --git a/ports/mimxrt/led.h b/ports/mimxrt/led.h
new file mode 100644
index 000000000..35418321d
--- /dev/null
+++ b/ports/mimxrt/led.h
@@ -0,0 +1,56 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Philipp Ebensberger
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MICROPY_INCLUDED_MIMXRT_LED_H
+#define MICROPY_INCLUDED_MIMXRT_LED_H
+
+#include "pin.h"
+
+#if defined(MICROPY_HW_LED1_PIN)
+#define NUM_LEDS (1)
+#else
+#define NUM_LEDS (0)
+#endif
+
+typedef enum {
+ MACHINE_BOARD_LED = 1,
+} machine_led_t;
+
+typedef struct _machine_led_obj_t {
+ mp_obj_base_t base;
+ mp_uint_t led_id;
+ const pin_obj_t *led_pin;
+} machine_led_obj_t;
+
+void led_init(void);
+void led_state(machine_led_t led, int state);
+void led_toggle(machine_led_t led);
+void led_debug(int value, int delay);
+
+extern const mp_obj_type_t machine_led_type;
+extern const machine_led_obj_t machine_led_obj[NUM_LEDS];
+
+#endif // MICROPY_INCLUDED_MIMXRT_LED_H
diff --git a/ports/mimxrt/machine_led.c b/ports/mimxrt/machine_led.c
new file mode 100644
index 000000000..07c7b180a
--- /dev/null
+++ b/ports/mimxrt/machine_led.c
@@ -0,0 +1,91 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Philipp Ebensberger
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "py/runtime.h"
+#include "py/mphal.h"
+#include "led.h"
+
+#if NUM_LEDS
+
+STATIC void led_obj_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
+ (void)kind;
+ machine_led_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_printf(print, "LED(%u)", self->led_id);
+}
+
+STATIC mp_obj_t led_obj_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, 1, false);
+
+ // Extract arguments
+ mp_int_t led_id = mp_obj_get_int(args[0]);
+
+ // Check led id is in range
+ if (!(1 <= led_id && led_id <= NUM_LEDS)) {
+ nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "LED(%d) doesn't exist", led_id));
+ }
+
+ // Return reference to static object
+ return MP_OBJ_FROM_PTR(&machine_led_obj[led_id - 1]);
+}
+
+STATIC mp_obj_t led_obj_on(mp_obj_t self_in) {
+ machine_led_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ MICROPY_HW_LED_ON(self->led_pin);
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_on_obj, led_obj_on);
+
+STATIC mp_obj_t led_obj_off(mp_obj_t self_in) {
+ machine_led_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ MICROPY_HW_LED_OFF(self->led_pin);
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_off_obj, led_obj_off);
+
+STATIC mp_obj_t led_obj_toggle(mp_obj_t self_in) {
+ machine_led_obj_t *self = MP_OBJ_TO_PTR(self_in);
+ mp_hal_pin_toggle(self->led_pin);
+ return mp_const_none;
+}
+STATIC MP_DEFINE_CONST_FUN_OBJ_1(led_obj_toggle_obj, led_obj_toggle);
+
+STATIC const mp_rom_map_elem_t led_locals_dict_table[] = {
+ {MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&led_obj_on_obj)},
+ {MP_ROM_QSTR(MP_QSTR_off), MP_ROM_PTR(&led_obj_off_obj)},
+ {MP_ROM_QSTR(MP_QSTR_toggle), MP_ROM_PTR(&led_obj_toggle_obj)},
+};
+
+STATIC MP_DEFINE_CONST_DICT(led_locals_dict, led_locals_dict_table);
+
+const mp_obj_type_t machine_led_type = {
+ {&mp_type_type},
+ .name = MP_QSTR_LED,
+ .print = led_obj_print,
+ .make_new = led_obj_make_new,
+ .locals_dict = (mp_obj_dict_t *)&led_locals_dict,
+};
+
+#endif
diff --git a/ports/mimxrt/main.c b/ports/mimxrt/main.c
index d94bf2441..e06283a8a 100644
--- a/ports/mimxrt/main.c
+++ b/ports/mimxrt/main.c
@@ -33,6 +33,7 @@
#include "lib/utils/gchelper.h"
#include "lib/utils/pyexec.h"
#include "tusb.h"
+#include "led.h"
extern uint8_t _sstack, _estack, _gc_heap_start, _gc_heap_end;
@@ -41,6 +42,7 @@ void board_init(void);
int main(void) {
board_init();
tusb_init();
+ led_init();
mp_stack_set_top(&_estack);
mp_stack_set_limit(&_estack - &_sstack - 1024);
diff --git a/ports/mimxrt/modmachine.c b/ports/mimxrt/modmachine.c
index 747b7bc27..a6aab7b4a 100644
--- a/ports/mimxrt/modmachine.c
+++ b/ports/mimxrt/modmachine.c
@@ -27,6 +27,7 @@
#include "py/runtime.h"
#include "extmod/machine_mem.h"
+#include "led.h"
#include CPU_HEADER_H
@@ -48,6 +49,9 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_mem8), MP_ROM_PTR(&machine_mem8_obj) },
{ MP_ROM_QSTR(MP_QSTR_mem16), MP_ROM_PTR(&machine_mem16_obj) },
{ MP_ROM_QSTR(MP_QSTR_mem32), MP_ROM_PTR(&machine_mem32_obj) },
+ #if NUM_LEDS
+ { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&machine_led_type) },
+ #endif
};
STATIC MP_DEFINE_CONST_DICT(machine_module_globals, machine_module_globals_table);
diff --git a/ports/mimxrt/mphalport.h b/ports/mimxrt/mphalport.h
index e1cf84f6c..2b9e49432 100644
--- a/ports/mimxrt/mphalport.h
+++ b/ports/mimxrt/mphalport.h
@@ -29,6 +29,10 @@
#include <stdint.h>
+#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_toggle(p) (GPIO_PortToggle(p->gpio, (1 << p->pin)))
+
extern volatile uint32_t systick_ms;
void mp_hal_set_interrupt_char(int c);
diff --git a/ports/mimxrt/pin.c b/ports/mimxrt/pin.c
new file mode 100644
index 000000000..b30f4be41
--- /dev/null
+++ b/ports/mimxrt/pin.c
@@ -0,0 +1,37 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Philipp Ebensberger
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "pin.h"
+
+const mp_obj_type_t pin_type = {
+ .base = {&mp_type_type},
+ .name = MP_QSTR_Pin,
+};
+
+const mp_obj_type_t pin_af_type = {
+ {&mp_type_type},
+ .name = MP_QSTR_PinAF,
+};
diff --git a/ports/mimxrt/pin.h b/ports/mimxrt/pin.h
new file mode 100644
index 000000000..cfb1e6b57
--- /dev/null
+++ b/ports/mimxrt/pin.h
@@ -0,0 +1,100 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2020 Philipp Ebensberger
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MICROPY_INCLUDED_MIMXRT_PIN_H
+#define MICROPY_INCLUDED_MIMXRT_PIN_H
+
+#include "fsl_gpio.h"
+#include "py/obj.h"
+
+enum {
+ PIN_MODE_IN = 0,
+ PIN_MODE_OUT,
+ PIN_MODE_ALT,
+};
+
+enum {
+ PIN_AF_MODE_ALT1 = 1,
+ PIN_AF_MODE_ALT2,
+ PIN_AF_MODE_ALT3,
+ PIN_AF_MODE_ALT4,
+ PIN_AF_MODE_ALT5,
+ PIN_AF_MODE_ALT6,
+ PIN_AF_MODE_ALT7,
+ PIN_AF_MODE_ALT8,
+};
+
+typedef struct {
+ mp_obj_base_t base;
+ qstr name; // port name
+ uint32_t af_mode; // alternate function
+ void *instance; // pointer to peripheral instance for alternate function
+ uint32_t pad_config; // pad configuration for alternate function
+} pin_af_obj_t;
+
+typedef struct {
+ mp_obj_base_t base;
+ qstr name; // pad name
+ GPIO_Type *gpio; // gpio instance for pin
+ uint32_t pin; // pin number
+ uint32_t muxRegister;
+ uint32_t configRegister;
+ uint32_t mode; // current pin mode
+ uint32_t af_mode; // current alternate function mode
+ size_t af_list_len; // length of available alternate functions list
+ const pin_af_obj_t *af_list; // pointer tolist with alternate functions
+} pin_obj_t;
+
+extern const mp_obj_type_t pin_type;
+extern const mp_obj_type_t pin_af_type;
+
+#define PIN_AF(_name, _af_mode, _instance, _pad_config) \
+ { \
+ .base = { &pin_af_type }, \
+ .name = MP_QSTR_##_name, \
+ .af_mode = (uint32_t)(_af_mode), \
+ .instance = (void *)(_instance), \
+ .pad_config = (uint32_t)(_pad_config), \
+ } \
+
+#define PIN(_name, _gpio, _pin, _af_list) \
+ { \
+ .base = { &pin_type }, \
+ .name = MP_QSTR_##_name, \
+ .gpio = (_gpio), \
+ .pin = (uint32_t)(_pin), \
+ .muxRegister = (uint32_t)&(IOMUXC->SW_MUX_CTL_PAD[kIOMUXC_SW_MUX_CTL_PAD_##_name]), \
+ .configRegister = (uint32_t)&(IOMUXC->SW_PAD_CTL_PAD[kIOMUXC_SW_PAD_CTL_PAD_##_name]), \
+ .mode = PIN_MODE_IN, \
+ .af_mode = PIN_AF_MODE_ALT5, \
+ .af_list_len = (size_t)(sizeof((_af_list)) / sizeof(pin_af_obj_t)), \
+ .af_list = (_af_list), \
+ } \
+
+// Include board specific pins
+#include "pins.h"
+
+#endif // MICROPY_INCLUDED_MIMXRT_PIN_H