This commit brings the QEMU port in line with other ports when it comes
to making sure the port builds with a user module to be part of the main
interpreter.
To not impact too much on the build time, only the `MPS2_AN385` board
does this as there'd be just too many targets to test, for not much
gain.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit adds a naive implementation of the "abort" standard C
library, that is needed by certain C++ runtimes let code link.
Although the Arm toolchain used in the CI image does not need this,
newer or different toolchains may actually need this (eg. the Arm EABI
toolchain provided by Arch Linux). Given the limited scope of the QEMU
port, the function simply spins forever.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit expands the linkerscript for STM32-series boards to let C++
code link with the interpreter core.
The linkerscript now contains all necessary sections for C++ code that
uses exceptions to be part of a user module inside the MicroPython
image.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit expands the linkerscript for nRF51-series boards to let C++
code link with the interpreter core.
The linkerscript now contains all necessary sections for C++ code that
uses exceptions to be part of a user module inside the MicroPython
image.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit expands the linkerscript for MPS3-series boards to let C++
code link with the interpreter core.
The linkerscript now contains all necessary sections for C++ code that
uses exceptions to be part of a user module inside the MicroPython
image.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit expands the linkerscript for MPS2-series boards to let C++
code link with the interpreter core.
The linkerscript now contains all necessary sections for C++ code that
uses exceptions to be part of a user module inside the MicroPython
image.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit expands the linkerscript for i.MX6-series boards to let C++
code link with the interpreter core.
The linkerscript now contains all necessary sections for C++ code that
uses exceptions to be part of a user module inside the MicroPython
image.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit fixes a mistake introduced in #19051, where the test ROMFS
partition would get mounted even on targets that do not need it to
function (ie. `repl`).
Now the ROMFS image is mounted only for test targets: `test`,
`test_full`, and `test_natmod`.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This board has 128k RAM, and its heap was originally 120k but commit
e84c9abfc2 changed that to 140k which will
not fit.
This commit reduces the heap down to 114k which allows enough room for the
remaining data/bss, a 10k heap and about 3k spare.
Signed-off-by: Damien George <damien@micropython.org>
This commit lets classes extending the base `PinGenerator` class to
override the process of generating extra per-pin content when creating
the pins' information source file.
There are cases in which one may want to have more control on the part
of the source generation process that dumps additional per-pin
information to the source file. The current approach works fine if each
pin generates self-contained additional data to be placed in the source
file, but there is no clean way to provide a prologue or an epilogue to
that content.
For example, if one wants to emit a single consolidated additional pin
data table it is not that convenient to be able to consistently emit the
table start definition and the table end markers. With these changes
all one has to do to achieve this is to override
`PinGenerator.print_pin_source` in their PinGenerator-derived class
to either wrap the output or to replace what is being output altogether.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit updates the list of the tests that must be skipped when the
suite is executed on a target that does not have floating point
support.
Two more tests, namely `extmod/vfs_rom.py` and
`micropython/const_float.py` have been added to the list, since they
both rely on floating point support being there.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
Most cases here have `print(..., some_str)` changed to
`print(..., repr(some_str))`. This makes the empty string visible and
prevents bare trailing spaces.
Signed-off-by: Dan Halbert <halbert@halwitz.org>
Consolidates TinyUSB source includes across multiple ports (alif, mimxrt,
renesas-ra, samd) to use a common approach for TinyUSB integration.
This cleanup ensures consistent TinyUSB usage patterns across ports
and simplifies maintenance.
Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
Newer STM32F4/F7 variants (and their HAL headers) use a single
USB_OTG_GCCFG_VBDEN register bit for VBUS detection instead of the older
NOVBUSSENS/VBUSASEN/VBUSBSEN bits. The existing TinyUSB VBUS sensing code
only handles the older register layout, so boards with the newer HAL
silently skip VBUS configuration.
This adds a #if defined(USB_OTG_GCCFG_VBDEN) branch that enables or
disables VBUS detection via the new register bit, falling through to the
existing code for older variants.
Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
This extends the RAM section into the adjacent ITCM RAM block, increasing
the total GC heap size by the same amount (because the GC heap uses all
available remaining RAM).
This affects only the NUCLEO_H723ZG board, bringing available GC heap from
73984 to 266048 bytes.
Signed-off-by: Damien George <damien@micropython.org>
Replace all |= on ADC CR with mask-and-set using ADC_CR_BITS_PROPERTY_RS
from the LL HAL. On ADC V2 the CR command bits are write-1-to-set, so |=
can propagate stale bits (e.g. ADSTP left by HAL_ADC_Stop), violating the
RM requirement that ADSTART and ADSTP must not be asserted simultaneously.
Add recovery logic in adc_config_channel for stuck ADSTART: stop the
conversion, disable, and re-enable the ADC before reconfiguring SQR1.
Replace unbounded while loops in ADC V2 paths with ADC_WAIT, a busy-wait
macro using mp_hal_ticks_ms with a 250ms timeout.
Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
Convert the samd port from the old `MICROPY_EVENT_POLL_HOOK` macro to use
the new `mp_event_wait_xxx()` functions in conjunction with
`MICROPY_INTERNAL_WFE`.
This change should be functionally equivalent to the existing behaivour
because `mp_event_wait_ms()` is equal to
`mp_handle_pending(MP_HANDLE_PENDING_CALLBACKS_AND_EXCEPTIONS); __WFE()`,
which is what `MICROPY_EVENT_POLL_HOOK` was.
Signed-off-by: Damien George <damien@micropython.org>
Convert the mimxrt port from the old `MICROPY_EVENT_POLL_HOOK` macro to use
the new `mp_event_wait_xxx()` functions in conjunction with
`MICROPY_INTERNAL_WFE`.
This change should be functionally equivalent to the existing behaivour
because `mp_event_wait_ms()` and `mp_event_wait_indefinite()` are equal to
`mp_handle_pending(MP_HANDLE_PENDING_CALLBACKS_AND_EXCEPTIONS); __WFE()`,
which is what `MICROPY_EVENT_POLL_HOOK` was.
Signed-off-by: Damien George <damien@micropython.org>
usbd_conf.c unconditionally includes shared/tinyusb/mp_usbd.h which
pulls in tusb.h when MICROPY_HW_ENABLE_USBDEV is set. The
BUILDING_MBOOT guard that disables TinyUSB comes after the include,
so mboot builds fail with missing tusb.h. Guard the include with
!BUILDING_MBOOT.
Also add forward declaration of mp_usbd_ll_init() next to the
MICROPY_HW_TINYUSB_LL_INIT macro in mpconfigboard_common.h, since
the function is used in an inline function in mp_usbd.h but only
declared in the port-specific usbd_conf.h.
Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
The esp32 port has the machine Counter and Encoder classes implemented in
Python, requiring a `machine.py` that extends the built-in machine module.
That previously used `__getattr__()` to delegate lookups to the built-in,
but that means any failed lookup raises an `AttributeError` instead of an
`ImportError`. This means (among other things) that certain tests like
CAN and I2CTarget would fail because they couldn't skip the test correctly.
This commit improves the situation by using `from machine import *` instead
of `__getattr__()`, which puts all the built-in functions/classes/constants
directly in the `machine.py` global namespace. That means an `ImportError`
is now correctly raised for attributes that don't exist.
Although this takes up a bit more RAM, it's now a lot faster to import from
the machine module: what used to take around 100us to lookup a name now
takes only 5us.
Signed-off-by: Damien George <damien@micropython.org>
This commit adds a new test to make sure ROMFS files are mounted and
read correctly, to be run as part of the CI process.
The changes also include the source binary files that have been used to
create the pre-baked ROMFS partition image used in the test, along with
a Makefile to allow recreating said file.
The CI test ROMFS image is mounted only if no other ROMFS partition is
mounted in slot 0. The specific test is executed only if there actually
is a ROMFS partition mounted and if the partition is identified as the
one used to run tests on. This allows for user images to be mounted and
for a successful test run if that is the case.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit renames the "tests/frozen" directory into "tests/assets" to
make it more explicit that it does contain files that are needed for
other tests to function.
Right now there's only a single pre-compiled module being used for
miscellaneous tests, but it will soon hold ROMFS test data as well.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit lets the SABRELITE machine definition load a ROMFS
partition at the very end of the RAM space.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit lets the MPS2_AN385 machine definition load a ROMFS
partition right at the beginning of the 16MiB PSRAM area.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit reserves a memory area to mount ROMFS partitions into, and
lets the port Makefile know the memory area details.
A 4 MiB segment is allocated at 0x8062_0000, which is inside the
emulated machine's DRAM segment. The virt board requires the image
loaded in its DRAM segment to be contiguous, so the ROMFS segment is
placed right after the stack area.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit reserves a memory area to mount ROMFS partitions into, and
lets the port Makefile know the memory area details.
A 4 MiB segment is allocated at 0x8061_0000, which is inside the
emulated machine's DRAM segment. The virt board requires the image
loaded in its DRAM segment to be contiguous, so the ROMFS segment is
placed right after the stack area.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit refactors shared ROMFS definitions appearing in some Arm
boards configuration, moving them into the QEMU port's Makefile.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit shortens the amount of space taken by the DMA control fields
table, and explicitly marks it as `const`.
The DMA fields info table used a full-size QSTR index value, and 9 bits
of numeric information. Given that the QSTR index could be converted
into a `qstr_short_t`, there is no fields spill outside a machine word
boundary - albeit with having 7 unused bits but there isn't much that
can be done for that. The effective structure size for each entry is
halved, from 8 bytes down to 4.
Also, the structure is only read from, yet it was not marked as `const`.
Marking the structure as constant did not help reduce the final size but
at least correctly signals the compiler that no write accesses are
possible.
This shrinks the RPI_PICO/RPI_PICO_W build by 56 bytes, with a similar
size reduction for RPI_PICO2/RPI_PICO2_W.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
Otherwise, a very deeply nested regular expression like
re.compile("(" * 65536)
can exhaust the host stack during the compile phase. This turns
that into a `RuntimeError: maximum recursion depth exceeded`
instead.
This crash was found via fuzzing.
Signed-off-by: Jeff Epler <jepler@unpythonic.net>
This callback argument was previously mis-labelled as a boolean,
but it's actually the tusb_xfer_result_t values from TinyUSB.
This work was funded through GitHub Sponsors.
Signed-off-by: Angus Gratton <angus@redyak.com.au>
Under `afl-cc` (acting as a wrapper for clang), the following
diagnostic occurs (wrapped for clarity):
../../py/objint_longlong.c:232:32: error:
comparison of integers of different signs:
'long long' and 'unsigned long' [-Werror,-Wsign-compare]
Add a cast to silence it. The value is known statically to fit inside
`long long`.
Signed-off-by: Jeff Epler <jepler@gmail.com>
Prior to this commit a port would need to manually configure the
`MICROPY_EMIT_THUMB_ARMV7M` and `MICROPY_EMIT_INLINE_THUMB_FLOAT` options,
based on whether the CPU is Thumb2 and whether it has hardware floating
point support (eg Cortex-M0+ vs Cortex-M3 vs Cortex-M4).
This is error prone, for example on stm32:
- `NUCLEO_G0B1RE` (a Cortex-M0+ MCU) had both enabled even though neither
options work on that target.
- `NUCLEO_L152RE` (a Cortex-M3 MCU) had both enabled but this target does
not support hardware floating point.
The change here automatically enables the two options based on built-in
compiler macros.
This change is tested on the following boards:
- alif ALIF_ENSEMBLE: both enabled
- rp2 RPI_PICO: both disabled
- rp2 RPI_PICO2: both enabled
- samd SAMD21_XPLAINED_PRO: both disabled
- samd SAMD_GENERIC_D51X20: both enabled
- stm32 NUCLEO_G0B1RE: both disabled
- stm32 NUCLEO_L152RE: only MICROPY_EMIT_THUMB_ARMV7M enabled
- stm32 PYBD_SF6: both enabled
- stm32 PYBV10: both enabled
Signed-off-by: Damien George <damien@micropython.org>
Properly cast tuple subclasses to the native base class before performing
`__add__` or `__iadd_`.
Closes: #7304
Signed-off-by: Jeff Epler <jepler@unpythonic.net>
It is a mistake in Python code if the result of readinto()/write()
is more bytes than requested. This can lead to misbehavior
e.g., in mp_stream_rw if the invariant is not respected.
CPython appears to largely ignore the values returned from
readinto()/write(), at least from `print()` & `json.load()`.
Consequently, an expected output file is needed for the
new test.
Closes: #18845
Signed-off-by: Jeff Epler <jepler@unpythonic.net>
Document this in cpydiff and add a test with expected output
for coverage testing.
As discussed in #11441, the code growth from handling this
case seems to outweigh the benefit of implementing it
properly.
Closes: #11439
Signed-off-by: Jeff Epler <jepler@unpythonic.net>
This commit optimises the lookup of opcodes' condition codes, in order
to take up less code than before.
The original data was held in a table containing the condition code
value (an incrementing 0-based integer) and the two condition ASCII
characters. Given that the condition code value also matches the
entry's index in the table, that can be safely omitted.
This saves 52 bytes when compiled for Thumb.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
This commit updates the documentation bits for pull-up/pull-down
constants, part of the `machine.Pin` class.
The documentation now mentions port-specific entries into a separate
section, making the only three standard pull-up/pull-down values being
`Pin.PULL_UP`, `Pin.PULL_DOWN`, and `None`.
Signed-off-by: Alessandro Gatti <a.gatti@frob.it>