diff --git a/nrf5/Makefile b/nrf5/Makefile index c72d089867..dcac81dcdd 100644 --- a/nrf5/Makefile +++ b/nrf5/Makefile @@ -37,7 +37,7 @@ endif # qstr definitions (must come before including py.mk) QSTR_DEFS = qstrdefsport.h $(BUILD)/pins_qstr.h -FROZEN_MPY_DIR = modules +FROZEN_DIR = modules # include py core make definitions include ../py/py.mk @@ -78,8 +78,6 @@ CFLAGS += $(INC) -Wall -Werror -ansi -std=gnu99 -nostdlib $(COPT) $(NRF_DEFINES) CFLAGS += -fno-strict-aliasing CFLAGS += -Iboards/$(BOARD) CFLAGS += -DNRF5_HAL_H='<$(MCU_VARIANT)_hal.h>' -CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool -CFLAGS += -DMICROPY_MODULE_FROZEN_MPY LDFLAGS = $(CFLAGS) LDFLAGS += -Xlinker -Map=$(@:.elf=.map) @@ -101,7 +99,6 @@ SRC_LIB = $(addprefix lib/,\ libc/string0.c \ mp-readline/readline.c \ utils/pyexec.c \ - utils/pyhelp.c \ timeutils/timeutils.c \ fatfs/ff.c \ fatfs/option/ccsbcs.c \ @@ -146,7 +143,6 @@ SRC_C += \ moduos.c \ fatfs_port.c \ builtin_open.c \ - lexerfatfs.c \ modusocket.c \ modnetwork.c \ timer.c \ @@ -187,8 +183,6 @@ OBJ += $(addprefix $(BUILD)/, $(SRC_LIB:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_HAL:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(DRIVERS_SRC_C:.c=.o)) OBJ += $(BUILD)/pins_gen.o -OBJ += $(BUILD)/$(BUILD)/frozen_mpy.o - $(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os $(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os @@ -256,16 +250,18 @@ GEN_PINS_QSTR = $(BUILD)/pins_qstr.h GEN_PINS_AF_CONST = $(HEADER_BUILD)/pins_af_const.h GEN_PINS_AF_PY = $(BUILD)/pins_af.py -# to build .mpy files from .py files -$(BUILD)/$(FROZEN_MPY_DIR)/%.mpy: $(FROZEN_MPY_DIR)/%.py - @$(ECHO) "MPY $<" - $(Q)$(MKDIR) -p $(dir $@) - $(Q)$(MPY_CROSS) -o $@ -s $(^:$(FROZEN_MPY_DIR)/%=%) $^ +ifneq ($(FROZEN_DIR),) +# To use frozen source modules, put your .py files in a subdirectory (eg scripts/) +# and then invoke make with FROZEN_DIR=scripts (be sure to build from scratch). +CFLAGS += -DMICROPY_MODULE_FROZEN_STR +endif -# to build frozen_mpy.c from all .mpy files -$(BUILD)/frozen_mpy.c: $(FROZEN_MPY_MPY_FILES) $(BUILD)/genhdr/qstrdefs.generated.h - @$(ECHO) "Creating $@" - $(Q)$(PYTHON) $(MPY_TOOL) -f -q $(BUILD)/genhdr/qstrdefs.preprocessed.h -mlongint-impl mpz $(FROZEN_MPY_MPY_FILES) > $@ +ifneq ($(FROZEN_MPY_DIR),) +# To use frozen bytecode, put your .py files in a subdirectory (eg frozen/) and +# then invoke make with FROZEN_MPY_DIR=frozen (be sure to build from scratch). +CFLAGS += -DMICROPY_QSTR_EXTRA_POOL=mp_qstr_frozen_const_pool +CFLAGS += -DMICROPY_MODULE_FROZEN_MPY +endif include ../py/mkrules.mk include mkrules.mk diff --git a/nrf5/boards/microbit/mpconfigboard.h b/nrf5/boards/microbit/mpconfigboard.h index ed655896ea..7de7f4ac95 100644 --- a/nrf5/boards/microbit/mpconfigboard.h +++ b/nrf5/boards/microbit/mpconfigboard.h @@ -30,7 +30,7 @@ #define MICROPY_HW_MCU_NAME "NRF51822" #define MICROPY_PY_SYS_PLATFORM "nrf51" -#define MICROPY_PY_MACHINE_SPI (0) +#define MICROPY_PY_MACHINE_HW_SPI (0) #define MICROPY_PY_MACHINE_PWM (0) #define MICROPY_PY_MACHINE_TIMER (0) #define MICROPY_PY_MACHINE_RTC (0) diff --git a/nrf5/boards/pca10000/mpconfigboard.h b/nrf5/boards/pca10000/mpconfigboard.h index e38ae686c1..01840d26e8 100644 --- a/nrf5/boards/pca10000/mpconfigboard.h +++ b/nrf5/boards/pca10000/mpconfigboard.h @@ -30,7 +30,7 @@ #define MICROPY_HW_MCU_NAME "NRF51822" #define MICROPY_PY_SYS_PLATFORM "nrf51-dongle" -#define MICROPY_PY_MACHINE_SPI (0) +#define MICROPY_PY_MACHINE_HW_SPI (0) #define MICROPY_PY_MACHINE_PWM (0) #define MICROPY_HW_HAS_SWITCH (0) diff --git a/nrf5/boards/pca10001/mpconfigboard.h b/nrf5/boards/pca10001/mpconfigboard.h index b440b7f900..06570af7c4 100644 --- a/nrf5/boards/pca10001/mpconfigboard.h +++ b/nrf5/boards/pca10001/mpconfigboard.h @@ -30,7 +30,7 @@ #define MICROPY_HW_MCU_NAME "NRF51822" #define MICROPY_PY_SYS_PLATFORM "nrf51-DK" -#define MICROPY_PY_MACHINE_SPI (0) +#define MICROPY_PY_MACHINE_HW_SPI (0) #define MICROPY_PY_MACHINE_PWM (0) #define MICROPY_HW_HAS_SWITCH (0) diff --git a/nrf5/boards/pca10028/mpconfigboard.h b/nrf5/boards/pca10028/mpconfigboard.h index c4eab19cf1..1b558b3b7f 100644 --- a/nrf5/boards/pca10028/mpconfigboard.h +++ b/nrf5/boards/pca10028/mpconfigboard.h @@ -36,7 +36,7 @@ #define MICROPY_PY_DISPLAY_OLED_SSD1305 (1) #define MICROPY_PY_DISPLAY_OLED_SSD1306 (0) -#define MICROPY_PY_MACHINE_SPI (1) +#define MICROPY_PY_MACHINE_HW_SPI (1) #define MICROPY_PY_MACHINE_PWM (0) #define MICROPY_PY_MACHINE_TIMER (1) #define MICROPY_PY_MACHINE_RTC (1) diff --git a/nrf5/boards/pca10040/mpconfigboard.h b/nrf5/boards/pca10040/mpconfigboard.h index e5d0106087..58e7aaff1a 100644 --- a/nrf5/boards/pca10040/mpconfigboard.h +++ b/nrf5/boards/pca10040/mpconfigboard.h @@ -31,7 +31,7 @@ #define MICROPY_PY_SYS_PLATFORM "nrf52-DK" #define MICROPY_PY_MACHINE_PWM (1) -#define MICROPY_PY_MACHINE_SPI (1) +#define MICROPY_PY_MACHINE_HW_SPI (1) #define MICROPY_PY_MACHINE_TIMER (1) #define MICROPY_PY_MACHINE_RTC (1) #define MICROPY_PY_MACHINE_HW_I2C (1) diff --git a/nrf5/boards/pca10056/mpconfigboard.h b/nrf5/boards/pca10056/mpconfigboard.h index 91f7e00bc8..cf711ae1bb 100644 --- a/nrf5/boards/pca10056/mpconfigboard.h +++ b/nrf5/boards/pca10056/mpconfigboard.h @@ -31,7 +31,7 @@ #define MICROPY_PY_SYS_PLATFORM "nrf52840-PDK" #define MICROPY_PY_MACHINE_PWM (1) -#define MICROPY_PY_MACHINE_SPI (1) +#define MICROPY_PY_MACHINE_HW_SPI (1) #define MICROPY_PY_MACHINE_HW_I2C (1) #define MICROPY_PY_MACHINE_ADC (1) diff --git a/nrf5/help.c b/nrf5/help.c index a3a12bd19c..f17439a19d 100644 --- a/nrf5/help.c +++ b/nrf5/help.c @@ -25,16 +25,13 @@ * THE SOFTWARE. */ -#include - -#include "lib/utils/pyhelp.h" -#include "mpconfigboard.h" +#include "py/builtin.h" #if BLUETOOTH_SD #include "help_sd.h" #endif -STATIC const char help_text[] = +const char * nrf5_help_text = "Welcome to MicroPython!\n" "\n" "For online help please visit http://micropython.org/help/.\n" @@ -51,17 +48,3 @@ HELP_TEXT_SD "\n" "For further help on a specific object, type help(obj)\n" ; - -STATIC mp_obj_t pyb_help(uint n_args, const mp_obj_t *args) { - if (n_args == 0) { - // print a general help message - printf("%s", help_text); - - } else { - // try to print something sensible about the given object - pyhelp_print_obj(args[0]); - } - - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_help_obj, 0, 1, pyb_help); diff --git a/nrf5/lexerfatfs.c b/nrf5/lexerfatfs.c deleted file mode 100644 index fd7f62dfdd..0000000000 --- a/nrf5/lexerfatfs.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2013, 2014 Damien P. George - * - * 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/lexer.h" - -mp_lexer_t *fat_vfs_lexer_new_from_file(const char *filename); - -// TODO: Instead of such shims, probably better to let port #define -// mp_lexer_new_from_file to a function it wants to use. -mp_lexer_t *mp_lexer_new_from_file(const char *filename) { - return fat_vfs_lexer_new_from_file(filename); -} diff --git a/nrf5/mpconfigport.h b/nrf5/mpconfigport.h index cb1922cdac..aafcd3812c 100644 --- a/nrf5/mpconfigport.h +++ b/nrf5/mpconfigport.h @@ -50,6 +50,7 @@ #define MICROPY_OPT_COMPUTED_GOTO (0) #define MICROPY_OPT_CACHE_MAP_LOOKUP_IN_BYTECODE (0) #define MICROPY_OPT_MPZ_BITWISE (0) +#define MICROPY_READER_FATFS (1) // fatfs configuration used in ffconf.h #define MICROPY_FATFS_ENABLE_LFN (1) @@ -73,6 +74,9 @@ #define MICROPY_PY_BUILTINS_FROZENSET (1) #define MICROPY_PY_BUILTINS_EXECFILE (0) #define MICROPY_PY_BUILTINS_COMPILE (1) +#define MICROPY_PY_BUILTINS_HELP (1) +#define MICROPY_PY_BUILTINS_HELP_TEXT nrf5_help_text +#define MICROPY_PY_BUILTINS_HELP_MODULES (1) #define MICROPY_PY_ALL_SPECIAL_METHODS (0) #define MICROPY_PY_MICROPYTHON_MEM_INFO (1) #define MICROPY_PY_ARRAY_SLICE_ASSIGN (0) @@ -100,7 +104,7 @@ #define MICROPY_PY_MACHINE (1) #define MICROPY_PY_MACHINE_PULSE (0) #define MICROPY_PY_MACHINE_I2C (0) - +#define MICROPY_PY_MACHINE_SPI (0) #define MICROPY_PY_MACHINE_SPI_MIN_DELAY (0) #define MICROPY_PY_FRAMEBUF (0) @@ -112,8 +116,8 @@ #define MICROPY_PY_MACHINE_HW_I2C (0) #endif -#ifndef MICROPY_PY_MACHINE_SPI -#define MICROPY_PY_MACHINE_SPI (1) +#ifndef MICROPY_PY_MACHINE_HW_SPI +#define MICROPY_PY_MACHINE_HW_SPI (1) #endif #ifndef MICROPY_PY_MACHINE_PWM diff --git a/nrf5/spi.c b/nrf5/spi.c index a9a31337d2..7e3d831e88 100644 --- a/nrf5/spi.c +++ b/nrf5/spi.c @@ -37,7 +37,7 @@ #include "spi.h" #include "hal_spi.h" -#if MICROPY_PY_MACHINE_SPI +#if MICROPY_PY_MACHINE_HW_SPI /// \moduleref pyb /// \class SPI - a master-driven serial protocol @@ -113,7 +113,7 @@ void spi_init(SPI_HandleTypeDef *spi, bool enable_nss_pin) { void spi_deinit(SPI_HandleTypeDef *spi) { } -STATIC void spi_transfer(const pyb_spi_obj_t * self, size_t len, const uint8_t * src, uint8_t * dest, uint32_t timeout) { +STATIC void spi_transfer(const pyb_spi_obj_t * self, size_t len, const void * src, void * dest) { hal_spi_master_tx_rx(self->spi->instance, len, src, dest); } @@ -296,9 +296,50 @@ STATIC void machine_hard_spi_deinit(mp_obj_t self_in) { STATIC void machine_hard_spi_transfer(mp_obj_base_t *self_in, size_t len, const uint8_t *src, uint8_t *dest) { machine_hard_spi_obj_t *self = (machine_hard_spi_obj_t*)self_in; - spi_transfer(self->pyb, len, src, dest, 100); + spi_transfer(self->pyb, len, src, dest); } + +STATIC mp_obj_t mp_machine_spi_read(size_t n_args, const mp_obj_t *args) { + vstr_t vstr; + vstr_init_len(&vstr, mp_obj_get_int(args[1])); + memset(vstr.buf, n_args == 3 ? mp_obj_get_int(args[2]) : 0, vstr.len); + spi_transfer(args[0], vstr.len, vstr.buf, vstr.buf); + return mp_obj_new_str_from_vstr(&mp_type_bytes, &vstr); +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_machine_spi_read_obj, 2, 3, mp_machine_spi_read); + +STATIC mp_obj_t mp_machine_spi_readinto(size_t n_args, const mp_obj_t *args) { + mp_buffer_info_t bufinfo; + mp_get_buffer_raise(args[1], &bufinfo, MP_BUFFER_WRITE); + memset(bufinfo.buf, n_args == 3 ? mp_obj_get_int(args[2]) : 0, bufinfo.len); + spi_transfer(args[0], bufinfo.len, bufinfo.buf, bufinfo.buf); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_machine_spi_readinto_obj, 2, 3, mp_machine_spi_readinto); + +STATIC mp_obj_t mp_machine_spi_write(mp_obj_t self, mp_obj_t wr_buf) { + mp_buffer_info_t src; + mp_get_buffer_raise(wr_buf, &src, MP_BUFFER_READ); + spi_transfer(self, src.len, (const uint8_t*)src.buf, NULL); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(mp_machine_spi_write_obj, mp_machine_spi_write); + +STATIC mp_obj_t mp_machine_spi_write_readinto(mp_obj_t self, mp_obj_t wr_buf, mp_obj_t rd_buf) { + mp_buffer_info_t src; + mp_get_buffer_raise(wr_buf, &src, MP_BUFFER_READ); + mp_buffer_info_t dest; + mp_get_buffer_raise(rd_buf, &dest, MP_BUFFER_WRITE); + if (src.len != dest.len) { + mp_raise_ValueError("buffers must be the same length"); + } + spi_transfer(self, src.len, src.buf, dest.buf); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_3(mp_machine_spi_write_readinto_obj, mp_machine_spi_write_readinto); + + STATIC const mp_machine_spi_p_t machine_hard_spi_p = { .transfer = machine_hard_spi_transfer, }; @@ -312,4 +353,4 @@ const mp_obj_type_t machine_hard_spi_type = { .locals_dict = (mp_obj_t)&machine_spi_locals_dict, }; -#endif // MICROPY_PY_MACHINE_SPI +#endif // MICROPY_PY_MACHINE_HW_SPI diff --git a/nrf5/uart.c b/nrf5/uart.c index 4edaea3881..a510c834a9 100644 --- a/nrf5/uart.c +++ b/nrf5/uart.c @@ -348,8 +348,6 @@ STATIC const mp_map_elem_t pyb_uart_locals_dict_table[] = { /// \method read([nbytes]) { MP_OBJ_NEW_QSTR(MP_QSTR_read), (mp_obj_t)&mp_stream_read_obj }, - /// \method readall() - { MP_OBJ_NEW_QSTR(MP_QSTR_readall), (mp_obj_t)&mp_stream_readall_obj }, /// \method readline() { MP_OBJ_NEW_QSTR(MP_QSTR_readline), (mp_obj_t)&mp_stream_unbuffered_readline_obj}, /// \method readinto(buf[, nbytes])