diff --git a/ports/mimxrt/Makefile b/ports/mimxrt/Makefile index 141bc2c49b..de7b9fd3ee 100644 --- a/ports/mimxrt/Makefile +++ b/ports/mimxrt/Makefile @@ -152,6 +152,8 @@ SRC_C = \ lib/utils/pyexec.c \ lib/utils/stdout_helpers.c \ lib/utils/sys_stdio_mphal.c \ + drivers/bus/softspi.c \ + extmod/modonewire.c \ $(SRC_TINYUSB_C) \ $(SRC_TINYUSB_IMX_C) \ @@ -265,6 +267,7 @@ SRC_QSTR += \ moduos.c \ pin.c \ lib/utils/sys_stdio_mphal.c \ + extmod/modonewire.c \ $(GEN_PINS_SRC) \ OBJ += $(PY_O) diff --git a/ports/mimxrt/boards/manifest.py b/ports/mimxrt/boards/manifest.py index c80309cf67..9df589f126 100644 --- a/ports/mimxrt/boards/manifest.py +++ b/ports/mimxrt/boards/manifest.py @@ -1 +1,3 @@ freeze("$(PORT_DIR)/modules") +freeze("$(MPY_DIR)/drivers/onewire") +include("$(MPY_DIR)/extmod/uasyncio/manifest.py") diff --git a/ports/mimxrt/hal/flexspi_nor_flash.h b/ports/mimxrt/hal/flexspi_nor_flash.h index 43cd7efdc7..a9a9bbe700 100644 --- a/ports/mimxrt/hal/flexspi_nor_flash.h +++ b/ports/mimxrt/hal/flexspi_nor_flash.h @@ -27,7 +27,7 @@ #define MICROPY_INCLUDED_MIMXRT_HAL_FLEXSPI_NOR_FLASH_H #include "fsl_flexspi.h" -#include "mpconfigport.h" +#include "mpconfigboard.h" #include BOARD_FLASH_CONFIG_HEADER_H // Defined in boards flash_config.c diff --git a/ports/mimxrt/machine_pin.c b/ports/mimxrt/machine_pin.c index f63778cbe5..ebe95059bf 100644 --- a/ports/mimxrt/machine_pin.c +++ b/ports/mimxrt/machine_pin.c @@ -39,7 +39,7 @@ STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_ // Class Methods STATIC void machine_pin_obj_print(const mp_print_t *print, mp_obj_t o, mp_print_kind_t kind); 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); -STATIC mp_obj_t machine_pin_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args); +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); // Instance Methods STATIC mp_obj_t machine_pin_off(mp_obj_t self_in); @@ -191,7 +191,7 @@ STATIC void machine_pin_obj_print(const mp_print_t *print, mp_obj_t o, mp_print_ } // pin(id, mode, pull, ...) -STATIC mp_obj_t machine_pin_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) { +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); const machine_pin_obj_t *pin = pin_find(args[0]); @@ -273,7 +273,7 @@ const mp_obj_type_t machine_pin_type = { .name = MP_QSTR_Pin, .print = machine_pin_obj_print, .call = machine_pin_obj_call, - .make_new = machine_pin_obj_make_new, + .make_new = mp_pin_make_new, .locals_dict = (mp_obj_dict_t *)&machine_pin_locals_dict, }; @@ -282,6 +282,6 @@ const mp_obj_type_t machine_pin_af_type = { {&mp_type_type}, .name = MP_QSTR_PinAF, .print = machine_pin_obj_print, - .make_new = machine_pin_obj_make_new, + .make_new = mp_pin_make_new, .locals_dict = (mp_obj_dict_t *)&machine_pin_locals_dict, }; diff --git a/ports/mimxrt/main.c b/ports/mimxrt/main.c index 76fd7ef76c..74c8a7014b 100644 --- a/ports/mimxrt/main.c +++ b/ports/mimxrt/main.c @@ -128,7 +128,7 @@ const char mimxrt_help_text[] = " machine.Pin(pin, m, [p]) -- get a pin and configure it for IO mode m, pull mode p\n" " methods: init(..), value([v]), high(), low())\n" "\n" - "Pin IO modes are: Pin.IN, Pin.OUT\n" + "Pin IO modes are: Pin.IN, Pin.OUT, Pin.OPEN_DRAIN\n" "Pin pull modes are: Pin.PULL_UP, Pin.PULL_UP_47K, Pin.PULL_UP_22K, Pin.PULL_DOWN, Pin.PULL_HOLD\n" "\n" "Useful control commands:\n" diff --git a/ports/mimxrt/modmachine.c b/ports/mimxrt/modmachine.c index ff4ca7cf9f..96cae3a828 100644 --- a/ports/mimxrt/modmachine.c +++ b/ports/mimxrt/modmachine.c @@ -27,9 +27,13 @@ #include "py/runtime.h" #include "extmod/machine_mem.h" +#include "extmod/machine_i2c.h" +#include "extmod/machine_signal.h" +#include "extmod/machine_spi.h" #include "led.h" #include "pin.h" #include "modmachine.h" +#include "fsl_clock.h" #include CPU_HEADER_H @@ -40,7 +44,7 @@ STATIC mp_obj_t machine_reset(void) { MP_DEFINE_CONST_FUN_OBJ_0(machine_reset_obj, machine_reset); STATIC mp_obj_t machine_freq(void) { - return MP_OBJ_NEW_SMALL_INT(0); + return MP_OBJ_NEW_SMALL_INT(CLOCK_GetFreq(kCLOCK_CpuClk)); } MP_DEFINE_CONST_FUN_OBJ_0(machine_freq_obj, machine_freq); @@ -57,6 +61,9 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_Pin), MP_ROM_PTR(&machine_pin_type) }, { MP_ROM_QSTR(MP_QSTR_Timer), MP_ROM_PTR(&machine_timer_type) }, { MP_ROM_QSTR(MP_QSTR_RTC), MP_ROM_PTR(&machine_rtc_type) }, + { MP_ROM_QSTR(MP_QSTR_Signal), MP_ROM_PTR(&machine_signal_type) }, + { MP_ROM_QSTR(MP_QSTR_SoftI2C), MP_ROM_PTR(&mp_machine_soft_i2c_type) }, + { MP_ROM_QSTR(MP_QSTR_SoftSPI), MP_ROM_PTR(&mp_machine_soft_spi_type) }, }; STATIC MP_DEFINE_CONST_DICT(machine_module_globals, machine_module_globals_table); diff --git a/ports/mimxrt/mpconfigport.h b/ports/mimxrt/mpconfigport.h index 98e01abe13..0af87264a5 100644 --- a/ports/mimxrt/mpconfigport.h +++ b/ports/mimxrt/mpconfigport.h @@ -28,6 +28,7 @@ // Board specific definitions #include "mpconfigboard.h" +#include "fsl_common.h" // Memory allocation policies #define MICROPY_GC_STACK_ENTRY_TYPE uint16_t @@ -35,6 +36,11 @@ #define MICROPY_ALLOC_PARSE_CHUNK_INIT (32) #define MICROPY_ALLOC_PATH_MAX (256) +// MicroPython emitters +#define MICROPY_PERSISTENT_CODE_LOAD (1) +#define MICROPY_EMIT_THUMB (1) +#define MICROPY_EMIT_INLINE_THUMB (1) + // Compiler configuration #define MICROPY_COMP_CONST (0) @@ -60,32 +66,64 @@ #define MICROPY_QSTR_EXTRA_POOL mp_qstr_frozen_const_pool // Control over Python builtins -#define MICROPY_PY_BUILTINS_STR_COUNT (0) +#define MICROPY_PY_FUNCTION_ATTRS (1) +#define MICROPY_PY_DESCRIPTORS (1) +#define MICROPY_PY_DELATTR_SETATTR (1) +#define MICROPY_PY_BUILTINS_STR_UNICODE (1) +#define MICROPY_PY_BUILTINS_STR_CENTER (1) +#define MICROPY_PY_BUILTINS_STR_PARTITION (1) +#define MICROPY_PY_BUILTINS_STR_SPLITLINES (1) #define MICROPY_PY_BUILTINS_MEMORYVIEW (1) -#define MICROPY_PY_BUILTINS_SET (1) -#define MICROPY_PY_BUILTINS_FROZENSET (0) -#define MICROPY_PY_BUILTINS_PROPERTY (0) -#define MICROPY_PY_BUILTINS_ENUMERATE (0) -#define MICROPY_PY_BUILTINS_FILTER (0) -#define MICROPY_PY_BUILTINS_REVERSED (1) -#define MICROPY_PY_BUILTINS_MIN_MAX (0) +#define MICROPY_PY_BUILTINS_SLICE_ATTRS (1) +#define MICROPY_PY_BUILTINS_SLICE_INDICES (1) +#define MICROPY_PY_BUILTINS_FROZENSET (1) +#define MICROPY_PY_BUILTINS_ROUND_INT (1) +#define MICROPY_PY_ALL_SPECIAL_METHODS (1) +#define MICROPY_PY_REVERSE_SPECIAL_METHODS (1) +#define MICROPY_PY_BUILTINS_COMPILE (1) +#define MICROPY_PY_BUILTINS_INPUT (1) +#define MICROPY_PY_BUILTINS_POW3 (1) #define MICROPY_PY_BUILTINS_HELP (1) #define MICROPY_PY_BUILTINS_HELP_MODULES (1) #define MICROPY_PY_BUILTINS_HELP_TEXT mimxrt_help_text -#define MICROPY_PY___FILE__ (0) #define MICROPY_PY_MICROPYTHON_MEM_INFO (1) #define MICROPY_PY_ARRAY_SLICE_ASSIGN (1) -#define MICROPY_PY_COLLECTIONS (0) +#define MICROPY_PY_COLLECTIONS_DEQUE (1) +#define MICROPY_PY_COLLECTIONS_ORDEREDDICT (1) +#define MICROPY_PY_MATH_SPECIAL_FUNCTIONS (1) +#define MICROPY_PY_MATH_FACTORIAL (1) +#define MICROPY_PY_MATH_ISCLOSE (1) +#define MICROPY_PY_CMATH (1) #define MICROPY_PY_IO_IOBASE (1) #define MICROPY_PY_IO_FILEIO (1) #define MICROPY_PY_SYS_MAXSIZE (1) #define MICROPY_PY_SYS_PLATFORM "mimxrt" #define MICROPY_PY_SYS_STDFILES (1) #define MICROPY_PY_SYS_STDIO_BUFFER (1) +#define MICROPY_PY_UERRNO (1) // Extended modules +#define MICROPY_EPOCH_IS_1970 (1) +#define MICROPY_PY_UASYNCIO (1) +#define MICROPY_PY_UCTYPES (1) +#define MICROPY_PY_UZLIB (1) +#define MICROPY_PY_UJSON (1) +#define MICROPY_PY_URE (1) +#define MICROPY_PY_URE_MATCH_GROUPS (1) +#define MICROPY_PY_URE_MATCH_SPAN_START_END (1) +#define MICROPY_PY_URE_SUB (1) +#define MICROPY_PY_UHASHLIB (1) +#define MICROPY_PY_UBINASCII (1) +#define MICROPY_PY_UBINASCII_CRC32 (1) #define MICROPY_PY_UTIME_MP_HAL (1) +#define MICROPY_PY_URANDOM (1) +#define MICROPY_PY_URANDOM_EXTRA_FUNCS (1) +#define MICROPY_PY_USELECT (1) #define MICROPY_PY_MACHINE (1) +#define MICROPY_PY_MACHINE_PIN_MAKE_NEW mp_pin_make_new +#define MICROPY_PY_MACHINE_I2C (1) +#define MICROPY_PY_MACHINE_SPI (1) +#define MICROPY_PY_FRAMEBUF (1) // Use VfsLfs2's types for fileio/textio #define mp_type_fileio mp_type_vfs_lfs2_fileio @@ -97,11 +135,24 @@ // Hooks to add builtins +__attribute__((always_inline)) static inline void enable_irq(uint32_t state) { + __set_PRIMASK(state); +} + +__attribute__((always_inline)) static inline uint32_t disable_irq(void) { + uint32_t state = __get_PRIMASK(); + return state; +} + +#define MICROPY_BEGIN_ATOMIC_SECTION() disable_irq() +#define MICROPY_END_ATOMIC_SECTION(state) enable_irq(state) + #define MICROPY_PORT_BUILTINS \ { MP_ROM_QSTR(MP_QSTR_open), MP_ROM_PTR(&mp_builtin_open_obj) }, extern const struct _mp_obj_module_t mp_module_machine; extern const struct _mp_obj_module_t mp_module_mimxrt; +extern const struct _mp_obj_module_t mp_module_onewire; extern const struct _mp_obj_module_t mp_module_uos; extern const struct _mp_obj_module_t mp_module_utime; @@ -110,6 +161,7 @@ extern const struct _mp_obj_module_t mp_module_utime; { MP_ROM_QSTR(MP_QSTR_mimxrt), (mp_obj_t)&mp_module_mimxrt }, \ { MP_ROM_QSTR(MP_QSTR_uos), MP_ROM_PTR(&mp_module_uos) }, \ { MP_ROM_QSTR(MP_QSTR_utime), MP_ROM_PTR(&mp_module_utime) }, \ + { MP_ROM_QSTR(MP_QSTR__onewire), MP_ROM_PTR(&mp_module_onewire) }, \ #define MICROPY_HW_PIT_NUM_CHANNELS 3 @@ -129,10 +181,17 @@ extern const struct _mp_obj_module_t mp_module_utime; #define MICROPY_MAKE_POINTER_CALLABLE(p) ((void *)((mp_uint_t)(p) | 1)) +#define MP_HAL_CLEAN_DCACHE(addr, size) \ + (SCB_CleanDCache_by_Addr((uint32_t *)((uint32_t)addr & ~0x1f), \ + ((uint32_t)((uint8_t *)addr + size + 0x1f) & ~0x1f) - ((uint32_t)addr & ~0x1f))) + #define MP_SSIZE_MAX (0x7fffffff) typedef int mp_int_t; // must be pointer size typedef unsigned mp_uint_t; // must be pointer size typedef long mp_off_t; +// Need an implementation of the log2 function which is not a macro. +#define MP_NEED_LOG2 (1) + // Need to provide a declaration/definition of alloca() #include diff --git a/ports/mimxrt/mphalport.h b/ports/mimxrt/mphalport.h index fd664346dd..0db11836f8 100644 --- a/ports/mimxrt/mphalport.h +++ b/ports/mimxrt/mphalport.h @@ -48,6 +48,9 @@ #define mp_hal_pin_od_low(p) mp_hal_pin_low(p) #define mp_hal_pin_od_high(p) mp_hal_pin_high(p) +#define mp_hal_quiet_timing_enter() MICROPY_BEGIN_ATOMIC_SECTION() +#define mp_hal_quiet_timing_exit(irq_state) MICROPY_END_ATOMIC_SECTION(irq_state) + void mp_hal_set_interrupt_char(int c); static inline mp_uint_t mp_hal_ticks_ms(void) {