summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2024-03-27shared/tinyusb: Don't disconnect on soft reset unless USB was active.Angus Gratton
Previously, constructing the singleton USBDevice object was enough to trigger a USB disconnect on soft reset. Now it also has to be active. The only case where this changes the behaviour is if the USBDevice object has been constructed but never set to active (no more disconnect in this case). Otherwise, behaviour is the same. This change was requested by hippy on the raspberrypi forums. This work was funded through GitHub Sponsors. Signed-off-by: Angus Gratton <angus@redyak.com.au>
2024-03-27rp2/CMakeLists: Apply O2 optimisation to map, mpz and vm source code.Damien George
Enabling this optimisation increases the RPI_PICO firmware by +3344 bytes. Performace change is: diff of scores (higher is better) N=100 M=100 rpi-base -> rpi-opt diff diff% (error%) bm_chaos.py 196.56 -> 215.26 : +18.70 = +9.514% (+/-0.05%) bm_fannkuch.py 52.47 -> 54.37 : +1.90 = +3.621% (+/-0.05%) bm_fft.py 1476.74 -> 1530.06 : +53.32 = +3.611% (+/-0.01%) bm_float.py 2305.65 -> 2444.11 : +138.46 = +6.005% (+/-0.08%) bm_hexiom.py 32.83 -> 35.09 : +2.26 = +6.884% (+/-0.05%) bm_nqueens.py 2335.85 -> 2259.78 : -76.07 = -3.257% (+/-0.06%) bm_pidigits.py 366.23 -> 465.81 : +99.58 = +27.191% (+/-0.04%) bm_wordcount.py 41.20 -> 41.87 : +0.67 = +1.626% (+/-0.01%) core_import_mpy_multi.py 327.44 -> 335.24 : +7.80 = +2.382% (+/-0.08%) core_import_mpy_single.py 63.41 -> 64.98 : +1.57 = +2.476% (+/-0.21%) core_locals.py 27.24 -> 29.19 : +1.95 = +7.159% (+/-0.01%) core_qstr.py 137.31 -> 140.84 : +3.53 = +2.571% (+/-0.03%) core_str.py 18.44 -> 18.10 : -0.34 = -1.844% (+/-0.03%) core_yield_from.py 221.69 -> 211.72 : -9.97 = -4.497% (+/-0.01%) misc_aes.py 303.38 -> 308.72 : +5.34 = +1.760% (+/-0.02%) misc_mandel.py 1501.00 -> 1746.60 : +245.60 = +16.362% (+/-0.04%) misc_pystone.py 1348.22 -> 1456.75 : +108.53 = +8.050% (+/-0.07%) misc_raytrace.py 223.81 -> 246.16 : +22.35 = +9.986% (+/-0.07%) viper_call0.py 331.05 -> 331.10 : +0.05 = +0.015% (+/-0.00%) viper_call1a.py 323.34 -> 323.39 : +0.05 = +0.015% (+/-0.00%) viper_call1b.py 241.01 -> 241.04 : +0.03 = +0.012% (+/-0.00%) viper_call1c.py 242.88 -> 242.92 : +0.04 = +0.016% (+/-0.00%) viper_call2a.py 318.41 -> 318.46 : +0.05 = +0.016% (+/-0.00%) viper_call2b.py 211.27 -> 211.30 : +0.03 = +0.014% (+/-0.00%) And the test `tests/basics/builtin_pow3_intbig.py` now passes (it uses a lot of mpz code and previously took longer than 10 seconds to run on RPI_PICO, which would lead to a timeout in the test runner). Signed-off-by: Damien George <damien@micropython.org>
2024-03-26py/makeqstrdata.py: Ensure that scope names get low qstr values.Jim Mussared
Originally implemented in a patch file provided by @ironss-iotec. Fixes issue #14093. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
2024-03-26docs/library/machine.RTC: Add docs for RTC.memory() method.Amirreza Hamzavi
Co-Authored-By: glenn20 <glenn20@users.noreply.github.com> Signed-off-by: Amirreza Hamzavi <amirrezahamzavi2000@gmail.com>
2024-03-26esp8266/Makefile: Add support for C++ user C modules.Jim Mussared
This work was funded through GitHub Sponsors. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
2024-03-26renesas-ra/boards/ARDUINO_PORTENTA_C33: Add Arduino's external library.iabdalkader
Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
2024-03-26stm32/boards/ARDUINO_PORTENTA_H7: Add Arduino's external library.iabdalkader
Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
2024-03-26stm32/boards/ARDUINO_NICLA_VISION: Add Arduino's external library.iabdalkader
Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
2024-03-26stm32/boards/ARDUINO_GIGA: Add Arduino's external library.iabdalkader
Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
2024-03-26lib/arduino-lib: Add Arduino's external library.iabdalkader
This library contains external modules for Arduino boards. Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
2024-03-26nrf/Makefile: Clean up dangling LIBS declaration.Andrew Leech
Signed-off-by: Andrew Leech <andrew@alelec.net>
2024-03-26nrf/main: Fix build of microbit when SD is enabled.Andrew Leech
Signed-off-by: Andrew Leech <andrew@alelec.net>
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>