Commit graph

1433 commits

Author SHA1 Message Date
6b69bb4030 uctypes: Make PtrType(0) cast the int to pointer
.. the previous interpretation made the data at address 0
be a pointer.

Additionally, `PtrType(buffer)` is not permitted anymore.
You can use `ctypes.struct(buffer, PtrType)` if you really want
to treat the content of the buffer as a pointer.
2025-08-17 14:33:09 -05:00
dddbf1d4bc mkapi: Generate documentation 2025-08-11 10:18:48 -05:00
a8f115933c mkapi: allow anything for 'Ptr' 2025-08-10 19:25:40 -05:00
e4b6da2a39 fix get_struct_desc 2025-08-10 19:25:40 -05:00
ccd01e33ad fix comment 2025-08-10 19:25:40 -05:00
f1433d8f8f uctypes: Fix overlap between position & kw args in constructor 2025-08-01 09:27:10 -05:00
0f6adb8845 ctypes: a nicer repr of structs 2025-07-31 17:19:46 -05:00
e188517863 Continue improving defs
& do some testing of mkapi-generated bindings
2025-07-31 15:52:17 -05:00
49bb45bad6 ctypes structures should be const 2025-07-31 15:13:22 -05:00
47532161fe uctypes: Export uctypes_struct_type 2025-07-31 15:13:22 -05:00
96b8c1ba68 uctypes: Use MP_GET_BUFFER_BASE 2025-07-20 13:30:51 -05:00
6d16c8d3fe core: Add MP_BUFFER_GET_BASE
This flag requests that the filled bufinfo give the associated
GC base address, for classes like memoryview & uctypes that need
it in order to ensure liveness of the data they refer to.

I had initially hoped that this would be a forward compatible
change, but the practice of checking `flags == MP_BUFFER_READ`
means it's not, so I might as well make it unconditional. But,
here, it's an intermediate step that passed the tests.
2025-07-20 13:30:02 -05:00
d53177561e uctypes: Fix kw-constructing structures
before this, the following would go wrong:
```
>>> r1 = mactypes.Rect(top=671, left=52, bottom=149, right=529)
>>> print(r1.top, r1.left, r1.bottom, r1.right)
52 671 0 0
```
because the progress along the kwargs was mis-counted
2025-07-19 20:08:13 -05:00
600ff44226 uctypes: Show "can't assign to aggregate" as an error.
.. instead of the non-specific "syntax error".
2025-07-18 11:02:43 -05:00
d1e704b37a uctypes: Support copying & updating of the whole struct object.
The following operations on uctypes structs are now supported:

```
lhs[:] = buffer # Replace the whole content of lhs with buffer
copy = rhs[:]   # Make an identical copy of rhs in a fresh buffer
```

Signed-off-by: Jeff Epler <jepler@gmail.com>
2025-07-18 11:02:43 -05:00
13fbd43610 moductypes: Add types.
This is an experiment. I want the usual Python guarantee that
you can't just footgun yourself by passing the wrong thing through
a pointer argument, at least as much as is practical.

But a uctypes struct doesn't have a type of its own, like Point
or Rect; you can only check that the *size* matches some
underlying expected size.

This change allows a type like Rect to be defined in the core,
and of course if it's a distinct Python type it can be checked
in the core as well.

Restore the unix tests so we can test the added core functionality.

Signed-off-by: Jeff Epler <jepler@gmail.com>
2025-07-17 20:51:01 -05:00
275e048b29 modlwip: Print timeout with correct format string.
As timeout is of type `mp_int_t`, it must be printed with INT_FMT.

Before, the compiler plugin produced an error in the PYBD_SF6
build, which is a nanboxing build with 64-bit ints.

Signed-off-by: Jeff Epler <jepler@gmail.com>
2025-07-06 08:21:19 +01:00
Andrew Leech
2f04381aeb extmod/modlwip: Fix crash when calling recv on listening socket.
Add check to prevent calling recv on a socket in the listening state.  This
prevents a crash/hard fault when user code mistakenly tries to recv on the
listening socket instead of on the accepted connection.

Add corresponding test case to demonstrate the bug.

Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
2025-06-26 12:46:45 +10:00
Damien George
398da22492 esp8266/modmachine: Use common machine_time_pulse_us implementation.
Testing shows that for frequencies which the esp8266 can handle -- up to
about 1kHz -- `machine.time_pulse_us()` now gives more accurate results.

Prior to this commit it would measure on average about 1us lower, but now
the average is much closer to the true value.  For example a pulse that is
1000us long, it would measure between 998 and 1000us.  Now it measures
between 999us and 1001us.

Signed-off-by: Damien George <damien@micropython.org>
2025-06-13 16:27:35 +10:00
Damien George
ef21ade602 extmod/machine_pulse: Optimise time_pulse_us for code size.
This implementation is based on the esp8266 custom implementation, and
further optimised for size and accuracy.

Testing on PYBD_SF2 and RPI_PICO2_W shows that it is at least as good as
the original implementation in performance.

Signed-off-by: Damien George <damien@micropython.org>
2025-06-13 16:27:35 +10:00
745bec9ce3 extmod/modre: Use specific error message if regex is too complex.
If the error reporting mode is at least "normal", report a failure due to a
complex regex with a different message.

Fixes issue #17150.

Signed-off-by: Jeff Epler <jepler@gmail.com>
2025-06-10 15:14:56 +10:00
Andrew Leech
fffaf8a41f extmod/modnetwork: Consolidate definition of common drivers.
Most extmod network drivers were being defined on a per-port basis,
duplicating code and making enabling a driver on a new port harder.

This consolidates extmod driver declarations and removes the existing
per-port definitions of them.

This commit has been verified to be a no-op in terms of firmware change.

Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
2025-06-10 11:20:38 +10:00
Damien George
b15348415e extmod/modframebuf: Add support for blit'ing read-only data.
Currently the `FrameBuffer.blit(buf, x, y)` method requires the `buf`
argument to be another `FrameBuffer`, which is quite restrictive because it
doesn't allow blit'ing read-only memory/data.

This commit extends `blit()` to allow the `buf` argument to be a tuple or
list of the form:

    (buffer, width, height, format[, stride])

where `buffer` can be anything with the buffer protocol and may be
read-only, eg `bytes`.

Also, the palette argument to `blit()` may be of the same form.

The form of this tuple/list was chosen to be the same as the signature of
the `FrameBuffer` constructor (that saves quite a bit of code size doing it
that way).

Signed-off-by: Damien George <damien@micropython.org>
2025-06-04 02:40:45 +10:00
Andrew Leech
d5f2fc239a extmod/modbluetooth: Add timeout to deinit.
If the BLE radio stops responding before deinit is called the function can
get stuck waiting for an event that is never received, particularly if the
radio is external or on a separate core.

This commit adds a timeout, similar to the timeout already used in the init
function.  Updated for nimble, btstack, esp32 and zephyr bindings.

Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
2025-06-04 02:21:32 +10:00
Angus Gratton
e8447768ef extmod/modlwip: Add optional flags argument for recv and recvfrom.
Implements MSG_PEEK and MSG_DONTWAIT.

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2025-06-03 12:52:02 +10:00
Angus Gratton
186caf9f03 extmod/network_cyw43: Disconnect STA if making inactive.
esp32 port will disconnect if active(0) is called on a STA
interface, but rp2 port stays associated without this change.

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2025-05-20 23:14:41 +10:00
Alessandro Gatti
9ef16b466b extmod/modjson: Detect unterminated composite entities.
This commit makes the JSON parser raise an exception when handling
objects or arrays whose declaration is incomplete, as in missing the
closing marker (brace or bracket) and if the missing marker would have
been the last non-whitespace character in the incoming string.

Since CPython's JSON parser would raise an exception in such a case,
unlike MicroPython's, this commit aligns MicroPython's behaviour with
CPython.

This commit fixes issue #17141.

Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
2025-05-19 02:09:40 +02:00
Damien George
62d26bfc15 extmod/vfs_lfsx: Fix errno value raised from chdir.
OSError errno values should be positive.

Signed-off-by: Damien George <damien@micropython.org>
2025-05-15 13:09:49 +10:00
Daniël van de Giessen
3b1e22c669 esp32/network_ppp: Restructure to match extmod/network_ppp_lwip.
The ESP32 PPP implementation predates the generic
implementation in extmod. The new extmod
implementation has a few advantages such as a
better deinitialisation procedure (the ESP32
implemementation would not clean up properly and
cause crashes if recreated) and using the UART IRQ
functionality instead of running a task to read
data from the UART.

This change restructures the ESP implementation to
be much closer to the new extmod version, while
also bringing a few tiny improvements from the
ESP32 version to the extmod version. The diff
between extmod/network_ppp_lwip.c and
ports/esp32/network_ppp.c is now a small set of
easy to review ESP32 port-specific changes.

Signed-off-by: Daniël van de Giessen <daniel@dvdgiessen.nl>
2025-05-15 11:56:14 +10:00
Alessandro Gatti
f47e214cdc all: Rename the "NORETURN" macro to "MP_NORETURN".
This commit renames the NORETURN macro, indicating to the compiler
that a function does not return, into MP_NORETURN to maintain the same
naming convention of other similar macros.

To maintain compaitiblity with existing code NORETURN is aliased to
MP_NORETURN, but it is also deprecated for MicroPython v2.

This changeset was created using a similar process to
decf8e6a8b ("all: Remove the "STATIC"
macro and just use "static" instead."), with no documentation or python
scripts to change to reflect the new macro name.

Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
2025-05-13 10:36:47 +10:00
Damien George
26e978e7bc extmod/modlwip: Implement a queue of incoming UDP/raw packets.
The bare-metal lwIP socket interface is currently quite limited when used
for UDP streams, because it only allows one outstanding incoming UDP
packet.  If one UDP packet is waiting to be socket.recv'd and another one
comes along, then the second one is simply dropped.

This commit implements a queue for incoming UDP and raw packets.  The queue
depth is fixed at compile time, and is currently 4.

This allows better use of UDP connections, eg more efficient.  It also
makes DTLS work better which sometimes has a queue of UDP packets (eg
during the connection phase).

Signed-off-by: Damien George <damien@micropython.org>
2025-05-12 14:17:44 +10:00
Angus Gratton
7d5aba0523 extmod/moductypes: Refactor string literal as array initializer.
Avoids the new Wunterminated-string-literal when compiled with gcc 15.1.

Also split out the duplicate string to a top-level array (probably the
duplicate string literal was interned, so unlikely to have any impact.)

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2025-05-09 18:31:40 +10:00
Angus Gratton
d00eab4a30 rp2,extmod/cyw43: Move the LWIP responder fix into common CYW43 config.
This means the fix from dd1465e7 will also apply to stm32 and mimxrt ports
that use CYW43.

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2025-05-08 15:32:05 +10:00
Angus Gratton
b2cda6c604 extmod,alif,mimxrt,rp2,stm32: Create common cyw43 driver config header.
This is only a surface level refactor, some deeper refactoring would be
possible with (for example) the SDIO interface in mimxrt and stm32, or the
BTHCI interface which is is similar on supported ports. But sticking to
cases where the macros are the same across all ports.

This work was funded through GitHub Sponsors.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2025-05-08 15:32:05 +10:00
Daniël van de Giessen
2b29b1b8f9 lib/littlefs: Reuse existing CRC32 function to save space.
Getting this to work required fixing a small issue in `lfs2_util.h`, which
has been submitted upstream.

Signed-off-by: Daniël van de Giessen <daniel@dvdgiessen.nl>
2025-05-07 17:03:28 +10:00
Yoctopuce dev
bdb7e036d2 extmod/asyncio: Fix early exit of asyncio scheduler.
This commit fixes three open issues related to the asyncio scheduler
exiting prematurely when the main task queue is empty, in cases where
CPython would not exit (for example, because the main task is not done
because it's on a different queue).

In the first case, the scheduler exits because running a task via
`run_until_complete` did not schedule any dependent tasks.

In the other two cases, the scheduler exits because the tasks are queued in
an event queue.

Tests have been added which reproduce the original issues.  These test
cases document the unauthorized use of `Event.set()` from a soft IRQ, and
are skipped in unsupported environments (webassembly and native emitter).

Fixes issues #16759, #16569 and #16318.

Signed-off-by: Yoctopuce dev <dev@yoctopuce.com>
2025-05-07 14:56:47 +10:00
iabdalkader
193460d18f drivers/esp-hosted: Rename Bluetooth HCI backend driver.
Rename `bthci` to `bthci_uart` for consistency with the CYW43 driver and to
distinguish it from HCI backends that use a different transport.

Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
2025-04-22 12:30:18 +10:00
Andrew Leech
569d472bc7 extmod/modbluetooth: Use newer mp_map_slot_is_filled function.
Required in MICROPY_PREVIEW_VERSION_2.

Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
2025-04-22 11:29:43 +10:00
Andrew Leech
b6dbc47664 extmod/machine_usb_device: Add exception text wrappers.
Required in MICROPY_PREVIEW_VERSION_2.

Signed-off-by: Andrew Leech <andrew.leech@planetinnovation.com.au>
2025-04-22 11:29:32 +10:00
Damien George
a9384c71c5 extmod/extmod.mk: Switch from drivers/cyw43/cywbt to lib/cyw43-drivers.
The cyw43-driver now provides the Bluetooth initialisation code, making
`drivers/cyw43/cywbt.c` obsolete.  To use the new code a port must enable
the `CYW43_ENABLE_BLUETOOTH_OVER_UART` option.

Some ports have yet to migrate to the new code, so in the meantime they can
explicitly add the old source to their source list and continue to use it
without change.

Signed-off-by: Damien George <damien@micropython.org>
2025-04-08 23:52:16 +10:00
Damien George
0ee160e7c0 extmod/extmod.mk: Add cyw43_spi.c to list of sources.
This file is part of the updated cyw43-driver.  It will only be used if
`CYW43_USE_SPI` is enabled.

Signed-off-by: Damien George <damien@micropython.org>
2025-04-08 23:52:12 +10:00
Angus Gratton
cccac2cc01 rp2,esp32,extmod: Implement UPDATE_SUBMODULES in CMake.
Rather than having Make calling CMake to generate a list of submodules and
then run a Make target (which is complex and prone to masking other
errors), implement the submodule update logic in CMake itself.

Internal CMake-side changes are that GIT_SUBMODULES is now a CMake list,
and the trigger variable name is changed from ECHO_SUBMODULES to
UPDATE_SUBMODULES.

The run is otherwise 100% a normal CMake run now, so most of the other
special casing can be removed.

Signed-off-by: Angus Gratton <angus@redyak.com.au>
2025-03-27 17:51:12 +11:00
Damien George
e4051a1ca6 extmod/vfs_rom: Implement minimal VfsRom.getcwd() method.
This is needed if you chdir to a ROMFS and want to query your current
directory.

Prior to this change, using `os.getcwd()` when in a ROMFS would raise:

    AttributeError: 'VfsRom' object has no attribute 'getcwd'

Signed-off-by: Damien George <damien@micropython.org>
2025-03-27 17:04:12 +11:00
Anson Mansfield
1487a13079 extmod/vfs: Return mount table from no-args vfs.mount call.
This extends the existing `vfs.mount()` function to accept zero arguments,
in which case it returns a list of tuples of mounted filesystem objects
and their mount location.

Signed-off-by: Anson Mansfield <amansfield@mantaro.com>
2025-03-27 16:37:04 +11:00
Anson Mansfield
458a8f2e15 extmod/vfs: Refactor mp_vfs_mount to enable no-args mount overload.
Signed-off-by: Anson Mansfield <amansfield@mantaro.com>
2025-03-27 16:37:01 +11:00
Damien George
fa42487e45 extmod/moddeflate: Keep DeflateIO state consistent on window alloc fail.
Allocation of a large compression window may fail, and in that case keep
the `DeflateIO` state consistent so its other methods (such as `close()`)
still work.  Consistency is kept by only updating the `self->write` member
if the window allocation succeeds.

Thanks to @jimmo for finding the bug.

Signed-off-by: Damien George <damien@micropython.org>
2025-03-27 11:58:59 +11:00
Damien George
dafff1fd0e extmod/network_cyw43: Add WPA3 security constants.
These are now supported by cyw43-driver.

Signed-off-by: Damien George <damien@micropython.org>
2025-03-12 13:17:02 +11:00
Damien George
d4b8ca2ffc extmod/vfs: Add mp_vfs_mount_romfs_protected() helper.
This function will attempt to create a `VfsRom` instance and mount it at
location "/rom" in the filesystem.

Signed-off-by: Damien George <damien@micropython.org>
2025-03-06 12:52:35 +11:00
Damien George
89e6c58c80 extmod/modvfs: Add vfs.rom_ioctl function and its ioctl constants.
This is a generic interface to allow querying and modifying the read-only
memory area of a device, if it has such an area.

Signed-off-by: Damien George <damien@micropython.org>
2025-03-06 12:52:35 +11:00
Damien George
14ba32bb20 extmod/vfs_rom: Add bounds checking for all filesystem accesses.
Testing with ROMFS shows that it is relatively easy to end up with a
corrupt filesystem on the device -- eg due to the ROMFS deploy process
stopping half way through -- which could lead to hard crashes.  Notably,
there can be boot loops trying to mount a corrupt filesystem, crashes when
importing modules like `os` that first scan the filesystem for `os.py`, and
crashing when deploying a new ROMFS in certain cases because the old one is
removed while still mounted.

The main problem is that `mp_decode_uint()` has an loop that keeps going as
long as it reads 0xff byte values, which can happen in the case of erased
and unwritten flash.

This commit adds full bounds checking in the new `mp_decode_uint_checked()`
function, and that makes all ROMFS filesystem accesses robust.

Signed-off-by: Damien George <damien@micropython.org>
2025-02-26 16:11:19 +11:00