summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2024-03-26nrf/modules/machine/pwm: Tag a PWM device as used in the constructor.robert-hh
When PWM constructor was created without specifying a device or setting both freq and duty rate, it was not tagged as used, and further calls to get a PWM object may get the same PWM device assigned. Fixes #13494. Signed-off-by: robert-hh <robert@hammelrath.com>
2024-03-26nrf/modules/machine: Catch exceptions from pin interrupts.Christian Walther
Exceptions in pin interrupt handlers would end up crashing MicroPython with a "FATAL: uncaught exception". In addition, MicroPython would get stuck trying to output this error message, or generally any print output from inside a pin interrupt handler, through the UART after the first character, so that only "F" was visible. The reason was a matching interrupt priority between the running pin interrupt and the UARTE interrupt signaling completion of the output operation. Fix that by increasing the UARTE interrupt priority. Code taken from the stm32 port and adapted. Signed-off-by: Christian Walther <cwalther@gmx.ch>
2024-03-26nrf: Fix non-running LFCLK.Christian Walther
Under some circumstances, after a hard reset, the low-frequency clock would not be running. This caused time.ticks_ms() to return 0, time.sleep_ms() to get stuck, and other misbehavior. A soft reboot would return it to a working state. The cause was a race condition that was hit when the bootloader would itself turn LFCLK on, but turn it off again shortly before launching the main application (this apparently happens with the Adafruit bootloader from https://github.com/fanoush/ds-d6/tree/master/micropython). Stopping the clock is an asynchronous operation and it continues running for a short time after the stop command is given. When MicroPython checked whether to start it by looking at the LFCLKSTAT register (nrf_clock_lf_is_running) during that time, it would mistakenly not be started again. What MicroPython should be looking at is not whether the clock is running at this time, but whether a start/stop command has been given, which is indicated by the LFCLKRUN register (nrf_clock_lf_start_task_status_get). It is not clearly documented, but empirically LFCLKRUN is not just set when the LFCLKSTART task is triggered, but also cleared when the LFCLKSTOP task is triggered, which is exactly what we need. The matter is complicated by the fact that the nRF52832 has an anomaly (see [errata](https://infocenter.nordicsemi.com/topic/errata_nRF52832_Rev3/ERR/nRF52832/Rev3/latest/anomaly_832_132.html?cp=5_2_1_0_1_33)) where starting the LFCLK will not work between 66µs and 138µs after it last stopped. Apply a workaround for that. See nrfx_clock_lfclk_start() in micropython/lib/nrfx/drivers/src/nrfx_clock.c for reference, but we are not using that because it also does other things and makes the code larger. Signed-off-by: Christian Walther <cwalther@gmx.ch>
2024-03-26nrf/modules/machine: Enable code formatting.Christian Walther
It destroys a few manual alignments, but these seem minor compared to the benefit of automated code style consistency. Signed-off-by: Christian Walther <cwalther@gmx.ch>
2024-03-26nrf/Makefile: Allow external board definitions.Christian Walther
Trying to use an external board definition according to https://github.com/micropython/micropython-example-boards on the nrf port failed with "Invalid BOARD specified". Replacing all ocurrences of "boards/$(BOARD)" with "$(BOARD_DIR)" following the example of stm32/Makefile fixes that. Signed-off-by: Christian Walther <cwalther@gmx.ch>
2024-03-25tools/manifestfile.py: Fix freeze() when script is an empty iterable.Damien George
The documentation for `freeze()` says that: - If `script` is `None`, all files in `path` will be frozen. - If `script` is an iterable then `freeze()` is called on all items of the iterable. This commit makes sure this behaviour is followed when an empty tuple/list is passed in for `script` (previously an empty tuple/list froze all files). Fixes issue #14125. Signed-off-by: Damien George <damien@micropython.org>
2024-03-25extmod/network_wiznet5k: Properly enable interrupt signal on w5100s.Jared Hancock
According to the datasheet, the IEN bit to enable the interrupt is in the MR2 register, not the MR register. This is just cleanup as the interrupt appears to be enabled by default after resetting the chip. Tested on W5100S_EVB_PICO.
2024-03-25top: Skip codespell for IDF managed components.Daniël van de Giessen
During a build the ESP-IDF downloads managed components in the ports/esp32/managed_components directory, which shouldn't be spellchecked. Signed-off-by: Daniël van de Giessen <daniel@dvdgiessen.nl>
2024-03-25esp32/main: Check if main GC heap allocation failed.Daniël van de Giessen
If the heap allocation fails we will crash if we continue, so at least we can show a clear error message so one can figure out memory allocation was the problem (instead of just seeing some arbitrary null pointer error later). Signed-off-by: Daniël van de Giessen <daniel@dvdgiessen.nl>
2024-03-25py/nlr: Add "memory" to asm clobbers list in nlr_jump.Damien George
Newer versions of gcc (14 and up) have more sophisticated dead-code detection, and the asm clobbers list needs to contain "memory" to inform the compiler that the asm code actually does something. Tested that adding this "memory" line does not change the generated code on ARM Thumb2, x86-64 and Xtensa targets (using gcc 13.2). Fixes issue #14115. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22github/workflows: Add Biome workflow for JavaScript formatting/linting.Damien George
Enable Biome on all of webassembly port and tests. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22tools/ci.sh: Update webassembly CI tests.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-22tests/ports/webassembly: Add webassembly JS tests.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-22tests/run-tests.py: Support running webassembly tests via node.Damien George
This allows running tests with a .js/.mjs suffix, and also .py tests using node and the webassembly port. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly/library: Fix formatting and style for Biome.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Update README.md to describe latest changes.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly/variants/pyscript: Add pyscript variant.Damien George
This commit adds a pyscript variant for use in https://pyscript.net/. The configuration is: - No ASYNCIFY, in order to keep the WASM size down and have good performance. - MICROPY_CONFIG_ROM_LEVEL_FULL_FEATURES to enable most features. - Custom manifest that includes many of the python-stdlib libraries. - MICROPY_GC_SPLIT_HEAP_AUTO to increase GC heap size instead of doing a collection when memory is exhausted. This is needed because ASYNCIFY is disabled. Instead the GC collection is run at the top-level before executing any Python code. - No MICROPY_VARIANT_ENABLE_JS_HOOK because there is no asynchronous keyboard input to interrupt a running script. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Implement replInit() and replProcessChar().Damien George
This is the JavaScript API for starting and running a REPL. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Implement runCLI() for a Node-based CLI.Damien George
This allows running MicroPython webassembly from the command line using: node micropython.mjs Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Implement runPythonAsync() for top-level async code.Damien George
With this commit, `interpreter.runPythonAsync(code)` can now be used to run Python code that uses `await` at the top level. That will yield up to JavaScript and produce a thenable, which the JavaScript runtime can then resume. Also implemented is the ability for Python code to await on JavaScript promises/thenables. For example, outer JavaScript code can await on `runPythonAsync(code)` which then runs Python code that does `await js.fetch(url)`. The entire chain of calls will be suspended until the fetch completes. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Add JavaScript proxying, and js and jsffi modules.Damien George
This commit improves the webassembly port by adding: - Proxying of Python objects to JavaScript with a PyProxy type that lives on the JavaScript side. PyProxy implements JavaScript Proxy traps such as has, get, set and ownKeys, to make Python objects have functionality on the JavaScript side. - Proxying of JavaScript objects to Python with a JsProxy type that lives on the Python side. JsProxy passes through calls, attributes, subscription and iteration from Python to JavaScript. - A top-level API on the JavaScript side to construct a MicroPython interpreter instance via `loadMicroPython()`. That function returns an object that can be used to execute Python code, access the Python globals dict, access the Emscripten filesystem, and other things. This API is based on the API provided by Pyodide (https://pyodide.org/). As part of this, the top-level file is changed from `micropython.js` to `micropython.mjs`. - A Python `js` module which can be used to access all JavaScript-side symbols, for example the DOM when run within a browser. - A Python `jsffi` module with various helper functions like `create_proxy()` and `to_js()`. - A dedenting lexer which automatically dedents Python source code if every non-empty line in that source starts with a common whitespace prefix. This is very helpful when Python source code is indented within a string within HTML or JavaScript for formatting reasons. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Clean up Makefile and add variant support.Damien George
This commit cleans up and generalises the Makefile, adds support for variants (following the unix port) and adds the "standard" variant as the default variant. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Add support for enabling MICROPY_GC_SPLIT_HEAP_AUTO.Damien George
When enabled the GC will not reclaim any memory on a call to `gc_collect()`. Instead it will grow the heap. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Use POSIX write for output and add stderr.Damien George
All output is now handled by Emscripten's stdio facility. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Enable time localtime, gmtime, time, time_ns.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Implement MICROPY_PY_RANDOM_SEED_INIT_FUNC.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Move MP_JS_EPOCH init to library postset.Damien George
This eliminates the need for wrapper.js to run to set up the time. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22webassembly: Include lib in sys.path.Damien George
Following other ports. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22py/compile: Add option to allow compiling top-level await.Damien George
Enabled by MICROPY_COMPILE_ALLOW_TOP_LEVEL_AWAIT. When enabled, this means that scope such as module-level functions and REPL statements can yield. The outer C code must then handle this yielded generator. Signed-off-by: Damien George <damien@micropython.org>
2024-03-22esp32: Workaround IDF issue placing ISR ringbuf functions in IRAM.Jim Mussared
This workaround makes sure that all ringbuf functions that may be called from an ISR are placed in IRAM. See https://github.com/espressif/esp-idf/issues/13378 Note that this means that all esp32-og builds get non-ISR ringbuf functions placed in flash now, whereas previously it was just the spiram variant. This might be a good thing (e.g. free up some IRAM for native/viper). Fixes issue #14005. This work was funded through GitHub Sponsors. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
2024-03-22py/parse: Zero out dangling parse tree pointer to fix potential GC leak.Angus Gratton
This fixes a bug where a random Python object may become un-garbage-collectable until an enclosing Python file (compiled on device) finishes executing. Details: The mp_parse_tree_t structure is stored on the stack in top-level functions such as parse_compile_execute() in pyexec.c (and others). Although it quickly falls out of scope in these functions, it is usually still in the current stack frame when the compiled code executes. (Compiler dependent, but usually it's one stack push per function.) This means if any Python object happens to allocate at the same address as the (freed) root parse tree chunk, it's un-garbage-collectable as there's a (dangling) pointer up the stack referencing this same address. As reported by @GitHubsSilverBullet here: https://github.com/orgs/micropython/discussions/14116#discussioncomment-8837214 This work was funded through GitHub Sponsors. Signed-off-by: Angus Gratton <angus@redyak.com.au>
2024-03-20tests/float/float_struct_e.py: Add specific test for struct 'e' type.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-20unix/variants: Don't use native _Float16 type.Damien George
Using it increases code size by about 2k. Signed-off-by: Damien George <damien@micropython.org>
2024-03-20stm32/stm32.mk: Enable _Float16 support on MCUs with hardware floats.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-20py/binary: Support half-float 'e' format in struct pack/unpack.Matthias Urlichs
This commit implements the 'e' half-float format: 10-bit mantissa, 5-bit exponent. It uses native _Float16 if supported by the compiler, otherwise uses custom bitshifting encoding/decoding routines. Signed-off-by: Matthias Urlichs <matthias@urlichs.de> Signed-off-by: Damien George <damien@micropython.org>
2024-03-19docs/library/rp2.DMA: Add documentation for rp2 DMA support.Nicko van Someren
Signed-off-by: Nicko van Someren <nicko@nicko.org>
2024-03-19extmod/modnetwork: Implement IPv6 API to set and get NIC configuration.Felix Dörre
This commit implements a new <AbstractNIC>.ipconfig() function for the NIC classes that use lwIP, to set and retrieve network configuration for a NIC. Currently this method supports: - ipconfig("addr4"): obtain a tuple (addr, netmask) of the currently configured ipv4 address - ipconfig("addr6"): obtain a list of tuples (addr, state, prefered_lifetime, valid_lifetime) of all currently active ipv6 addresses; this includes static, slaac and link-local addresses - ipconfig("has_dhcp4"): whether ipv4 dhcp has supplied an address - ipconfig("has_autoconf6"): if there is a valid, non-static ipv6 address - ipconfig(addr4="1.2.3.4/24"): to set the ipv4 address and netmask - ipconfig(addr6="2a01::2"): to set a static ipv6 address; note that this does not configure an interface route, as this does not seem supported by lwIP - ipconfig(autoconf6=True): to enable ipv6 network configuration with slaac - ipconfig(gw4="1.2.3.1"): to set the ipv4 gateway - ipconfig(dhcp4=True): enable ipv4 dhcp; this sets ipv4 address, netmask, gateway and a dns server - ipconfig(dhcp4=False): stops dhcp, releases the ip, and clears the configured ipv4 address. - ipconfig(dhcp6=True): enable stateless dhcpv6 to obtain a dns server There is also a new global configuration function network.ipconfig() that supports the following: - network.ipconfig(dns="2a01::2"): set the primary dns server (can be a ipv4 or ipv6 address) - network.ipconfig(prefer=6): to prefer ipv6 addresses to be returned as dns responses (falling back to ipv4 if the host does not have an ipv6 address); note that this does not flush the dns cache, so if a host is already in the dns cache with its v4 address, subsequent lookups will return that address even if prefer=6 is set This interface replaces NIC.ifconfig() completely, and ifconfig() should be marked as deprecated and removed in a future version. Signed-off-by: Felix Dörre <felix@dogcraft.de>
2024-03-19stm32/boards/LEGO_HUB_NO6: Use a raw filesystem for mboot to update fw.Damien George
The C-based SPI flash driver is needed because the `_copy_file_to_raw_filesystem()` function must copy from a filesystem (eg FAT) to another part of flash, and the same C code must be used for both reading (from FAT) and writing (to flash). Signed-off-by: Damien George <damien@micropython.org>
2024-03-19stm32/boards/LEGO_HUB_NO6: Move robust logic to mboot.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-19stm32/mboot: Add support for a raw filesystem.Damien George
This is enabled by default if MBOOT_FSLOAD is enabled, although a board can explicitly disable it by `#define MBOOT_VFS_RAW (0)`. Signed-off-by: Damien George <damien@micropython.org>
2024-03-19py/emitnative: Implement viper unary ops positive, negative and invert.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-19py/asmxtensa: Optimise asm_xtensa_mov_reg_i32_optimised() for tiny ints.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-19py/asm: Add ASM_NOT_REG and ASM_NEG_REG macros for unary ops.Damien George
ASM_NOT_REG is optional, it can be synthesised by xor(reg, -1). ASM_NEG_REG can also be synthesised with a subtraction, but most architectures have a dedicated instruction for it. Signed-off-by: Damien George <damien@micropython.org>
2024-03-19docs/library/collections: Update deque docs to describe new features.Damien George
Signed-off-by: Damien George <damien@micropython.org>
2024-03-19tests/basics: Split MicroPython-specific deque tests to separate file.Damien George
So that the MicroPython-specific behaviour can be isolated, and the CPython compatible test don't need a .exp file. Signed-off-by: Damien George <damien@micropython.org>
2024-03-19tools/mpy-tool.py: Fix merging of more than 128 mpy files.Damien George
The argument to MP_BC_MAKE_FUNCTION (raw code index) was being encoded as a byte instead of a variable unsigned int. That meant that if there were more than 128 merged mpy files the encoding would be invalid. Fix that by using `mp_encode_uint(idx)` to encode the raw code index. And also use `Opcode` constants for the opcode values to make it easier to understand the code. Signed-off-by: Damien George <damien@micropython.org>
2024-03-18py/objdeque: Expand implementation to be doubly-ended and support iter.Dash Peters
Add `pop()`, `appendleft()`, and `extend()` methods, support iteration and indexing, and initializing from an existing sequence. Iteration and indexing (subscription) have independent configuration flags to enable them. They are enabled by default at the same level that collections.deque is enabled (the extra features level). Also add tests for checking new behavior. Signed-off-by: Damien George <damien@micropython.org>
2024-03-16all: Update extmod, ports, examples to build with new berkeley-db lib.Damien George
This provides a MicroPython-specific berkeley-db configuration in extmod/berkeley-db/berkeley_db_config_port.h, and cleans up the include path for this library. Fixes issue #13092. Signed-off-by: Damien George <damien@micropython.org>
2024-03-16lib/berkeley-db-1.xx: Update submodule URL and version.Damien George
This updates the berkeley-db-1.xx submodule URL to a repository hosted under the micropython organisation, and makes the following changes: - Moves the berkeley-db header files to a single directory within the submodule, and references all these headers with a much fuller path, which prevents symbol clashes (eg with esp32 and queue.h). - Removes unused/non-working files from berkeley-db, which removes all symlinks in that repo (symlinks don't play well under Windows). - Allows injecting an external configuration header into berkeley-db, so the configuration doesn't have to be provided by -Dxx=yy flags to the compiler (and possibly clashing with other symbols). - Removes the advertising clause from the BSD 4-clause license of berkeley-db (see relevant commit and README.Impt.License.Change for details). Signed-off-by: Damien George <damien@micropython.org>
2024-03-16extmod/os_dupterm: Handle exception properly when it occurs in parallel.Felix Dörre
When an exception is handled and the stream is closed, but while this happens, another exception occurs or dupterm is deactivated for another reason, the initial deactivation crashes, because its dupterm is removed. Co-authored-by: Damien George <damien@micropython.org> Signed-off-by: Felix Dörre <felix@dogcraft.de>