From 89b91493ef11ea03a2f57c647fab3629646cbcab Mon Sep 17 00:00:00 2001 From: Liz Date: Tue, 15 Apr 2025 13:23:51 -0400 Subject: [PATCH 01/76] adding feather rp2350 adalogger --- .../adafruit_feather_rp2350_adalogger/board.c | 9 +++ .../mpconfigboard.h | 29 +++++++++ .../mpconfigboard.mk | 10 +++ .../pico-sdk-configboard.h | 10 +++ .../adafruit_feather_rp2350_adalogger/pins.c | 61 +++++++++++++++++++ 5 files changed, 119 insertions(+) create mode 100644 ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/board.c create mode 100644 ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.h create mode 100644 ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.mk create mode 100644 ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pico-sdk-configboard.h create mode 100644 ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/board.c b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/board.c new file mode 100644 index 0000000000000..e6a868ab21226 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/board.c @@ -0,0 +1,9 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/board.h" + +// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here. diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.h b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.h new file mode 100644 index 0000000000000..b77664cf85c11 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.h @@ -0,0 +1,29 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#define MICROPY_HW_BOARD_NAME "Adafruit Feather RP2350 Adalogger" +#define MICROPY_HW_MCU_NAME "rp2350a" + +#define MICROPY_HW_NEOPIXEL (&pin_GPIO21) + +#define DEFAULT_I2C_BUS_SCL (&pin_GPIO3) +#define DEFAULT_I2C_BUS_SDA (&pin_GPIO2) + +#define DEFAULT_SPI_BUS_SCK (&pin_GPIO22) +#define DEFAULT_SPI_BUS_MOSI (&pin_GPIO23) +#define DEFAULT_SPI_BUS_MISO (&pin_GPIO20) + +#define DEFAULT_UART_BUS_RX (&pin_GPIO1) +#define DEFAULT_UART_BUS_TX (&pin_GPIO0) + +#define CIRCUITPY_PSRAM_CHIP_SELECT (&pin_GPIO8) + +#define DEFAULT_SD_SCK (&pin_GPIO14) +#define DEFAULT_SD_MOSI (&pin_GPIO15) +#define DEFAULT_SD_MISO (&pin_GPIO16) +#define DEFAULT_SD_CS (&pin_GPIO19) +#define DEFAULT_SD_CARD_DETECT (&pin_GPIO13) +#define DEFAULT_SD_CARD_INSERTED false diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.mk b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.mk new file mode 100644 index 0000000000000..88cce7c4a4ce9 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/mpconfigboard.mk @@ -0,0 +1,10 @@ +USB_VID = 0x239A +USB_PID = 0x816E +USB_PRODUCT = "Feather RP2350 Adalogger" +USB_MANUFACTURER = "Adafruit" + +CHIP_VARIANT = RP2350 +CHIP_PACKAGE = A +CHIP_FAMILY = rp2 + +EXTERNAL_FLASH_DEVICES = "GD25Q64C,W25Q64JVxQ" diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pico-sdk-configboard.h b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pico-sdk-configboard.h new file mode 100644 index 0000000000000..2d9283a9192f2 --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pico-sdk-configboard.h @@ -0,0 +1,10 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2021 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Put board-specific pico-sdk definitions here. This file must exist. + +// Allow extra time for xosc to start. +#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64 diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c new file mode 100644 index 0000000000000..65be197e41bac --- /dev/null +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c @@ -0,0 +1,61 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2024 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "shared-bindings/board/__init__.h" + +static const mp_rom_map_elem_t board_module_globals_table[] = { + CIRCUITPYTHON_BOARD_DICT_STANDARD_ITEMS + + { MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_GPIO26) }, + { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, + { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, + { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_GPIO24) }, + { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO22) }, + { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO23) }, + { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO20) }, + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO0) }, + + { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO2) }, + { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO3) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, + { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, + { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, + { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, + { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) }, + { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO7) }, + + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO21) }, + + { MP_ROM_QSTR(MP_QSTR_SD_CARD_DETECT), MP_ROM_PTR(&pin_GPIO13) }, + { MP_ROM_QSTR(MP_QSTR_SD_CLK), MP_ROM_PTR(&pin_GPIO14) }, + + { MP_ROM_QSTR(MP_QSTR_SD_MOSI), MP_ROM_PTR(&pin_GPIO15) }, + { MP_ROM_QSTR(MP_QSTR_SD_CMD), MP_ROM_PTR(&pin_GPIO15) }, + + { MP_ROM_QSTR(MP_QSTR_SD_MISO), MP_ROM_PTR(&pin_GPIO16) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT0), MP_ROM_PTR(&pin_GPIO16) }, + + { MP_ROM_QSTR(MP_QSTR_SD_DAT1), MP_ROM_PTR(&pin_GPIO17) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT2), MP_ROM_PTR(&pin_GPIO18) }, + + { MP_ROM_QSTR(MP_QSTR_SD_CS), MP_ROM_PTR(&pin_GPIO19) }, + { MP_ROM_QSTR(MP_QSTR_SD_DAT3), MP_ROM_PTR(&pin_GPIO19) }, + + { MP_ROM_QSTR(MP_QSTR_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_STEMMA_I2C), MP_ROM_PTR(&board_i2c_obj) }, + { MP_ROM_QSTR(MP_QSTR_SPI), MP_ROM_PTR(&board_spi_obj) }, + { MP_ROM_QSTR(MP_QSTR_UART), MP_ROM_PTR(&board_uart_obj) }, +}; +MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table); From 7b7b10a4968eee5e3645f26a503cd2469c900723 Mon Sep 17 00:00:00 2001 From: Liz <23021834+BlitzCityDIY@users.noreply.github.com> Date: Tue, 15 Apr 2025 14:30:26 -0400 Subject: [PATCH 02/76] Update ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c Co-authored-by: Dan Halbert --- .../adafruit_feather_rp2350_adalogger/pins.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c index 65be197e41bac..d957e6f652209 100644 --- a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c @@ -13,28 +13,32 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_GPIO27) }, { MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_GPIO28) }, { MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_GPIO29) }, + { MP_ROM_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_GPIO24) }, { MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_GPIO25) }, + { MP_ROM_QSTR(MP_QSTR_SCK), MP_ROM_PTR(&pin_GPIO22) }, { MP_ROM_QSTR(MP_QSTR_MOSI), MP_ROM_PTR(&pin_GPIO23) }, { MP_ROM_QSTR(MP_QSTR_MISO), MP_ROM_PTR(&pin_GPIO20) }, - { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_RX), MP_ROM_PTR(&pin_GPIO1) }, - { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_GPIO1) }, + { MP_ROM_QSTR(MP_QSTR_TX), MP_ROM_PTR(&pin_GPIO0) }, + { MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_GPIO0) }, { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO2) }, { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO3) }, + + { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO4) }, { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, { MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_GPIO10) }, { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) }, - { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, - { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO4) }, - { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO7) }, - { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO7) }, { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO21) }, From eae8d2ab6aab083aedd52c906a4f6c090a65fdbd Mon Sep 17 00:00:00 2001 From: Liz <23021834+BlitzCityDIY@users.noreply.github.com> Date: Tue, 15 Apr 2025 14:47:24 -0400 Subject: [PATCH 03/76] Update ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c Co-authored-by: Dan Halbert --- .../boards/adafruit_feather_rp2350_adalogger/pins.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c index d957e6f652209..2240a1678fefd 100644 --- a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c @@ -30,7 +30,9 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_SDA), MP_ROM_PTR(&pin_GPIO2) }, { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO3) }, - { MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D12, MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, { MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_GPIO9) }, From 10b1087fc9234ddd806f1103a12f641d8af3b56a Mon Sep 17 00:00:00 2001 From: Liz <23021834+BlitzCityDIY@users.noreply.github.com> Date: Tue, 15 Apr 2025 14:47:34 -0400 Subject: [PATCH 04/76] Update ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c Co-authored-by: Dan Halbert --- .../boards/adafruit_feather_rp2350_adalogger/pins.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c index 2240a1678fefd..929c3f8ba1b69 100644 --- a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c @@ -40,7 +40,9 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_GPIO11) }, { MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_GPIO7) }, - { MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_IO7), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_GPIO7) }, + { MP_ROM_QSTR(MP_QSTR_NEOPIXEL), MP_ROM_PTR(&pin_GPIO21) }, From c9b81971f82ad997aa400d7a397d9c05bfc06f00 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Tue, 15 Apr 2025 15:01:34 -0400 Subject: [PATCH 05/76] Update ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c --- .../raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c index 929c3f8ba1b69..ac9a29abaad96 100644 --- a/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c +++ b/ports/raspberrypi/boards/adafruit_feather_rp2350_adalogger/pins.c @@ -31,7 +31,7 @@ static const mp_rom_map_elem_t board_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR_SCL), MP_ROM_PTR(&pin_GPIO3) }, { MP_ROM_QSTR(MP_QSTR_IO4), MP_ROM_PTR(&pin_GPIO4) }, - { MP_ROM_QSTR(MP_QSTR_D12, MP_ROM_PTR(&pin_GPIO4) }, + { MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_GPIO4) }, { MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_GPIO5) }, { MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_GPIO6) }, From 973cd4bc4563f1a7136461f3b66abe9cfbabdf94 Mon Sep 17 00:00:00 2001 From: eightycc Date: Wed, 16 Apr 2025 15:35:48 -0700 Subject: [PATCH 06/76] Upgrade ESP-IDF v5.3.2 to v5.4.1. --- .gitmodules | 4 ++-- ports/espressif/Makefile | 3 +++ ports/espressif/esp-idf | 2 +- ports/espressif/mphalport.c | 20 +------------------- ports/espressif/supervisor/usb.c | 10 +--------- 5 files changed, 8 insertions(+), 31 deletions(-) diff --git a/.gitmodules b/.gitmodules index f52ca8e7fa756..f297dae584738 100644 --- a/.gitmodules +++ b/.gitmodules @@ -142,8 +142,8 @@ url = https://github.com/adafruit/Adafruit_CircuitPython_RFM69.git [submodule "ports/espressif/esp-idf"] path = ports/espressif/esp-idf - url = https://github.com/adafruit/esp-idf.git - branch = circuitpython-v5.3.2 + url = https://github.com/eightycc/esp-idf.git + branch = circuitpython-v5.4.1 [submodule "ports/espressif/esp-protocols"] path = ports/espressif/esp-protocols url = https://github.com/adafruit/esp-protocols.git diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index ea6b91fdf4ca6..def6ab10dcff8 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -83,6 +83,8 @@ INC += \ -isystem esp-idf/components/esp_psram/include \ -isystem esp-idf/components/esp_ringbuf/include \ -isystem esp-idf/components/esp_rom/include \ + -isystem esp-idf/components/esp_rom/$(IDF_TARGET)/include \ + -isystem esp-idf/components/esp_rom/$(IDF_TARGET)/include/$(IDF_TARGET) \ -isystem esp-idf/components/esp_system/include \ -isystem esp-idf/components/esp_timer/include \ -isystem esp-idf/components/esp_wifi/include \ @@ -115,6 +117,7 @@ INC += \ -isystem esp-idf/components/sdmmc/include \ -isystem esp-idf/components/soc/include \ -isystem esp-idf/components/soc/$(IDF_TARGET)/include \ + -isystem esp-idf/components/soc/$(IDF_TARGET)/register \ -isystem esp-idf/components/spi_flash/include \ -isystem esp-idf/components/usb/include \ -isystem esp-idf/components/ulp/ulp_fsm/include \ diff --git a/ports/espressif/esp-idf b/ports/espressif/esp-idf index f388200aba738..4c2820d377d13 160000 --- a/ports/espressif/esp-idf +++ b/ports/espressif/esp-idf @@ -1 +1 @@ -Subproject commit f388200aba73826b9039be6f4fb5385c6b7136c6 +Subproject commit 4c2820d377d1375e787bcef612f0c32c1427d183 diff --git a/ports/espressif/mphalport.c b/ports/espressif/mphalport.c index 87b16ac3e4ca1..d6a7ef1bfce41 100644 --- a/ports/espressif/mphalport.c +++ b/ports/espressif/mphalport.c @@ -8,25 +8,7 @@ #include "py/mphal.h" #include "supervisor/cpu.h" -#if defined(CONFIG_IDF_TARGET_ESP32) -#include "components/esp_rom/include/esp32/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32C2) -#include "components/esp_rom/include/esp32c2/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32P4) -#include "components/esp_rom/include/esp32p4/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32C3) -#include "components/esp_rom/include/esp32c3/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32C6) -#include "components/esp_rom/include/esp32c6/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32H2) -#include "components/esp_rom/include/esp32h2/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32S2) -#include "components/esp_rom/include/esp32s2/rom/ets_sys.h" -#elif defined(CONFIG_IDF_TARGET_ESP32S3) -#include "components/esp_rom/include/esp32s3/rom/ets_sys.h" -#else -#error Unknown CONFIG_IDF_TARGET_xxx -#endif +#include "rom/ets_sys.h" #include "esp_attr.h" diff --git a/ports/espressif/supervisor/usb.c b/ports/espressif/supervisor/usb.c index c2bf90b21b1f4..612abaa808ae2 100644 --- a/ports/espressif/supervisor/usb.c +++ b/ports/espressif/supervisor/usb.c @@ -20,15 +20,7 @@ #include "driver/gpio.h" #include "esp_private/periph_ctrl.h" -#if defined(CONFIG_IDF_TARGET_ESP32C3) -#include "components/esp_rom/include/esp32c3/rom/gpio.h" -#elif defined(CONFIG_IDF_TARGET_ESP32C6) -#include "components/esp_rom/include/esp32c6/rom/gpio.h" -#elif defined(CONFIG_IDF_TARGET_ESP32S2) -#include "components/esp_rom/include/esp32s2/rom/gpio.h" -#elif defined(CONFIG_IDF_TARGET_ESP32S3) -#include "components/esp_rom/include/esp32s3/rom/gpio.h" -#endif +#include "rom/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" From 94f1ec6523e0e87287f21877c4ac414a3b0821e1 Mon Sep 17 00:00:00 2001 From: eightycc Date: Wed, 16 Apr 2025 15:44:03 -0700 Subject: [PATCH 07/76] Get updated ESP-IDF branch circuitpython-v5.4.1. --- ports/espressif/esp-idf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/espressif/esp-idf b/ports/espressif/esp-idf index 4c2820d377d13..8a8c214ea69e7 160000 --- a/ports/espressif/esp-idf +++ b/ports/espressif/esp-idf @@ -1 +1 @@ -Subproject commit 4c2820d377d1375e787bcef612f0c32c1427d183 +Subproject commit 8a8c214ea69e72ea5a5e6152ffbf66afb2affcae From 45b8f76fe3d88b553648130ec945e63802572dd2 Mon Sep 17 00:00:00 2001 From: eightycc Date: Thu, 17 Apr 2025 07:02:46 -0700 Subject: [PATCH 08/76] ESP-IDF 5.4.1 update: Add esp_security component, fixup flash spi clock speed settings. --- ports/espressif/Makefile | 3 ++- ports/espressif/esp-idf | 2 +- .../esp-idf-config/sdkconfig-flash-120m.defaults | 13 ------------- .../esp-idf-config/sdkconfig-flash-40m.defaults | 13 ------------- .../esp-idf-config/sdkconfig-flash-48m.defaults | 13 ------------- .../esp-idf-config/sdkconfig-flash-60m.defaults | 13 ------------- .../esp-idf-config/sdkconfig-flash-80m.defaults | 13 ------------- 7 files changed, 3 insertions(+), 67 deletions(-) diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index def6ab10dcff8..927906d5a0f2d 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -85,6 +85,7 @@ INC += \ -isystem esp-idf/components/esp_rom/include \ -isystem esp-idf/components/esp_rom/$(IDF_TARGET)/include \ -isystem esp-idf/components/esp_rom/$(IDF_TARGET)/include/$(IDF_TARGET) \ + -isystem esp-idf/components/esp_security/include \ -isystem esp-idf/components/esp_system/include \ -isystem esp-idf/components/esp_timer/include \ -isystem esp-idf/components/esp_wifi/include \ @@ -597,7 +598,7 @@ endif ESP_IDF_COMPONENTS_LINK = $(IDF_TARGET_ARCH) $(CHIP_COMPONENTS) app_update bootloader_support driver esp_driver_gpio esp_driver_gptimer esp_driver_i2c esp_driver_ledc esp_driver_spi esp_driver_uart efuse esp_adc esp_app_format esp_common esp_event esp_hw_support esp_mm esp_partition esp_pm esp_ringbuf esp_rom esp_system esp_timer freertos hal heap log newlib nvs_flash pthread soc spi_flash vfs esp_vfs_console ifneq ($(CIRCUITPY_WIFI),0) - ESP_IDF_COMPONENTS_LINK += esp_coex esp_netif esp-tls esp_wifi lwip mbedtls mdns wpa_supplicant esp_phy + ESP_IDF_COMPONENTS_LINK += esp_coex esp_netif esp_security esp-tls esp_wifi lwip mbedtls mdns wpa_supplicant esp_phy endif ifneq ($(CIRCUITPY_BLEIO_NATIVE),0) BLE_IMPL_esp32 := esp32 diff --git a/ports/espressif/esp-idf b/ports/espressif/esp-idf index 8a8c214ea69e7..e6c5c73c5b6ca 160000 --- a/ports/espressif/esp-idf +++ b/ports/espressif/esp-idf @@ -1 +1 @@ -Subproject commit 8a8c214ea69e72ea5a5e6152ffbf66afb2affcae +Subproject commit e6c5c73c5b6caa552c56e724facb3faa596e3022 diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-120m.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-120m.defaults index fadf55d8d7966..6a2285a2936aa 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-flash-120m.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-120m.defaults @@ -1,15 +1,2 @@ CONFIG_ESPTOOLPY_FLASHFREQ_120M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_64M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_60M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_48M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_32M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_30M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_24M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_15M is not set -CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT=y CONFIG_SPI_FLASH_UNDER_HIGH_FREQ=y diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-40m.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-40m.defaults index 235a62a57ee0a..ffc4b5c1cb8fe 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-flash-40m.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-40m.defaults @@ -1,14 +1 @@ -# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_64M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_60M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_48M is not set CONFIG_ESPTOOLPY_FLASHFREQ_40M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_32M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_30M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_24M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_15M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT is not set diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-48m.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-48m.defaults index b710fd22554e1..f6838e88703b7 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-flash-48m.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-48m.defaults @@ -1,14 +1 @@ -# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_64M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_60M is not set CONFIG_ESPTOOLPY_FLASHFREQ_48M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_32M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_30M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_24M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_15M is not set -CONFIG_ESPTOOLPY_FLASHFREQ_48M_DEFAULT=y diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-60m.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-60m.defaults index 7068d0ce74082..797665f527fb9 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-flash-60m.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-60m.defaults @@ -1,14 +1 @@ -# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_64M is not set CONFIG_ESPTOOLPY_FLASHFREQ_60M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_48M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_32M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_30M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_24M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_15M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT is not set diff --git a/ports/espressif/esp-idf-config/sdkconfig-flash-80m.defaults b/ports/espressif/esp-idf-config/sdkconfig-flash-80m.defaults index 2ea4419003797..7014fa95495b2 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-flash-80m.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-flash-80m.defaults @@ -1,14 +1 @@ -# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set CONFIG_ESPTOOLPY_FLASHFREQ_80M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_64M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_60M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_48M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_32M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_30M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_24M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_16M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_15M is not set -CONFIG_ESPTOOLPY_FLASHFREQ_80M_DEFAULT=y From 521fb5ac117798bdf4665193b61e0b5277ba7634 Mon Sep 17 00:00:00 2001 From: eightycc Date: Thu, 17 Apr 2025 11:38:39 -0700 Subject: [PATCH 09/76] Workaround ESP-IDF issue #15035. --- .github/actions/deps/ports/espressif/action.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/actions/deps/ports/espressif/action.yml b/.github/actions/deps/ports/espressif/action.yml index 122940bb95a1e..25965eb7ef040 100644 --- a/.github/actions/deps/ports/espressif/action.yml +++ b/.github/actions/deps/ports/espressif/action.yml @@ -7,6 +7,7 @@ runs: run: | echo >> $GITHUB_ENV "IDF_PATH=$GITHUB_WORKSPACE/ports/espressif/esp-idf" echo >> $GITHUB_ENV "IDF_TOOLS_PATH=$GITHUB_WORKSPACE/.idf_tools" + echo >> $GITHUB_ENV "ESP_ROM_ELF_DIR=$GITHUB_WORKSPACE/.idf_tools" shell: bash - name: Get IDF commit From f834b771af20d8b59784caa6f5a7aa04dbd1d48b Mon Sep 17 00:00:00 2001 From: eightycc Date: Thu, 17 Apr 2025 12:55:21 -0700 Subject: [PATCH 10/76] Update ESP32 MSPI IOMUX pin names. --- ports/espressif/supervisor/port.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ports/espressif/supervisor/port.c b/ports/espressif/supervisor/port.c index b84b2c49a3182..2217cf503dc8a 100644 --- a/ports/espressif/supervisor/port.c +++ b/ports/espressif/supervisor/port.c @@ -190,8 +190,8 @@ static void _never_reset_spi_ram_flash(void) { const uint32_t spiconfig = esp_rom_efuse_get_flash_gpio_info(); if (spiconfig == ESP_ROM_EFUSE_FLASH_DEFAULT_SPI) { - never_reset_pin_number(SPI_IOMUX_PIN_NUM_CLK); - never_reset_pin_number(SPI_IOMUX_PIN_NUM_CS); + never_reset_pin_number(MSPI_IOMUX_PIN_NUM_CLK); + never_reset_pin_number(MSPI_IOMUX_PIN_NUM_CS0); never_reset_pin_number(PSRAM_SPIQ_SD0_IO); never_reset_pin_number(PSRAM_SPID_SD1_IO); never_reset_pin_number(PSRAM_SPIWP_SD3_IO); From 010b8a2b5a15f8430f28d568443fc98f922edab4 Mon Sep 17 00:00:00 2001 From: eightycc Date: Fri, 18 Apr 2025 06:45:58 -0700 Subject: [PATCH 11/76] Update esp-idf with cherry-picked commit 793e394 to resolve missing __atomic_test_and_set. --- ports/espressif/esp-idf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/espressif/esp-idf b/ports/espressif/esp-idf index e6c5c73c5b6ca..f50ec8ecdb31f 160000 --- a/ports/espressif/esp-idf +++ b/ports/espressif/esp-idf @@ -1 +1 @@ -Subproject commit e6c5c73c5b6caa552c56e724facb3faa596e3022 +Subproject commit f50ec8ecdb31f681e6a778f145de95f849c1089d From c127f661a2dbec775ca247bf9961c0943dcd151e Mon Sep 17 00:00:00 2001 From: eightycc Date: Fri, 18 Apr 2025 07:21:22 -0700 Subject: [PATCH 12/76] Add ESP-IDF component esp_security for BLE-only parts. --- ports/espressif/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index 927906d5a0f2d..6c320f648efb1 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -609,7 +609,7 @@ ifneq ($(CIRCUITPY_BLEIO_NATIVE),0) BLE_IMPL_esp32h2 := libble BLE_IMPL = $(BLE_IMPL_$(IDF_TARGET)) - ESP_IDF_COMPONENTS_LINK += bt esp_phy + ESP_IDF_COMPONENTS_LINK += bt esp_phy esp_security ifeq ($(BLE_IMPL),esp32) # BLE will hang the ESP32 and trigger an interrupt watchdog without this undefined symbol at # link because a weak version of the interrupt that BLE uses will be linked incorrectly. From 7cc3f10f1e209b1738f2377d3735639b8d0803db Mon Sep 17 00:00:00 2001 From: eightycc Date: Fri, 18 Apr 2025 09:43:36 -0700 Subject: [PATCH 13/76] Remove CIRCUITPY_ESPCAMERA from ESP32-S2 to free up DRAM. --- ports/espressif/mpconfigport.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/espressif/mpconfigport.mk b/ports/espressif/mpconfigport.mk index 31522795a165a..a2a2ec7894d3f 100644 --- a/ports/espressif/mpconfigport.mk +++ b/ports/espressif/mpconfigport.mk @@ -250,6 +250,9 @@ CIRCUITPY_AUDIOIO = 1 # No BLE in hw CIRCUITPY_BLEIO_NATIVE = 0 +# Not enough DRAM for this with ESP-IDF 5.4.1 +CIRCUITPY_ESPCAMERA = 0 + # No SDMMC CIRCUITPY_SDIOIO = 0 From bdbd4af809191f2a2c5d2871adeb9dc97e81aeeb Mon Sep 17 00:00:00 2001 From: eightycc Date: Fri, 18 Apr 2025 10:24:29 -0700 Subject: [PATCH 14/76] Add ESP-IDF component esp_security to ESP32-P4. --- ports/espressif/Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index 6c320f648efb1..3a07cc5438e2e 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -631,6 +631,9 @@ ifneq ($(CIRCUITPY_BLEIO_NATIVE),0) endif endif endif +ifeq ($(IDF_TARGET),esp32p4) + ESP_IDF_COMPONENTS_LINK += esp_security +endif ifneq ($(CIRCUITPY_ESPULP),0) ESP_IDF_COMPONENTS_LINK += ulp endif From 06d9ff4ec9853ca608dfc3ff0226a755d931cafb Mon Sep 17 00:00:00 2001 From: eightycc Date: Fri, 18 Apr 2025 11:24:46 -0700 Subject: [PATCH 15/76] Temporarily remove ULAB from ESP32-C6 to avoid flash overflow. --- ports/espressif/mpconfigport.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/espressif/mpconfigport.mk b/ports/espressif/mpconfigport.mk index a2a2ec7894d3f..549bf8698808a 100644 --- a/ports/espressif/mpconfigport.mk +++ b/ports/espressif/mpconfigport.mk @@ -184,6 +184,9 @@ CIRCUITPY_TOUCHIO_USE_NATIVE = 0 CIRCUITPY_USB_DEVICE = 0 CIRCUITPY_ESP_USB_SERIAL_JTAG ?= 1 +# Remove temporarily until 10265 is merged +CIRCUITPY_ULAB = 0 + else ifeq ($(IDF_TARGET),esp32h2) # Modules CIRCUITPY_ESPCAMERA = 0 From 22519d88b8e88f28a0cd3cf8d808ed4867332407 Mon Sep 17 00:00:00 2001 From: eightycc Date: Sat, 19 Apr 2025 09:13:00 -0700 Subject: [PATCH 16/76] Restore ESP_CAMERA to ESP32-S2, resolve dram overflow by specifying CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH. --- ports/espressif/esp-idf-config/sdkconfig-esp32s2.defaults | 6 ++++++ ports/espressif/mpconfigport.mk | 3 --- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ports/espressif/esp-idf-config/sdkconfig-esp32s2.defaults b/ports/espressif/esp-idf-config/sdkconfig-esp32s2.defaults index 66e06667a1a81..5c748bd0e6f02 100644 --- a/ports/espressif/esp-idf-config/sdkconfig-esp32s2.defaults +++ b/ports/espressif/esp-idf-config/sdkconfig-esp32s2.defaults @@ -58,6 +58,12 @@ CONFIG_ULP_COPROC_TYPE_RISCV=y # Note: enabling both ULPs simultaneously only w CONFIG_ULP_COPROC_RESERVE_MEM=8176 # end of Ultra Low Power (ULP) Co-processor +# +# FreeRTOS +# +CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y +# end of FreeRTOS + # end of Component config # end of Espressif IoT Development Framework Configuration diff --git a/ports/espressif/mpconfigport.mk b/ports/espressif/mpconfigport.mk index 549bf8698808a..d7037fa5217ef 100644 --- a/ports/espressif/mpconfigport.mk +++ b/ports/espressif/mpconfigport.mk @@ -253,9 +253,6 @@ CIRCUITPY_AUDIOIO = 1 # No BLE in hw CIRCUITPY_BLEIO_NATIVE = 0 -# Not enough DRAM for this with ESP-IDF 5.4.1 -CIRCUITPY_ESPCAMERA = 0 - # No SDMMC CIRCUITPY_SDIOIO = 0 From aeb5bacc566ead1da1b3df76cca9101e1a704b74 Mon Sep 17 00:00:00 2001 From: eightycc Date: Thu, 24 Apr 2025 09:25:07 -0700 Subject: [PATCH 17/76] Remove *.rom.newlib-time.ld from link of esp32, esp32c3, and esp32s2 to resolve newlib stat struct mismatch. --- ports/espressif/Makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index 3a07cc5438e2e..7806e6be28275 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -242,7 +242,6 @@ ifeq ($(IDF_TARGET),esp32) LDFLAGS += \ -Tesp32.rom.newlib-data.ld \ -Tesp32.rom.newlib-funcs.ld \ - -Tesp32.rom.newlib-time.ld \ -Tesp32.rom.spiflash_legacy.ld CHIP_COMPONENTS = \ @@ -265,7 +264,6 @@ CHIP_COMPONENTS = \ else ifeq ($(IDF_TARGET),esp32c3) LDFLAGS += \ -Tesp32c3.rom.newlib.ld \ - -Tesp32c3.rom.newlib-time.ld \ -Tesp32c3.rom.version.ld \ -Tesp32c3.rom.eco3.ld \ -Tesp32c3.rom.bt_funcs.ld @@ -312,7 +310,6 @@ else ifeq ($(IDF_TARGET),esp32s2) LDFLAGS += \ -Tesp32s2.rom.newlib-data.ld \ -Tesp32s2.rom.newlib-funcs.ld \ - -Tesp32s2.rom.newlib-time.ld \ -Tesp32s2.rom.spiflash_legacy.ld CHIP_COMPONENTS = \ From 1942d5ebd7641ee7e809f657b6eb6406feb326c4 Mon Sep 17 00:00:00 2001 From: eightycc Date: Thu, 24 Apr 2025 10:17:25 -0700 Subject: [PATCH 18/76] Temporarily disable CIRCUITPY_CANIO for mixgo_ce_udisk board to work around flash overflow for ru translation. --- ports/espressif/boards/mixgo_ce_udisk/mpconfigboard.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/ports/espressif/boards/mixgo_ce_udisk/mpconfigboard.mk b/ports/espressif/boards/mixgo_ce_udisk/mpconfigboard.mk index 691da625e0358..a6a8cd7fa00eb 100644 --- a/ports/espressif/boards/mixgo_ce_udisk/mpconfigboard.mk +++ b/ports/espressif/boards/mixgo_ce_udisk/mpconfigboard.mk @@ -10,6 +10,7 @@ CIRCUITPY_ESP_FLASH_FREQ = 80m CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_AESIO = 0 +CIRCUITPY_CANIO = 0 CIRCUITPY_CODEOP = 0 CIRCUITPY_ESPCAMERA = 0 From 62d16ce61fdd1ec8cfb0d70a6240ad877c12df21 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Fri, 25 Apr 2025 15:14:20 -0400 Subject: [PATCH 19/76] Fix TLS for v5.4.1 update Cert bundle code in lib/mbedtls_config was being used, and assumed the older ESP-IDF internal bundle format, which was changed in ESP-IDF v5.4. Added a wrapper around the ESP-IDF bundle routines, and stopped using the shared bundle code. Also fixed extraneous blank lines in mbedtls logging and removed an extraneous, unused, damaged .h. --- lib/mbedtls_config/mbedtls_config_port.h | 67 --------------------- ports/espressif/Makefile | 14 ++--- ports/espressif/common-hal/ssl/crt_bundle.c | 37 ++++++++++++ shared-module/ssl/SSLSocket.c | 2 +- 4 files changed, 45 insertions(+), 75 deletions(-) delete mode 100644 lib/mbedtls_config/mbedtls_config_port.h create mode 100644 ports/espressif/common-hal/ssl/crt_bundle.c diff --git a/lib/mbedtls_config/mbedtls_config_port.h b/lib/mbedtls_config/mbedtls_config_port.h deleted file mode 100644 index 1752d946529f2..0000000000000 --- a/lib/mbedtls_config/mbedtls_config_port.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This file is part of the MicroPython project, http://micropython.org/ - * - * The MIT License (MIT) - * - * Copyright (c) 2018-2019 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. - */ -#ifndef MICROPY_INCLUDED_MBEDTLS_CONFIG_H -#define MICROPY_INCLUDED_MBEDTLS_CONFIG_H - -// If you want to debug MBEDTLS uncomment the following and -// Pass 3 to mbedtls_debug_set_threshold in socket_new -// #define MBEDTLS_DEBUG_C - -// Set mbedtls configuration -#define MBEDTLS_PLATFORM_C -#define MBEDTLS_PLATFORM_MEMORY -#define MBEDTLS_PLATFORM_NO_STD_FUNCTIONS -#define MBEDTLS_DEPRECATED_REMOVED -#define MBEDTLS_ENTROPY_HARDWARE_ALT - -// Enable mbedtls modules -#define MBEDTLS_MD_C -#define MBEDTLS_MD5_C -#define MBEDTLS_SHA1_C -#define MBEDTLS_SHA256_C -#define MBEDTLS_SHA512_C -#undef MBEDTLS_HAVE_TIME_DATE - -<<<<<<<< HEAD:lib/mbedtls_config/mbedtls_config_hashlib.h -// Memory allocation hooks -#include -#include -void *m_tracked_calloc(size_t nmemb, size_t size); -void m_tracked_free(void *ptr); -#define MBEDTLS_PLATFORM_STD_CALLOC m_tracked_calloc -#define MBEDTLS_PLATFORM_STD_FREE m_tracked_free -#define MBEDTLS_PLATFORM_SNPRINTF_MACRO snprintf -======== -// Time hook -#include -time_t rp2_rtctime_seconds(time_t *timer); -#define MBEDTLS_PLATFORM_TIME_MACRO rp2_rtctime_seconds -#define MBEDTLS_PLATFORM_MS_TIME_ALT mbedtls_ms_time ->>>>>>>> v1.23.0:lib/mbedtls_config/mbedtls_config_port.h - -#include "mbedtls/check_config.h" - -#endif /* MICROPY_INCLUDED_MBEDTLS_CONFIG_H */ diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index 7806e6be28275..09fa76e79fbea 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -175,12 +175,12 @@ ifeq ($(DEBUG), 1) OPTIMIZATION_FLAGS ?= -Og CFLAGS += -DDEBUG endif - # You may want to enable these flags to make setting breakpoints easier. - # CFLAGS += -fno-inline -fno-ipa-sra +# You may want to enable these flags to make setting breakpoints easier. +# CFLAGS += -fno-inline -fno-ipa-sra else CFLAGS += -DNDEBUG - # RISC-V is larger than xtensa - # Use -Os for RISC-V when it overflows +# RISC-V is larger than xtensa +# Use -Os for RISC-V when it overflows ifeq ($(IDF_TARGET_ARCH),riscv) OPTIMIZATION_FLAGS ?= -Os else @@ -384,7 +384,7 @@ SRC_C += \ peripherals/$(IDF_TARGET)/pins.c ifeq ($(CIRCUITPY_SSL),1) -SRC_C += lib/mbedtls_config/crt_bundle.c +SRC_C += common-hal/ssl/crt_bundle.c endif SRC_C += $(wildcard common-hal/espidf/*.c) @@ -608,8 +608,8 @@ ifneq ($(CIRCUITPY_BLEIO_NATIVE),0) ESP_IDF_COMPONENTS_LINK += bt esp_phy esp_security ifeq ($(BLE_IMPL),esp32) - # BLE will hang the ESP32 and trigger an interrupt watchdog without this undefined symbol at - # link because a weak version of the interrupt that BLE uses will be linked incorrectly. +# BLE will hang the ESP32 and trigger an interrupt watchdog without this undefined symbol at +# link because a weak version of the interrupt that BLE uses will be linked incorrectly. REGISTRATION_FUNCTIONS += -u ld_include_hli_vectors_bt BINARY_BLOBS += esp-idf/components/bt/controller/lib_esp32/$(IDF_TARGET)/libbtdm_app.a endif diff --git a/ports/espressif/common-hal/ssl/crt_bundle.c b/ports/espressif/common-hal/ssl/crt_bundle.c new file mode 100644 index 0000000000000..5fce7a42051a0 --- /dev/null +++ b/ports/espressif/common-hal/ssl/crt_bundle.c @@ -0,0 +1,37 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Dan Halbert for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// In ESP-IDF v5.4, Espressif changed the format of the in-flash cert bundle, which +// made lib/mbedtls_config/crt_bundle.c no longer work. Rather than update that, +// just wrap those functions and use the ESP-IDF versions. + +#include "py/mperrno.h" +#include "mbedtls/x509_crt.h" +#include "lib/mbedtls_config/crt_bundle.h" +#include "esp_crt_bundle.h" + +static int convert_esp_err(esp_err_t ret) { + switch (ret) { + case ESP_OK: + return 0; + default: + // Right now esp_crt_bundle.c doesn't return very specific errors. + case ESP_ERR_INVALID_ARG: + return -MP_EINVAL; + } +} + +int crt_bundle_attach(mbedtls_ssl_config *ssl_conf) { + return convert_esp_err(esp_crt_bundle_attach(ssl_conf)); +} + +void crt_bundle_detach(mbedtls_ssl_config *conf) { + esp_crt_bundle_detach(conf); +} + +int crt_bundle_set(const uint8_t *x509_bundle, size_t bundle_size) { + return convert_esp_err(esp_crt_bundle_set(x509_bundle, bundle_size)); +} diff --git a/shared-module/ssl/SSLSocket.c b/shared-module/ssl/SSLSocket.c index 129a48d00d6ee..d04ca3c4603b6 100644 --- a/shared-module/ssl/SSLSocket.c +++ b/shared-module/ssl/SSLSocket.c @@ -37,7 +37,7 @@ static void mbedtls_debug(void *ctx, int level, const char *file, int line, const char *str) { (void)ctx; (void)level; - mp_printf(&mp_plat_print, "DBG:%s:%04d: %s\n", file, line, str); + mp_printf(&mp_plat_print, "DBG:%s:%04d: %s", file, line, str); } #define DEBUG_PRINT(fmt, ...) mp_printf(&mp_plat_print, "DBG:%s:%04d: " fmt "\n", __FILE__, __LINE__,##__VA_ARGS__) #else From d5f89a176009c5087b85056f3e56d9dc6ae97416 Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Fri, 25 Apr 2025 16:19:48 -0400 Subject: [PATCH 20/76] pre-commit format fix --- ports/espressif/common-hal/ssl/crt_bundle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ports/espressif/common-hal/ssl/crt_bundle.c b/ports/espressif/common-hal/ssl/crt_bundle.c index 5fce7a42051a0..53a07f4db1b2c 100644 --- a/ports/espressif/common-hal/ssl/crt_bundle.c +++ b/ports/espressif/common-hal/ssl/crt_bundle.c @@ -18,7 +18,7 @@ static int convert_esp_err(esp_err_t ret) { case ESP_OK: return 0; default: - // Right now esp_crt_bundle.c doesn't return very specific errors. + // Right now esp_crt_bundle.c doesn't return very specific errors. case ESP_ERR_INVALID_ARG: return -MP_EINVAL; } From a3ccaf9c683502eb452d40d2e754b6195d654060 Mon Sep 17 00:00:00 2001 From: eightycc Date: Tue, 29 Apr 2025 08:32:58 -0700 Subject: [PATCH 21/76] Switch to Adafruit ESP-IDF repo branch circuitpython-v5.4.1. --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index f297dae584738..315c74241693f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -142,7 +142,7 @@ url = https://github.com/adafruit/Adafruit_CircuitPython_RFM69.git [submodule "ports/espressif/esp-idf"] path = ports/espressif/esp-idf - url = https://github.com/eightycc/esp-idf.git + url = https://github.com/adafruit/esp-idf.git branch = circuitpython-v5.4.1 [submodule "ports/espressif/esp-protocols"] path = ports/espressif/esp-protocols From e35b1e9865a54ad2a245d7fda0e670ebeb060dc1 Mon Sep 17 00:00:00 2001 From: eightycc Date: Wed, 30 Apr 2025 18:52:05 -0700 Subject: [PATCH 22/76] Workaround Risc-V code gen problem causing Python interpreter crash. --- shared/runtime/pyexec.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/shared/runtime/pyexec.c b/shared/runtime/pyexec.c index 14e5e51a49aa5..8d09a9257a6b0 100644 --- a/shared/runtime/pyexec.c +++ b/shared/runtime/pyexec.c @@ -90,8 +90,9 @@ static int parse_compile_execute(const void *source, mp_parse_input_kind_t input nlr_buf_t nlr; nlr.ret_val = NULL; + // CIRCUITPY-CHANGE + mp_obj_t module_fun = mp_const_none; if (nlr_push(&nlr) == 0) { - mp_obj_t module_fun = mp_const_none; // CIRCUITPY-CHANGE #if CIRCUITPY_ATEXIT if (!(exec_flags & EXEC_FLAG_SOURCE_IS_ATEXIT)) @@ -157,6 +158,7 @@ static int parse_compile_execute(const void *source, mp_parse_input_kind_t input mp_call_function_n_kw(callback->func, callback->n_pos, callback->n_kw, callback->args); } else #endif + // CIRCUITPY-CHANGE if (module_fun != mp_const_none) { mp_call_function_0(module_fun); } From e729849fac17fb78bf902e3a6c1112d6c9fc7eff Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Thu, 1 May 2025 08:15:43 -0500 Subject: [PATCH 23/76] Initial setup of phaser effect. --- .../unix/variants/coverage/mpconfigvariant.mk | 2 + py/circuitpy_defns.mk | 1 + shared-bindings/audiofilters/Phaser.c | 287 ++++++++++++++++++ shared-bindings/audiofilters/Phaser.h | 34 +++ shared-bindings/audiofilters/__init__.c | 2 + shared-module/audiofilters/Phaser.c | 276 +++++++++++++++++ shared-module/audiofilters/Phaser.h | 46 +++ 7 files changed, 648 insertions(+) create mode 100644 shared-bindings/audiofilters/Phaser.c create mode 100644 shared-bindings/audiofilters/Phaser.h create mode 100644 shared-module/audiofilters/Phaser.c create mode 100644 shared-module/audiofilters/Phaser.h diff --git a/ports/unix/variants/coverage/mpconfigvariant.mk b/ports/unix/variants/coverage/mpconfigvariant.mk index e1924479bbf53..579e42cc05cf9 100644 --- a/ports/unix/variants/coverage/mpconfigvariant.mk +++ b/ports/unix/variants/coverage/mpconfigvariant.mk @@ -40,6 +40,7 @@ SRC_BITMAP := \ shared-bindings/audiodelays/__init__.c \ shared-bindings/audiofilters/Distortion.c \ shared-bindings/audiofilters/Filter.c \ + shared-bindings/audiofilters/Phaser.c \ shared-bindings/audiofilters/__init__.c \ shared-bindings/audiofreeverb/Freeverb.c \ shared-bindings/audiofreeverb/__init__.c \ @@ -87,6 +88,7 @@ SRC_BITMAP := \ shared-module/audiodelays/__init__.c \ shared-module/audiofilters/Distortion.c \ shared-module/audiofilters/Filter.c \ + shared-module/audiofilters/Phaser.c \ shared-module/audiofilters/__init__.c \ shared-module/audiofreeverb/Freeverb.c \ shared-module/audiofreeverb/__init__.c \ diff --git a/py/circuitpy_defns.mk b/py/circuitpy_defns.mk index fa90481e648ea..f73d52a6c4b12 100644 --- a/py/circuitpy_defns.mk +++ b/py/circuitpy_defns.mk @@ -674,6 +674,7 @@ SRC_SHARED_MODULE_ALL = \ audiodelays/__init__.c \ audiofilters/Distortion.c \ audiofilters/Filter.c \ + audiofilters/Phaser.c \ audiofilters/__init__.c \ audiofreeverb/__init__.c \ audiofreeverb/Freeverb.c \ diff --git a/shared-bindings/audiofilters/Phaser.c b/shared-bindings/audiofilters/Phaser.c new file mode 100644 index 0000000000000..64fd01d7ab10c --- /dev/null +++ b/shared-bindings/audiofilters/Phaser.c @@ -0,0 +1,287 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#include + +#include "shared-bindings/audiofilters/Phaser.h" +#include "shared-bindings/audiocore/__init__.h" +#include "shared-module/audiofilters/Phaser.h" + +#include "shared/runtime/context_manager_helpers.h" +#include "py/binary.h" +#include "py/objproperty.h" +#include "py/runtime.h" +#include "shared-bindings/util.h" +#include "shared-module/synthio/block.h" + +//| class Phaser: +//| """A Phaser effect""" +//| +//| def __init__( +//| self, +//| frequency: synthio.BlockInput = 1000.0, +//| feedback: synthio.BlockInput = 0.7, +//| mix: synthio.BlockInput = 1.0, +//| stages: int = 6, +//| buffer_size: int = 512, +//| sample_rate: int = 8000, +//| bits_per_sample: int = 16, +//| samples_signed: bool = True, +//| channel_count: int = 1, +//| ) -> None: +//| """Create a Phaser effect where the original sample is processed through a variable +//| number of all-pass filter stages. This slightly delays the signal so that it is out +//| of phase with the original signal. When the amount of phase is modulated and mixed +//| back into the original signal with the mix parameter, it creates a distinctive +//| phasing sound. +//| +//| :param synthio.BlockInput frequency: The target frequency which is affected by the effect in hz. +//| :param int stages: The number of all-pass filters which will be applied to the signal. +//| :param synthio.BlockInput feedback: The amount that the previous output of the filters is mixed back into their input along with the unprocessed signal. +//| :param synthio.BlockInput mix: The mix as a ratio of the sample (0.0) to the effect (1.0). +//| :param int buffer_size: The total size in bytes of each of the two playback buffers to use +//| :param int sample_rate: The sample rate to be used +//| :param int channel_count: The number of channels the source samples contain. 1 = mono; 2 = stereo. +//| :param int bits_per_sample: The bits per sample of the effect +//| :param bool samples_signed: Effect is signed (True) or unsigned (False) +//| +//| Playing adding a phaser to a synth:: +//| +//| import time +//| import board +//| import audiobusio +//| import synthio +//| import audiofilters +//| +//| audio = audiobusio.I2SOut(bit_clock=board.GP20, word_select=board.GP21, data=board.GP22) +//| synth = synthio.Synthesizer(channel_count=1, sample_rate=44100) +//| effect = audiofilters.Phaser(buffer_size=1024, channel_count=1, sample_rate=44100, mix=1.0) +//| effect.frequency = synthio.LFO(offset=1000.0, scale=600.0, rate=0.5) +//| effect.play(synth) +//| audio.play(effect) +//| +//| synth.press(48)""" +//| ... +//| +static mp_obj_t audiofilters_phaser_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { + enum { ARG_frequency, ARG_stages, ARG_feedback, ARG_mix, ARG_buffer_size, ARG_sample_rate, ARG_bits_per_sample, ARG_samples_signed, ARG_channel_count, }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_frequency, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(1000) } }, + { MP_QSTR_feedback, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } }, + { MP_QSTR_mix, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(1)} }, + { MP_QSTR_stages, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 6 } }, + { MP_QSTR_buffer_size, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 512} }, + { MP_QSTR_sample_rate, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 8000} }, + { MP_QSTR_bits_per_sample, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 16} }, + { MP_QSTR_samples_signed, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = true} }, + { MP_QSTR_channel_count, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1 } }, + }; + + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + mp_int_t channel_count = mp_arg_validate_int_range(args[ARG_channel_count].u_int, 1, 2, MP_QSTR_channel_count); + mp_int_t sample_rate = mp_arg_validate_int_min(args[ARG_sample_rate].u_int, 1, MP_QSTR_sample_rate); + mp_int_t bits_per_sample = args[ARG_bits_per_sample].u_int; + if (bits_per_sample != 8 && bits_per_sample != 16) { + mp_raise_ValueError(MP_ERROR_TEXT("bits_per_sample must be 8 or 16")); + } + + audiofilters_phaser_obj_t *self = mp_obj_malloc(audiofilters_phaser_obj_t, &audiofilters_phaser_type); + common_hal_audiofilters_phaser_construct(self, args[ARG_frequency].u_obj, args[ARG_feedback].u_obj, args[ARG_mix].u_obj, args[ARG_stages].u_int, args[ARG_buffer_size].u_int, bits_per_sample, args[ARG_samples_signed].u_bool, channel_count, sample_rate); + + return MP_OBJ_FROM_PTR(self); +} + +//| def deinit(self) -> None: +//| """Deinitialises the Phaser.""" +//| ... +//| +static mp_obj_t audiofilters_phaser_deinit(mp_obj_t self_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofilters_phaser_deinit(self); + return mp_const_none; +} +static MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_deinit_obj, audiofilters_phaser_deinit); + +static void check_for_deinit(audiofilters_phaser_obj_t *self) { + audiosample_check_for_deinit(&self->base); +} + +//| def __enter__(self) -> Phaser: +//| """No-op used by Context Managers.""" +//| ... +//| +// Provided by context manager helper. + +//| def __exit__(self) -> None: +//| """Automatically deinitializes when exiting a context. See +//| :ref:`lifetime-and-contextmanagers` for more info.""" +//| ... +//| +// Provided by context manager helper. + + +//| frequency: synthio.BlockInput +//| """The target frequency in hertz at which the phaser is delaying the signal.""" +static mp_obj_t audiofilters_phaser_obj_get_frequency(mp_obj_t self_in) { + return common_hal_audiofilters_phaser_get_frequency(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_get_frequency_obj, audiofilters_phaser_obj_get_frequency); + +static mp_obj_t audiofilters_phaser_obj_set_frequency(mp_obj_t self_in, mp_obj_t frequency_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofilters_phaser_set_frequency(self, frequency_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofilters_phaser_set_frequency_obj, audiofilters_phaser_obj_set_frequency); + +MP_PROPERTY_GETSET(audiofilters_phaser_frequency_obj, + (mp_obj_t)&audiofilters_phaser_get_frequency_obj, + (mp_obj_t)&audiofilters_phaser_set_frequency_obj); + + +//| feedback: synthio.BlockInput +//| """The amount of which the incoming signal is fed back into the phasing filters from 0 to 1 where 0 is no feedback and 1 is full feedback.""" +static mp_obj_t audiofilters_phaser_obj_get_feedback(mp_obj_t self_in) { + return common_hal_audiofilters_phaser_get_feedback(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_get_feedback_obj, audiofilters_phaser_obj_get_feedback); + +static mp_obj_t audiofilters_phaser_obj_set_feedback(mp_obj_t self_in, mp_obj_t feedback_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofilters_phaser_set_feedback(self, feedback_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofilters_phaser_set_feedback_obj, audiofilters_phaser_obj_set_feedback); + +MP_PROPERTY_GETSET(audiofilters_phaser_feedback_obj, + (mp_obj_t)&audiofilters_phaser_get_feedback_obj, + (mp_obj_t)&audiofilters_phaser_set_feedback_obj); + + +//| mix: synthio.BlockInput +//| """The amount that the effect signal is mixed into the output between 0 and 1 where 0 is only the original sample and 1 is all effect.""" +static mp_obj_t audiofilters_phaser_obj_get_mix(mp_obj_t self_in) { + return common_hal_audiofilters_phaser_get_mix(self_in); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_get_mix_obj, audiofilters_phaser_obj_get_mix); + +static mp_obj_t audiofilters_phaser_obj_set_mix(mp_obj_t self_in, mp_obj_t mix_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofilters_phaser_set_mix(self, mix_in); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofilters_phaser_set_mix_obj, audiofilters_phaser_obj_set_mix); + +MP_PROPERTY_GETSET(audiofilters_phaser_mix_obj, + (mp_obj_t)&audiofilters_phaser_get_mix_obj, + (mp_obj_t)&audiofilters_phaser_set_mix_obj); + + +//| stages: int +//| """The number of allpass filters to pass the signal through. More stages requires more processing but produces a more pronounced effect. Requires a minimum value of 1.""" +static mp_obj_t audiofilters_phaser_obj_get_stages(mp_obj_t self_in) { + return MP_OBJ_NEW_SMALL_INT(common_hal_audiofilters_phaser_get_stages(self_in)); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_get_stages_obj, audiofilters_phaser_obj_get_stages); + +static mp_obj_t audiofilters_phaser_obj_set_stages(mp_obj_t self_in, mp_obj_t stages_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiofilters_phaser_set_stages(self, mp_obj_get_int(stages_in)); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_2(audiofilters_phaser_set_stages_obj, audiofilters_phaser_obj_set_stages); + +MP_PROPERTY_GETSET(audiofilters_phaser_stages_obj, + (mp_obj_t)&audiofilters_phaser_get_stages_obj, + (mp_obj_t)&audiofilters_phaser_set_stages_obj); + + +//| playing: bool +//| """True when the effect is playing a sample. (read-only)""" +//| +static mp_obj_t audiofilters_phaser_obj_get_playing(mp_obj_t self_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + check_for_deinit(self); + return mp_obj_new_bool(common_hal_audiofilters_phaser_get_playing(self)); +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_get_playing_obj, audiofilters_phaser_obj_get_playing); + +MP_PROPERTY_GETTER(audiofilters_phaser_playing_obj, + (mp_obj_t)&audiofilters_phaser_get_playing_obj); + +//| def play(self, sample: circuitpython_typing.AudioSample, *, loop: bool = False) -> None: +//| """Plays the sample once when loop=False and continuously when loop=True. +//| Does not block. Use `playing` to block. +//| +//| The sample must match the encoding settings given in the constructor.""" +//| ... +//| +static mp_obj_t audiofilters_phaser_obj_play(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { + enum { ARG_sample, ARG_loop }; + static const mp_arg_t allowed_args[] = { + { MP_QSTR_sample, MP_ARG_OBJ | MP_ARG_REQUIRED, {} }, + { MP_QSTR_loop, MP_ARG_BOOL | MP_ARG_KW_ONLY, {.u_bool = false} }, + }; + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]); + check_for_deinit(self); + mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; + mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); + + + mp_obj_t sample = args[ARG_sample].u_obj; + common_hal_audiofilters_phaser_play(self, sample, args[ARG_loop].u_bool); + + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_KW(audiofilters_phaser_play_obj, 1, audiofilters_phaser_obj_play); + +//| def stop(self) -> None: +//| """Stops playback of the sample.""" +//| ... +//| +//| +static mp_obj_t audiofilters_phaser_obj_stop(mp_obj_t self_in) { + audiofilters_phaser_obj_t *self = MP_OBJ_TO_PTR(self_in); + + common_hal_audiofilters_phaser_stop(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audiofilters_phaser_stop_obj, audiofilters_phaser_obj_stop); + +static const mp_rom_map_elem_t audiofilters_phaser_locals_dict_table[] = { + // Methods + { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&audiofilters_phaser_deinit_obj) }, + { MP_ROM_QSTR(MP_QSTR___enter__), MP_ROM_PTR(&default___enter___obj) }, + { MP_ROM_QSTR(MP_QSTR___exit__), MP_ROM_PTR(&default___exit___obj) }, + { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiofilters_phaser_play_obj) }, + { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiofilters_phaser_stop_obj) }, + + // Properties + { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiofilters_phaser_playing_obj) }, + { MP_ROM_QSTR(MP_QSTR_frequency), MP_ROM_PTR(&audiofilters_phaser_frequency_obj) }, + { MP_ROM_QSTR(MP_QSTR_feedback), MP_ROM_PTR(&audiofilters_phaser_feedback_obj) }, + { MP_ROM_QSTR(MP_QSTR_mix), MP_ROM_PTR(&audiofilters_phaser_mix_obj) }, + { MP_ROM_QSTR(MP_QSTR_stages), MP_ROM_PTR(&audiofilters_phaser_stages_obj) }, + AUDIOSAMPLE_FIELDS, +}; +static MP_DEFINE_CONST_DICT(audiofilters_phaser_locals_dict, audiofilters_phaser_locals_dict_table); + +static const audiosample_p_t audiofilters_phaser_proto = { + MP_PROTO_IMPLEMENT(MP_QSTR_protocol_audiosample) + .reset_buffer = (audiosample_reset_buffer_fun)audiofilters_phaser_reset_buffer, + .get_buffer = (audiosample_get_buffer_fun)audiofilters_phaser_get_buffer, +}; + +MP_DEFINE_CONST_OBJ_TYPE( + audiofilters_phaser_type, + MP_QSTR_Phaser, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, audiofilters_phaser_make_new, + locals_dict, &audiofilters_phaser_locals_dict, + protocol, &audiofilters_phaser_proto + ); diff --git a/shared-bindings/audiofilters/Phaser.h b/shared-bindings/audiofilters/Phaser.h new file mode 100644 index 0000000000000..b020ba6183cf2 --- /dev/null +++ b/shared-bindings/audiofilters/Phaser.h @@ -0,0 +1,34 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include "shared-module/audiofilters/Phaser.h" + +extern const mp_obj_type_t audiofilters_phaser_type; + +void common_hal_audiofilters_phaser_construct(audiofilters_phaser_obj_t *self, + mp_obj_t frequency, mp_obj_t feedback, mp_obj_t mix, uint8_t stages, + uint32_t buffer_size, uint8_t bits_per_sample, bool samples_signed, + uint8_t channel_count, uint32_t sample_rate); + +void common_hal_audiofilters_phaser_deinit(audiofilters_phaser_obj_t *self); + +mp_obj_t common_hal_audiofilters_phaser_get_frequency(audiofilters_phaser_obj_t *self); +void common_hal_audiofilters_phaser_set_frequency(audiofilters_phaser_obj_t *self, mp_obj_t arg); + +mp_obj_t common_hal_audiofilters_phaser_get_feedback(audiofilters_phaser_obj_t *self); +void common_hal_audiofilters_phaser_set_feedback(audiofilters_phaser_obj_t *self, mp_obj_t arg); + +mp_obj_t common_hal_audiofilters_phaser_get_mix(audiofilters_phaser_obj_t *self); +void common_hal_audiofilters_phaser_set_mix(audiofilters_phaser_obj_t *self, mp_obj_t arg); + +uint8_t common_hal_audiofilters_phaser_get_stages(audiofilters_phaser_obj_t *self); +void common_hal_audiofilters_phaser_set_stages(audiofilters_phaser_obj_t *self, mp_obj_t arg); + +bool common_hal_audiofilters_phaser_get_playing(audiofilters_phaser_obj_t *self); +void common_hal_audiofilters_phaser_play(audiofilters_phaser_obj_t *self, mp_obj_t sample, bool loop); +void common_hal_audiofilters_phaser_stop(audiofilters_phaser_obj_t *self); diff --git a/shared-bindings/audiofilters/__init__.c b/shared-bindings/audiofilters/__init__.c index 7a17ec655e628..ae43af9bfef83 100644 --- a/shared-bindings/audiofilters/__init__.c +++ b/shared-bindings/audiofilters/__init__.c @@ -12,6 +12,7 @@ #include "shared-bindings/audiofilters/__init__.h" #include "shared-bindings/audiofilters/Distortion.h" #include "shared-bindings/audiofilters/Filter.h" +#include "shared-bindings/audiofilters/Phaser.h" //| """Support for audio filter effects //| @@ -23,6 +24,7 @@ static const mp_rom_map_elem_t audiofilters_module_globals_table[] = { { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_audiofilters) }, { MP_ROM_QSTR(MP_QSTR_Filter), MP_ROM_PTR(&audiofilters_filter_type) }, { MP_ROM_QSTR(MP_QSTR_Distortion), MP_ROM_PTR(&audiofilters_distortion_type) }, + { MP_ROM_QSTR(MP_QSTR_Phaser), MP_ROM_PTR(&audiofilters_phaser_type) }, // Enum-like Classes. { MP_ROM_QSTR(MP_QSTR_DistortionMode), MP_ROM_PTR(&audiofilters_distortion_mode_type) }, diff --git a/shared-module/audiofilters/Phaser.c b/shared-module/audiofilters/Phaser.c new file mode 100644 index 0000000000000..8e669dc90a015 --- /dev/null +++ b/shared-module/audiofilters/Phaser.c @@ -0,0 +1,276 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT +#include "shared-bindings/audiofilters/Phaser.h" +#include "shared-bindings/audiocore/__init__.h" + +#include +#include "py/runtime.h" + +void common_hal_audiofilters_phaser_construct(audiofilters_phaser_obj_t *self, + mp_obj_t frequency, mp_obj_t feedback, mp_obj_t mix, uint8_t stages, + uint32_t buffer_size, uint8_t bits_per_sample, + bool samples_signed, uint8_t channel_count, uint32_t sample_rate) { + + // Basic settings every effect and audio sample has + // These are the effects values, not the source sample(s) + self->base.bits_per_sample = bits_per_sample; // Most common is 16, but 8 is also supported in many places + self->base.samples_signed = samples_signed; // Are the samples we provide signed (common is true) + self->base.channel_count = channel_count; // Channels can be 1 for mono or 2 for stereo + self->base.sample_rate = sample_rate; // Sample rate for the effect, this generally needs to match all audio objects + self->base.single_buffer = false; + self->base.max_buffer_length = buffer_size; + + // To smooth things out as CircuitPython is doing other tasks most audio objects have a buffer + // A double buffer is set up here so the audio output can use DMA on buffer 1 while we + // write to and create buffer 2. + // This buffer is what is passed to the audio component that plays the effect. + // Samples are set sequentially. For stereo audio they are passed L/R/L/R/... + self->buffer_len = buffer_size; // in bytes + + self->buffer[0] = m_malloc_without_collect(self->buffer_len); + memset(self->buffer[0], 0, self->buffer_len); + + self->buffer[1] = m_malloc_without_collect(self->buffer_len); + memset(self->buffer[1], 0, self->buffer_len); + + self->last_buf_idx = 1; // Which buffer to use first, toggle between 0 and 1 + + // This buffer will be used to process samples through the biquad filter + self->filter_buffer = m_malloc_without_collect(SYNTHIO_MAX_DUR * sizeof(int32_t)); + memset(self->filter_buffer, 0, SYNTHIO_MAX_DUR * sizeof(int32_t)); + + // Initialize other values most effects will need. + self->sample = NULL; // The current playing sample + self->sample_remaining_buffer = NULL; // Pointer to the start of the sample buffer we have not played + self->sample_buffer_length = 0; // How many samples do we have left to play (these may be 16 bit!) + self->loop = false; // When the sample is done do we loop to the start again or stop (e.g. in a wav file) + self->more_data = false; // Is there still more data to read from the sample or did we finish + + // The below section sets up the effect's starting values. + + self->nyquist = (mp_float_t) self->base.sample_rate / 2; + + if (feedback == mp_const_none) { + feedback = mp_obj_new_float(MICROPY_FLOAT_CONST(0.7)); + } + + synthio_block_assign_slot(frequency, &self->frequency, MP_QSTR_frequency); + synthio_block_assign_slot(feedback, &self->feedback, MP_QSTR_feedback); + synthio_block_assign_slot(mix, &self->mix, MP_QSTR_mix); + + common_hal_audiofilters_phaser_set_stages(self, stages); +} + +void common_hal_audiofilters_phaser_deinit(audiofilters_phaser_obj_t *self) { + audiosample_mark_deinit(&self->base); + self->buffer[0] = NULL; + self->buffer[1] = NULL; +} + +mp_obj_t common_hal_audiofilters_phaser_get_frequency(audiofilters_phaser_obj_t *self) { + return self->frequency.obj; +} + +void common_hal_audiofilters_phaser_set_frequency(audiofilters_phaser_obj_t *self, mp_obj_t arg) { + synthio_block_assign_slot(arg, &self->frequency, MP_QSTR_frequency); +} + +mp_obj_t common_hal_audiofilters_phaser_get_feedback(audiofilters_phaser_obj_t *self) { + return self->feedback.obj; +} + +void common_hal_audiofilters_phaser_set_feedback(audiofilters_phaser_obj_t *self, mp_obj_t arg) { + synthio_block_assign_slot(arg, &self->feedback, MP_QSTR_feedback); +} + +mp_obj_t common_hal_audiofilters_phaser_get_mix(audiofilters_phaser_obj_t *self) { + return self->mix.obj; +} + +void common_hal_audiofilters_phaser_set_mix(audiofilters_phaser_obj_t *self, mp_obj_t arg) { + synthio_block_assign_slot(arg, &self->mix, MP_QSTR_mix); +} + +uint8_t common_hal_audiofilters_phaser_get_stages(audiofilters_phaser_obj_t *self) { + return self->stages; +} + +void common_hal_audiofilters_phaser_set_stages(audiofilters_phaser_obj_t *self, uint8_t arg) { + if (!arg) { + arg = 1; + } + // TODO: reallocate filters + self->stages = arg; +} + +void audiofilters_phaser_reset_buffer(audiofilters_phaser_obj_t *self, + bool single_channel_output, + uint8_t channel) { + + memset(self->buffer[0], 0, self->buffer_len); + memset(self->buffer[1], 0, self->buffer_len); +} + +bool common_hal_audiofilters_phaser_get_playing(audiofilters_phaser_obj_t *self) { + return self->sample != NULL; +} + +void common_hal_audiofilters_phaser_play(audiofilters_phaser_obj_t *self, mp_obj_t sample, bool loop) { + audiosample_must_match(&self->base, sample); + + self->sample = sample; + self->loop = loop; + + audiosample_reset_buffer(self->sample, false, 0); + audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->sample_remaining_buffer, &self->sample_buffer_length); + + // Track remaining sample length in terms of bytes per sample + self->sample_buffer_length /= (self->base.bits_per_sample / 8); + // Store if we have more data in the sample to retrieve + self->more_data = result == GET_BUFFER_MORE_DATA; + + return; +} + +void common_hal_audiofilters_phaser_stop(audiofilters_phaser_obj_t *self) { + // When the sample is set to stop playing do any cleanup here + self->sample = NULL; + return; +} + +audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_obj_t *self, bool single_channel_output, uint8_t channel, + uint8_t **buffer, uint32_t *buffer_length) { + (void)channel; + + if (!single_channel_output) { + channel = 0; + } + + // Switch our buffers to the other buffer + self->last_buf_idx = !self->last_buf_idx; + + // If we are using 16 bit samples we need a 16 bit pointer, 8 bit needs an 8 bit pointer + int16_t *word_buffer = (int16_t *)self->buffer[self->last_buf_idx]; + int8_t *hword_buffer = self->buffer[self->last_buf_idx]; + uint32_t length = self->buffer_len / (self->base.bits_per_sample / 8); + + // Loop over the entire length of our buffer to fill it, this may require several calls to get data from the sample + while (length != 0) { + // Check if there is no more sample to play, we will either load more data, reset the sample if loop is on or clear the sample + if (self->sample_buffer_length == 0) { + if (!self->more_data) { // The sample has indicated it has no more data to play + if (self->loop && self->sample) { // If we are supposed to loop reset the sample to the start + audiosample_reset_buffer(self->sample, false, 0); + } else { // If we were not supposed to loop the sample, stop playing it + self->sample = NULL; + } + } + if (self->sample) { + // Load another sample buffer to play + audioio_get_buffer_result_t result = audiosample_get_buffer(self->sample, false, 0, (uint8_t **)&self->sample_remaining_buffer, &self->sample_buffer_length); + // Track length in terms of words. + self->sample_buffer_length /= (self->base.bits_per_sample / 8); + self->more_data = result == GET_BUFFER_MORE_DATA; + } + } + + if (self->sample == NULL) { + // tick all block inputs + shared_bindings_synthio_lfo_tick(self->base.sample_rate, length / self->base.channel_count); + (void)synthio_block_slot_get(&self->frequency); + (void)synthio_block_slot_get(&self->feedback); + (void)synthio_block_slot_get(&self->mix); + + if (self->base.samples_signed) { + memset(word_buffer, 0, length * (self->base.bits_per_sample / 8)); + } else { + // For unsigned samples set to the middle which is "quiet" + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + uint16_t *uword_buffer = (uint16_t *)word_buffer; + while (length--) { + *uword_buffer++ = 32768; + } + } else { + memset(hword_buffer, 128, length * (self->base.bits_per_sample / 8)); + } + } + + length = 0; + } else { + // we have a sample to play and filter + // Determine how many bytes we can process to our buffer, the less of the sample we have left and our buffer remaining + uint32_t n = MIN(MIN(self->sample_buffer_length, length), SYNTHIO_MAX_DUR * self->base.channel_count); + + int16_t *sample_src = (int16_t *)self->sample_remaining_buffer; // for 16-bit samples + int8_t *sample_hsrc = (int8_t *)self->sample_remaining_buffer; // for 8-bit samples + + // get the effect values we need from the BlockInput. These may change at run time so you need to do bounds checking if required + shared_bindings_synthio_lfo_tick(self->base.sample_rate, n / self->base.channel_count); + mp_float_t frequency = synthio_block_slot_get_limited(&self->frequency, MICROPY_FLOAT_CONST(0.0), self->nyquist); + mp_float_t feedback = synthio_block_slot_get_limited(&self->feedback, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); + mp_float_t mix = synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); + + if (mix <= MICROPY_FLOAT_CONST(0.01)) { // if mix is zero pure sample only + for (uint32_t i = 0; i < n; i++) { + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + word_buffer[i] = sample_src[i]; + } else { + hword_buffer[i] = sample_hsrc[i]; + } + } + } else { + for (uint32_t i = 0; i < n; i++) { + int32_t sample_word = 0; + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + sample_word = sample_src[i]; + } else { + if (self->base.samples_signed) { + sample_word = sample_hsrc[i]; + } else { + // Be careful here changing from an 8 bit unsigned to signed into a 32-bit signed + sample_word = (int8_t)(((uint8_t)sample_hsrc[i]) ^ 0x80); + } + } + + // TODO: Process sample + int32_t word = 0; + + // Add original sample + effect + word = sample_word + (int32_t)(word * mix); + word = synthio_mix_down_sample(word, 2); + + if (MP_LIKELY(self->base.bits_per_sample == 16)) { + word_buffer[i] = word; + if (!self->base.samples_signed) { + word_buffer[i] ^= 0x8000; + } + } else { + int8_t out = word; + if (self->base.samples_signed) { + hword_buffer[i] = out; + } else { + hword_buffer[i] = (uint8_t)out ^ 0x80; + } + } + } + } + + // Update the remaining length and the buffer positions based on how much we wrote into our buffer + length -= n; + word_buffer += n; + hword_buffer += n; + self->sample_remaining_buffer += (n * (self->base.bits_per_sample / 8)); + self->sample_buffer_length -= n; + } + } + + // Finally pass our buffer and length to the calling audio function + *buffer = (uint8_t *)self->buffer[self->last_buf_idx]; + *buffer_length = self->buffer_len; + + // Phaser always returns more data but some effects may return GET_BUFFER_DONE or GET_BUFFER_ERROR (see audiocore/__init__.h) + return GET_BUFFER_MORE_DATA; +} diff --git a/shared-module/audiofilters/Phaser.h b/shared-module/audiofilters/Phaser.h new file mode 100644 index 0000000000000..c2d9aeeb21de7 --- /dev/null +++ b/shared-module/audiofilters/Phaser.h @@ -0,0 +1,46 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Cooper Dalrymple +// +// SPDX-License-Identifier: MIT +#pragma once + +#include "py/obj.h" + +#include "shared-module/audiocore/__init__.h" +#include "shared-module/synthio/__init__.h" +#include "shared-module/synthio/block.h" + +extern const mp_obj_type_t audiofilters_phaser_type; + +typedef struct { + audiosample_base_t base; + synthio_block_slot_t frequency; + synthio_block_slot_t feedback; + synthio_block_slot_t mix; + uint8_t stages; + + mp_float_t nyquist; + + int8_t *buffer[2]; + uint8_t last_buf_idx; + uint32_t buffer_len; // max buffer in bytes + + uint8_t *sample_remaining_buffer; + uint32_t sample_buffer_length; + + bool loop; + bool more_data; + + mp_obj_t sample; +} audiofilters_phaser_obj_t; + +void audiofilters_phaser_reset_buffer(audiofilters_phaser_obj_t *self, + bool single_channel_output, + uint8_t channel); + +audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_obj_t *self, + bool single_channel_output, + uint8_t channel, + uint8_t **buffer, + uint32_t *buffer_length); // length in bytes From ba81c6b1c4c16ee190bd16e34b1217f452e68923 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Thu, 1 May 2025 10:42:03 -0500 Subject: [PATCH 24/76] Implement allpass filters. --- shared-bindings/audiofilters/Phaser.c | 6 ++-- shared-bindings/audiofilters/Phaser.h | 2 +- shared-module/audiofilters/Phaser.c | 45 +++++++++++++++++++++------ shared-module/audiofilters/Phaser.h | 3 ++ 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/shared-bindings/audiofilters/Phaser.c b/shared-bindings/audiofilters/Phaser.c index 64fd01d7ab10c..817614fa21f35 100644 --- a/shared-bindings/audiofilters/Phaser.c +++ b/shared-bindings/audiofilters/Phaser.c @@ -53,12 +53,12 @@ //| import time //| import board //| import audiobusio -//| import synthio //| import audiofilters +//| import synthio //| //| audio = audiobusio.I2SOut(bit_clock=board.GP20, word_select=board.GP21, data=board.GP22) //| synth = synthio.Synthesizer(channel_count=1, sample_rate=44100) -//| effect = audiofilters.Phaser(buffer_size=1024, channel_count=1, sample_rate=44100, mix=1.0) +//| effect = audiofilters.Phaser(channel_count=1, sample_rate=44100) //| effect.frequency = synthio.LFO(offset=1000.0, scale=600.0, rate=0.5) //| effect.play(synth) //| audio.play(effect) @@ -67,7 +67,7 @@ //| ... //| static mp_obj_t audiofilters_phaser_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - enum { ARG_frequency, ARG_stages, ARG_feedback, ARG_mix, ARG_buffer_size, ARG_sample_rate, ARG_bits_per_sample, ARG_samples_signed, ARG_channel_count, }; + enum { ARG_frequency, ARG_feedback, ARG_mix, ARG_stages, ARG_buffer_size, ARG_sample_rate, ARG_bits_per_sample, ARG_samples_signed, ARG_channel_count, }; static const mp_arg_t allowed_args[] = { { MP_QSTR_frequency, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_INT(1000) } }, { MP_QSTR_feedback, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = MP_ROM_NONE } }, diff --git a/shared-bindings/audiofilters/Phaser.h b/shared-bindings/audiofilters/Phaser.h index b020ba6183cf2..dbab22f571025 100644 --- a/shared-bindings/audiofilters/Phaser.h +++ b/shared-bindings/audiofilters/Phaser.h @@ -27,7 +27,7 @@ mp_obj_t common_hal_audiofilters_phaser_get_mix(audiofilters_phaser_obj_t *self) void common_hal_audiofilters_phaser_set_mix(audiofilters_phaser_obj_t *self, mp_obj_t arg); uint8_t common_hal_audiofilters_phaser_get_stages(audiofilters_phaser_obj_t *self); -void common_hal_audiofilters_phaser_set_stages(audiofilters_phaser_obj_t *self, mp_obj_t arg); +void common_hal_audiofilters_phaser_set_stages(audiofilters_phaser_obj_t *self, uint8_t arg); bool common_hal_audiofilters_phaser_get_playing(audiofilters_phaser_obj_t *self); void common_hal_audiofilters_phaser_play(audiofilters_phaser_obj_t *self, mp_obj_t sample, bool loop); diff --git a/shared-module/audiofilters/Phaser.c b/shared-module/audiofilters/Phaser.c index 8e669dc90a015..f31aea4caaa3d 100644 --- a/shared-module/audiofilters/Phaser.c +++ b/shared-module/audiofilters/Phaser.c @@ -38,10 +38,6 @@ void common_hal_audiofilters_phaser_construct(audiofilters_phaser_obj_t *self, self->last_buf_idx = 1; // Which buffer to use first, toggle between 0 and 1 - // This buffer will be used to process samples through the biquad filter - self->filter_buffer = m_malloc_without_collect(SYNTHIO_MAX_DUR * sizeof(int32_t)); - memset(self->filter_buffer, 0, SYNTHIO_MAX_DUR * sizeof(int32_t)); - // Initialize other values most effects will need. self->sample = NULL; // The current playing sample self->sample_remaining_buffer = NULL; // Pointer to the start of the sample buffer we have not played @@ -51,7 +47,11 @@ void common_hal_audiofilters_phaser_construct(audiofilters_phaser_obj_t *self, // The below section sets up the effect's starting values. - self->nyquist = (mp_float_t) self->base.sample_rate / 2; + // Create buffer to hold the last processed word + self->word_buffer = m_malloc_without_collect(self->base.channel_count * sizeof(int32_t)); + memset(self->word_buffer, 0, self->base.channel_count * sizeof(int32_t)); + + self->nyquist = (mp_float_t)self->base.sample_rate / 2; if (feedback == mp_const_none) { feedback = mp_obj_new_float(MICROPY_FLOAT_CONST(0.7)); @@ -68,6 +68,8 @@ void common_hal_audiofilters_phaser_deinit(audiofilters_phaser_obj_t *self) { audiosample_mark_deinit(&self->base); self->buffer[0] = NULL; self->buffer[1] = NULL; + self->word_buffer = NULL; + self->allpass_buffer = NULL; } mp_obj_t common_hal_audiofilters_phaser_get_frequency(audiofilters_phaser_obj_t *self) { @@ -102,8 +104,15 @@ void common_hal_audiofilters_phaser_set_stages(audiofilters_phaser_obj_t *self, if (!arg) { arg = 1; } - // TODO: reallocate filters + + self->allpass_buffer = (int32_t *)m_realloc(self->allpass_buffer, + #if MICROPY_MALLOC_USES_ALLOCATED_SIZE + self->base.channel_count * self->stages * sizeof(int32_t), // Old size + #endif + self->base.channel_count * arg * sizeof(int32_t)); self->stages = arg; + + memset(self->allpass_buffer, 0, self->base.channel_count * self->stages * sizeof(int32_t)); } void audiofilters_phaser_reset_buffer(audiofilters_phaser_obj_t *self, @@ -112,6 +121,8 @@ void audiofilters_phaser_reset_buffer(audiofilters_phaser_obj_t *self, memset(self->buffer[0], 0, self->buffer_len); memset(self->buffer[1], 0, self->buffer_len); + memset(self->word_buffer, 0, self->base.channel_count * sizeof(int32_t)); + memset(self->allpass_buffer, 0, self->base.channel_count * self->stages * sizeof(int32_t)); } bool common_hal_audiofilters_phaser_get_playing(audiofilters_phaser_obj_t *self) { @@ -222,7 +233,15 @@ audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_o } } } else { + + // Update all-pass filter coefficient + mp_float_t allpasscoef = frequency / self->nyquist; + allpasscoef = (MICROPY_FLOAT_CONST(1.0) - allpasscoef) / (MICROPY_FLOAT_CONST(1.0) + allpasscoef); + for (uint32_t i = 0; i < n; i++) { + bool right_channel = (single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1); + uint32_t allpass_buffer_offset = self->stages * right_channel; + int32_t sample_word = 0; if (MP_LIKELY(self->base.bits_per_sample == 16)) { sample_word = sample_src[i]; @@ -235,13 +254,21 @@ audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_o } } - // TODO: Process sample - int32_t word = 0; + int32_t word = sample_word + self->word_buffer[right_channel] * feedback; + int32_t allpass_word = 0; + + // Update all-pass filters + for (uint32_t j = 0; j < self->stages; j++) { + allpass_word = word * -allpasscoef + self->allpass_buffer[j + allpass_buffer_offset]; + self->allpass_buffer[j + allpass_buffer_offset] = allpass_word * allpasscoef + word; + word = allpass_word; + } + self->word_buffer[(bool)allpass_buffer_offset] = word; // Add original sample + effect word = sample_word + (int32_t)(word * mix); word = synthio_mix_down_sample(word, 2); - + if (MP_LIKELY(self->base.bits_per_sample == 16)) { word_buffer[i] = word; if (!self->base.samples_signed) { diff --git a/shared-module/audiofilters/Phaser.h b/shared-module/audiofilters/Phaser.h index c2d9aeeb21de7..707a2b0f0841d 100644 --- a/shared-module/audiofilters/Phaser.h +++ b/shared-module/audiofilters/Phaser.h @@ -32,6 +32,9 @@ typedef struct { bool loop; bool more_data; + int32_t *allpass_buffer; + int32_t *word_buffer; + mp_obj_t sample; } audiofilters_phaser_obj_t; From e855e3e1bae5af371826efcaf975111e9f31c1e1 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Thu, 1 May 2025 10:54:10 -0500 Subject: [PATCH 25/76] Limit feedback range to 0.1 - 0.9 --- shared-bindings/audiofilters/Phaser.c | 2 +- shared-module/audiofilters/Phaser.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/shared-bindings/audiofilters/Phaser.c b/shared-bindings/audiofilters/Phaser.c index 817614fa21f35..e7ddd986176b3 100644 --- a/shared-bindings/audiofilters/Phaser.c +++ b/shared-bindings/audiofilters/Phaser.c @@ -145,7 +145,7 @@ MP_PROPERTY_GETSET(audiofilters_phaser_frequency_obj, //| feedback: synthio.BlockInput -//| """The amount of which the incoming signal is fed back into the phasing filters from 0 to 1 where 0 is no feedback and 1 is full feedback.""" +//| """The amount of which the incoming signal is fed back into the phasing filters from 0.1 to 0.9.""" static mp_obj_t audiofilters_phaser_obj_get_feedback(mp_obj_t self_in) { return common_hal_audiofilters_phaser_get_feedback(self_in); } diff --git a/shared-module/audiofilters/Phaser.c b/shared-module/audiofilters/Phaser.c index f31aea4caaa3d..3a426ff2c302b 100644 --- a/shared-module/audiofilters/Phaser.c +++ b/shared-module/audiofilters/Phaser.c @@ -221,7 +221,7 @@ audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_o // get the effect values we need from the BlockInput. These may change at run time so you need to do bounds checking if required shared_bindings_synthio_lfo_tick(self->base.sample_rate, n / self->base.channel_count); mp_float_t frequency = synthio_block_slot_get_limited(&self->frequency, MICROPY_FLOAT_CONST(0.0), self->nyquist); - mp_float_t feedback = synthio_block_slot_get_limited(&self->feedback, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); + mp_float_t feedback = synthio_block_slot_get_limited(&self->feedback, MICROPY_FLOAT_CONST(0.1), MICROPY_FLOAT_CONST(0.9)); mp_float_t mix = synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); if (mix <= MICROPY_FLOAT_CONST(0.01)) { // if mix is zero pure sample only From 8a9d78ada4d008dec2930d620d2443d10df6a8e3 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 1 May 2025 14:57:36 -0500 Subject: [PATCH 26/76] use m_malloc for outter mappings pointers --- shared-module/tilepalettemapper/TilePaletteMapper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index f46810b6a351f..fb784fd441b9b 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -18,7 +18,7 @@ void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_ self->input_color_count = input_color_count; self->needs_refresh = false; int mappings_len = width * height; - self->tile_mappings = (uint32_t **)m_malloc_without_collect(mappings_len * sizeof(uint32_t *)); + self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *)); for (int i = 0; i < mappings_len; i++) { self->tile_mappings[i] = (uint32_t *)m_malloc_without_collect(input_color_count * sizeof(uint32_t)); if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) { From 421521516c221629ff6c15fd066a1be3fc6a95f3 Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Thu, 1 May 2025 15:27:23 -0500 Subject: [PATCH 27/76] Convert floating point operations to fixed point and use `synthio_sat16`. --- shared-module/audiofilters/Phaser.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/shared-module/audiofilters/Phaser.c b/shared-module/audiofilters/Phaser.c index 3a426ff2c302b..73a2a8d54a59c 100644 --- a/shared-module/audiofilters/Phaser.c +++ b/shared-module/audiofilters/Phaser.c @@ -221,10 +221,10 @@ audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_o // get the effect values we need from the BlockInput. These may change at run time so you need to do bounds checking if required shared_bindings_synthio_lfo_tick(self->base.sample_rate, n / self->base.channel_count); mp_float_t frequency = synthio_block_slot_get_limited(&self->frequency, MICROPY_FLOAT_CONST(0.0), self->nyquist); - mp_float_t feedback = synthio_block_slot_get_limited(&self->feedback, MICROPY_FLOAT_CONST(0.1), MICROPY_FLOAT_CONST(0.9)); - mp_float_t mix = synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)); + int16_t feedback = (int16_t)(synthio_block_slot_get_limited(&self->feedback, MICROPY_FLOAT_CONST(0.1), MICROPY_FLOAT_CONST(0.9)) * 32767); + int16_t mix = (int16_t)(synthio_block_slot_get_limited(&self->mix, MICROPY_FLOAT_CONST(0.0), MICROPY_FLOAT_CONST(1.0)) * 32767); - if (mix <= MICROPY_FLOAT_CONST(0.01)) { // if mix is zero pure sample only + if (mix <= 328) { // if mix is zero (0.01 in fixed point), pure sample only for (uint32_t i = 0; i < n; i++) { if (MP_LIKELY(self->base.bits_per_sample == 16)) { word_buffer[i] = sample_src[i]; @@ -233,10 +233,9 @@ audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_o } } } else { - // Update all-pass filter coefficient - mp_float_t allpasscoef = frequency / self->nyquist; - allpasscoef = (MICROPY_FLOAT_CONST(1.0) - allpasscoef) / (MICROPY_FLOAT_CONST(1.0) + allpasscoef); + frequency /= self->nyquist; // scale relative to frequency range + int16_t allpasscoef = (int16_t)((MICROPY_FLOAT_CONST(1.0) - frequency) / (MICROPY_FLOAT_CONST(1.0) + frequency) * 32767); for (uint32_t i = 0; i < n; i++) { bool right_channel = (single_channel_output && channel == 1) || (!single_channel_output && (i % self->base.channel_count) == 1); @@ -254,19 +253,19 @@ audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_o } } - int32_t word = sample_word + self->word_buffer[right_channel] * feedback; + int32_t word = synthio_sat16(sample_word + synthio_sat16(self->word_buffer[right_channel] * feedback, 15), 0); int32_t allpass_word = 0; // Update all-pass filters for (uint32_t j = 0; j < self->stages; j++) { - allpass_word = word * -allpasscoef + self->allpass_buffer[j + allpass_buffer_offset]; - self->allpass_buffer[j + allpass_buffer_offset] = allpass_word * allpasscoef + word; + allpass_word = synthio_sat16(synthio_sat16(word * -allpasscoef, 15) + self->allpass_buffer[j + allpass_buffer_offset], 0); + self->allpass_buffer[j + allpass_buffer_offset] = synthio_sat16(synthio_sat16(allpass_word * allpasscoef, 15) + word, 0); word = allpass_word; } self->word_buffer[(bool)allpass_buffer_offset] = word; // Add original sample + effect - word = sample_word + (int32_t)(word * mix); + word = sample_word + (int32_t)(synthio_sat16(word * mix, 15)); word = synthio_mix_down_sample(word, 2); if (MP_LIKELY(self->base.bits_per_sample == 16)) { From 02382401c6060154d8283c8871fa6d7a5887cc6f Mon Sep 17 00:00:00 2001 From: Cooper Dalrymple Date: Fri, 2 May 2025 09:08:19 -0500 Subject: [PATCH 28/76] Reduce data size of internal buffers. --- shared-module/audiofilters/Phaser.c | 20 ++++++++++---------- shared-module/audiofilters/Phaser.h | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/shared-module/audiofilters/Phaser.c b/shared-module/audiofilters/Phaser.c index 73a2a8d54a59c..81d9c0bea3083 100644 --- a/shared-module/audiofilters/Phaser.c +++ b/shared-module/audiofilters/Phaser.c @@ -48,8 +48,8 @@ void common_hal_audiofilters_phaser_construct(audiofilters_phaser_obj_t *self, // The below section sets up the effect's starting values. // Create buffer to hold the last processed word - self->word_buffer = m_malloc_without_collect(self->base.channel_count * sizeof(int32_t)); - memset(self->word_buffer, 0, self->base.channel_count * sizeof(int32_t)); + self->word_buffer = m_malloc_without_collect(self->base.channel_count * sizeof(int16_t)); + memset(self->word_buffer, 0, self->base.channel_count * sizeof(int16_t)); self->nyquist = (mp_float_t)self->base.sample_rate / 2; @@ -105,14 +105,14 @@ void common_hal_audiofilters_phaser_set_stages(audiofilters_phaser_obj_t *self, arg = 1; } - self->allpass_buffer = (int32_t *)m_realloc(self->allpass_buffer, + self->allpass_buffer = (int16_t *)m_realloc(self->allpass_buffer, #if MICROPY_MALLOC_USES_ALLOCATED_SIZE - self->base.channel_count * self->stages * sizeof(int32_t), // Old size + self->base.channel_count * self->stages * sizeof(int16_t), // Old size #endif - self->base.channel_count * arg * sizeof(int32_t)); + self->base.channel_count * arg * sizeof(int16_t)); self->stages = arg; - memset(self->allpass_buffer, 0, self->base.channel_count * self->stages * sizeof(int32_t)); + memset(self->allpass_buffer, 0, self->base.channel_count * self->stages * sizeof(int16_t)); } void audiofilters_phaser_reset_buffer(audiofilters_phaser_obj_t *self, @@ -121,8 +121,8 @@ void audiofilters_phaser_reset_buffer(audiofilters_phaser_obj_t *self, memset(self->buffer[0], 0, self->buffer_len); memset(self->buffer[1], 0, self->buffer_len); - memset(self->word_buffer, 0, self->base.channel_count * sizeof(int32_t)); - memset(self->allpass_buffer, 0, self->base.channel_count * self->stages * sizeof(int32_t)); + memset(self->word_buffer, 0, self->base.channel_count * sizeof(int16_t)); + memset(self->allpass_buffer, 0, self->base.channel_count * self->stages * sizeof(int16_t)); } bool common_hal_audiofilters_phaser_get_playing(audiofilters_phaser_obj_t *self) { @@ -253,7 +253,7 @@ audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_o } } - int32_t word = synthio_sat16(sample_word + synthio_sat16(self->word_buffer[right_channel] * feedback, 15), 0); + int32_t word = synthio_sat16(sample_word + synthio_sat16((int32_t)self->word_buffer[right_channel] * feedback, 15), 0); int32_t allpass_word = 0; // Update all-pass filters @@ -262,7 +262,7 @@ audioio_get_buffer_result_t audiofilters_phaser_get_buffer(audiofilters_phaser_o self->allpass_buffer[j + allpass_buffer_offset] = synthio_sat16(synthio_sat16(allpass_word * allpasscoef, 15) + word, 0); word = allpass_word; } - self->word_buffer[(bool)allpass_buffer_offset] = word; + self->word_buffer[(bool)allpass_buffer_offset] = (int16_t)word; // Add original sample + effect word = sample_word + (int32_t)(synthio_sat16(word * mix, 15)); diff --git a/shared-module/audiofilters/Phaser.h b/shared-module/audiofilters/Phaser.h index 707a2b0f0841d..f627b147014a0 100644 --- a/shared-module/audiofilters/Phaser.h +++ b/shared-module/audiofilters/Phaser.h @@ -32,8 +32,8 @@ typedef struct { bool loop; bool more_data; - int32_t *allpass_buffer; - int32_t *word_buffer; + int16_t *allpass_buffer; + int16_t *word_buffer; mp_obj_t sample; } audiofilters_phaser_obj_t; From fba4e681e1a4a0f5b352d356b97d7fc50564c287 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Fri, 2 May 2025 22:49:12 -0700 Subject: [PATCH 29/76] Fix finaliser in malloc helper --- py/malloc.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/py/malloc.c b/py/malloc.c index c83dd4bd6c7d1..fcf930ecfaa83 100644 --- a/py/malloc.c +++ b/py/malloc.c @@ -55,18 +55,8 @@ // example. On the other hand, some (e.g. bare-metal) ports may use GC // heap as system heap, so, to avoid warnings, we do undef's first. // CIRCUITPY-CHANGE: Add selective collect support to malloc to optimize GC for large buffers -#undef malloc #undef free #undef realloc -#if MICROPY_ENABLE_SELECTIVE_COLLECT -#define malloc(b) gc_alloc((b), GC_ALLOC_FLAG_DO_NOT_COLLECT) -#define malloc_with_collect(b) gc_alloc((b), 0) -#define malloc_without_collect(b) gc_alloc((b), GC_ALLOC_FLAG_DO_NOT_COLLECT) -#else -#define malloc(b) gc_alloc((b), 0) -#define malloc_with_collect(b) gc_alloc((b), 0) -#endif -#define malloc_with_finaliser(b) gc_alloc((b), GC_ALLOC_FLAG_HAS_FINALISER) #define free gc_free #define realloc(ptr, n) gc_realloc(ptr, n, true) #define realloc_ext(ptr, n, mv) gc_realloc(ptr, n, mv) @@ -99,15 +89,18 @@ static void *realloc_ext(void *ptr, size_t n_bytes, bool allow_move) { void *m_malloc_helper(size_t num_bytes, uint8_t flags) { void *ptr; #if MICROPY_ENABLE_GC + uint8_t gc_flags = 0; #if MICROPY_ENABLE_SELECTIVE_COLLECT if ((flags & M_MALLOC_COLLECT) == 0) { - ptr = malloc_without_collect(num_bytes); - } else { - ptr = malloc_with_collect(num_bytes); + gc_flags |= GC_ALLOC_FLAG_DO_NOT_COLLECT; + } + #endif + #if MICROPY_ENABLE_FINALISER + if ((flags & M_MALLOC_WITH_FINALISER) != 0) { + gc_flags |= GC_ALLOC_FLAG_HAS_FINALISER; } - #else - ptr = malloc_with_collect(num_bytes); #endif + ptr = gc_alloc(num_bytes, gc_flags); #else ptr = malloc(num_bytes); #endif From 1f5ce9613980d2c7ba57b128644869de80cbfaad Mon Sep 17 00:00:00 2001 From: eightycc Date: Fri, 2 May 2025 22:58:32 -0700 Subject: [PATCH 30/76] Durable fix for RISC-V interpreter crash. --- shared/runtime/pyexec.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/shared/runtime/pyexec.c b/shared/runtime/pyexec.c index 8d09a9257a6b0..df2b60e207c94 100644 --- a/shared/runtime/pyexec.c +++ b/shared/runtime/pyexec.c @@ -90,9 +90,10 @@ static int parse_compile_execute(const void *source, mp_parse_input_kind_t input nlr_buf_t nlr; nlr.ret_val = NULL; - // CIRCUITPY-CHANGE - mp_obj_t module_fun = mp_const_none; if (nlr_push(&nlr) == 0) { + // CIRCUITPY-CHANGE: Made volatile to prevent gcc from re-ordering store of function pointer into stack frame + // after call to gc_collect. For RISC-V this was causing free of the compiled function before execution. + volatile mp_obj_t module_fun = mp_const_none; // CIRCUITPY-CHANGE #if CIRCUITPY_ATEXIT if (!(exec_flags & EXEC_FLAG_SOURCE_IS_ATEXIT)) From 8c12ec27b0fd7729d4d97b16a793291dc1519e8e Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Mon, 5 May 2025 05:57:42 -0400 Subject: [PATCH 31/76] Add end() method to MixerVoice to allow samples to finish playing before ending looping --- shared-bindings/audiomixer/MixerVoice.c | 14 ++++++++++++++ shared-bindings/audiomixer/MixerVoice.h | 1 + shared-module/audiomixer/MixerVoice.c | 6 ++++++ 3 files changed, 21 insertions(+) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 90ee877734402..0100cb993c6cf 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -81,6 +81,19 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po } MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); +//| def end() -> None +//| "" +//| Sets looping to False if sample is playing, allowing current looped +// sample to finish before looping again "" +//| +STATIC mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { + audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in); + common_hal_audiomixer_mixervoice_end(self); + return mp_const_none; +} +MP_DEFINE_CONST_FUN_OBJ_1(audiomixer_mixervoice_end_obj, audiomixer_mixervoice_obj_end); + + //| level: synthio.BlockInput //| """The volume level of a voice, as a floating point number between 0 and 1. If your board //| does not support synthio, this property will only accept a float value. @@ -140,6 +153,7 @@ static const mp_rom_map_elem_t audiomixer_mixervoice_locals_dict_table[] = { // Methods { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiomixer_mixervoice_play_obj) }, { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiomixer_mixervoice_stop_obj) }, + { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) // Properties { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) }, diff --git a/shared-bindings/audiomixer/MixerVoice.h b/shared-bindings/audiomixer/MixerVoice.h index cf6643d995c07..fe350eb1a7592 100644 --- a/shared-bindings/audiomixer/MixerVoice.h +++ b/shared-bindings/audiomixer/MixerVoice.h @@ -15,6 +15,7 @@ void common_hal_audiomixer_mixervoice_construct(audiomixer_mixervoice_obj_t *sel void common_hal_audiomixer_mixervoice_set_parent(audiomixer_mixervoice_obj_t *self, audiomixer_mixer_obj_t *parent); void common_hal_audiomixer_mixervoice_play(audiomixer_mixervoice_obj_t *self, mp_obj_t sample, bool loop); void common_hal_audiomixer_mixervoice_stop(audiomixer_mixervoice_obj_t *self); +void common_hal_audiomixer_mixervoice_end(audiomixer_mixervoice_obj_t *self); mp_obj_t common_hal_audiomixer_mixervoice_get_level(audiomixer_mixervoice_obj_t *self); void common_hal_audiomixer_mixervoice_set_level(audiomixer_mixervoice_obj_t *self, mp_obj_t gain); diff --git a/shared-module/audiomixer/MixerVoice.c b/shared-module/audiomixer/MixerVoice.c index a63229cf5af03..e0be869aa8e44 100644 --- a/shared-module/audiomixer/MixerVoice.c +++ b/shared-module/audiomixer/MixerVoice.c @@ -67,3 +67,9 @@ bool common_hal_audiomixer_mixervoice_get_playing(audiomixer_mixervoice_obj_t *s void common_hal_audiomixer_mixervoice_stop(audiomixer_mixervoice_obj_t *self) { self->sample = NULL; } + +void common_hal_audiomixer_mixervoice_end(audiomixer_mixervoice_obj_t *self) { + if (self->sample != NULL) { + self->loop = false; + } +} From 201536798cbe541b97f9523abbbd8333bc54a0e1 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Mon, 5 May 2025 10:44:43 -0700 Subject: [PATCH 32/76] Fix cp.org release PR creation We need to sync the adabot fork first. --- tools/build_board_info.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/build_board_info.py b/tools/build_board_info.py index f520152bc6475..8b56539a233b4 100755 --- a/tools/build_board_info.py +++ b/tools/build_board_info.py @@ -173,6 +173,14 @@ def create_pr(changes, updated, git_info, user): changes["new_release"], boards, languages ) + # Sync main so that the fork has the same commit sha1 + sync_main = {"branch": "main"} + response = github.post( + "/repos/{}/circuitpython-org/merge-upstream".format(user), json=sync_main + ) + if not response.ok: + raise SystemExit(f"unable to sync main: {response.text}") + create_branch = {"ref": "refs/heads/" + branch_name, "sha": commit_sha} response = github.post("/repos/{}/circuitpython-org/git/refs".format(user), json=create_branch) if not response.ok and response.json()["message"] != "Reference already exists": From 209d5160aba52fd726e7f7c650c392339b97ee54 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Mon, 5 May 2025 15:28:41 -0400 Subject: [PATCH 33/76] Update docstring --- shared-bindings/audiomixer/MixerVoice.c | 37 +++++++++++++------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 0100cb993c6cf..91e28208280bf 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -81,10 +81,10 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po } MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); -//| def end() -> None -//| "" -//| Sets looping to False if sample is playing, allowing current looped -// sample to finish before looping again "" +//| def end() -> None: +//| "" Sets looping to False if sample is playing, allowing current looped +//| sample to finish before looping again "" +//| ... //| STATIC mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in); @@ -155,17 +155,18 @@ static const mp_rom_map_elem_t audiomixer_mixervoice_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiomixer_mixervoice_stop_obj) }, { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) - // Properties - { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) }, - { MP_ROM_QSTR(MP_QSTR_level), MP_ROM_PTR(&audiomixer_mixervoice_level_obj) }, - { MP_ROM_QSTR(MP_QSTR_loop), MP_ROM_PTR(&audiomixer_mixervoice_loop_obj) }, -}; -static MP_DEFINE_CONST_DICT(audiomixer_mixervoice_locals_dict, audiomixer_mixervoice_locals_dict_table); - -MP_DEFINE_CONST_OBJ_TYPE( - audiomixer_mixervoice_type, - MP_QSTR_MixerVoice, - MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, - make_new, audiomixer_mixervoice_make_new, - locals_dict, &audiomixer_mixervoice_locals_dict - ); + // Properties + { + MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) + }, + { MP_ROM_QSTR(MP_QSTR_level), MP_ROM_PTR(&audiomixer_mixervoice_level_obj) }, + { MP_ROM_QSTR(MP_QSTR_loop), MP_ROM_PTR(&audiomixer_mixervoice_loop_obj) }, }; + static MP_DEFINE_CONST_DICT(audiomixer_mixervoice_locals_dict, audiomixer_mixervoice_locals_dict_table); + + MP_DEFINE_CONST_OBJ_TYPE( + audiomixer_mixervoice_type, + MP_QSTR_MixerVoice, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, audiomixer_mixervoice_make_new, + locals_dict, &audiomixer_mixervoice_locals_dict + ); From 1c7a0ccf2dd80c22ff7f4d801b4c19b656c26886 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Mon, 5 May 2025 15:42:34 -0400 Subject: [PATCH 34/76] Update docstring --- shared-bindings/audiomixer/MixerVoice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 91e28208280bf..821b9746a0ab6 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -81,7 +81,7 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po } MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); -//| def end() -> None: +//| def end(self) -> None: //| "" Sets looping to False if sample is playing, allowing current looped //| sample to finish before looping again "" //| ... From ba20540a1fb975d057b5a83cd1e7d7a736117220 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Mon, 5 May 2025 21:14:46 -0400 Subject: [PATCH 35/76] Update shared-bindings/audiomixer/MixerVoice.c Co-authored-by: Scott Shawcroft --- shared-bindings/audiomixer/MixerVoice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 821b9746a0ab6..3e1642a35c7ec 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -86,7 +86,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervo //| sample to finish before looping again "" //| ... //| -STATIC mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { +static mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in); common_hal_audiomixer_mixervoice_end(self); return mp_const_none; From 2c80f37b872e586e5a340e2e003a55485808fe9c Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Tue, 6 May 2025 05:46:51 -0400 Subject: [PATCH 36/76] Update shared-bindings/audiomixer/MixerVoice.c Co-authored-by: Mark <56205165+gamblor21@users.noreply.github.com> --- shared-bindings/audiomixer/MixerVoice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 3e1642a35c7ec..3fd3bf46aacf1 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -153,7 +153,7 @@ static const mp_rom_map_elem_t audiomixer_mixervoice_locals_dict_table[] = { // Methods { MP_ROM_QSTR(MP_QSTR_play), MP_ROM_PTR(&audiomixer_mixervoice_play_obj) }, { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiomixer_mixervoice_stop_obj) }, - { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) + { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) }, // Properties { From bcda5a4d02d31e2046ea3f2474844a2aefa8547c Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Tue, 6 May 2025 05:46:59 -0400 Subject: [PATCH 37/76] Update shared-bindings/audiomixer/MixerVoice.c Co-authored-by: Mark <56205165+gamblor21@users.noreply.github.com> --- shared-bindings/audiomixer/MixerVoice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 3fd3bf46aacf1..bd47b57ad6c50 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -82,7 +82,7 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); //| def end(self) -> None: -//| "" Sets looping to False if sample is playing, allowing current looped +//| """ Sets looping to False if sample is playing, allowing current looped //| sample to finish before looping again "" //| ... //| From fa565e5fa42f524dcee9b6236912b57697c5e3b5 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Tue, 6 May 2025 05:47:08 -0400 Subject: [PATCH 38/76] Update shared-bindings/audiomixer/MixerVoice.c Co-authored-by: Mark <56205165+gamblor21@users.noreply.github.com> --- shared-bindings/audiomixer/MixerVoice.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index bd47b57ad6c50..901a3f2c06f7a 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -83,7 +83,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervo //| def end(self) -> None: //| """ Sets looping to False if sample is playing, allowing current looped -//| sample to finish before looping again "" +//| sample to finish before looping again """ //| ... //| static mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { From f8406397fe5ea93b39c14a0df82eeb8e9c2f38d6 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Tue, 6 May 2025 09:17:29 -0400 Subject: [PATCH 39/76] Update end() docstring --- shared-bindings/audiomixer/MixerVoice.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 901a3f2c06f7a..1df15198ff4ba 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -82,9 +82,9 @@ static mp_obj_t audiomixer_mixervoice_obj_stop(size_t n_args, const mp_obj_t *po MP_DEFINE_CONST_FUN_OBJ_KW(audiomixer_mixervoice_stop_obj, 1, audiomixer_mixervoice_obj_stop); //| def end(self) -> None: -//| """ Sets looping to False if sample is playing, allowing current looped -//| sample to finish before looping again """ -//| ... +//| """ Sets looping to False if sample is playing. This allows the looped +//| sample to complete its current playback and end further looping """ +//| ... //| static mp_obj_t audiomixer_mixervoice_obj_end(mp_obj_t self_in) { audiomixer_mixervoice_obj_t *self = MP_OBJ_TO_PTR(self_in); From fd2500da6bbc8ccc9f953dabc35209d2416c7613 Mon Sep 17 00:00:00 2001 From: Bob Hammell Date: Tue, 6 May 2025 10:13:48 -0400 Subject: [PATCH 40/76] Update formatting --- shared-bindings/audiomixer/MixerVoice.c | 29 ++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/shared-bindings/audiomixer/MixerVoice.c b/shared-bindings/audiomixer/MixerVoice.c index 1df15198ff4ba..fc292d4ea2f68 100644 --- a/shared-bindings/audiomixer/MixerVoice.c +++ b/shared-bindings/audiomixer/MixerVoice.c @@ -155,18 +155,17 @@ static const mp_rom_map_elem_t audiomixer_mixervoice_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&audiomixer_mixervoice_stop_obj) }, { MP_ROM_QSTR(MP_QSTR_end), MP_ROM_PTR(&audiomixer_mixervoice_end_obj) }, - // Properties - { - MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) - }, - { MP_ROM_QSTR(MP_QSTR_level), MP_ROM_PTR(&audiomixer_mixervoice_level_obj) }, - { MP_ROM_QSTR(MP_QSTR_loop), MP_ROM_PTR(&audiomixer_mixervoice_loop_obj) }, }; - static MP_DEFINE_CONST_DICT(audiomixer_mixervoice_locals_dict, audiomixer_mixervoice_locals_dict_table); - - MP_DEFINE_CONST_OBJ_TYPE( - audiomixer_mixervoice_type, - MP_QSTR_MixerVoice, - MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, - make_new, audiomixer_mixervoice_make_new, - locals_dict, &audiomixer_mixervoice_locals_dict - ); + // Properties + { MP_ROM_QSTR(MP_QSTR_playing), MP_ROM_PTR(&audiomixer_mixervoice_playing_obj) }, + { MP_ROM_QSTR(MP_QSTR_level), MP_ROM_PTR(&audiomixer_mixervoice_level_obj) }, + { MP_ROM_QSTR(MP_QSTR_loop), MP_ROM_PTR(&audiomixer_mixervoice_loop_obj) }, +}; +static MP_DEFINE_CONST_DICT(audiomixer_mixervoice_locals_dict, audiomixer_mixervoice_locals_dict_table); + +MP_DEFINE_CONST_OBJ_TYPE( + audiomixer_mixervoice_type, + MP_QSTR_MixerVoice, + MP_TYPE_FLAG_HAS_SPECIAL_ACCESSORS, + make_new, audiomixer_mixervoice_make_new, + locals_dict, &audiomixer_mixervoice_locals_dict + ); From 7b12bc8837157b14007e0344c53d0d7a66640d6e Mon Sep 17 00:00:00 2001 From: eightycc Date: Tue, 6 May 2025 10:57:54 -0700 Subject: [PATCH 41/76] Fix port_get_raw_ticks() for these ports: o broadcom: return subticks o cxd56: return subticks only when pointer is non-null o litex: zero subticks, port is accurate only to ticks o raspberrypi: correct subtick calculation --- ports/broadcom/supervisor/port.c | 6 +++++- ports/cxd56/supervisor/port.c | 4 +++- ports/litex/supervisor/port.c | 3 +++ ports/raspberrypi/supervisor/port.c | 6 +++--- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/ports/broadcom/supervisor/port.c b/ports/broadcom/supervisor/port.c index 33b20b7c8647a..83dd50f1b8b52 100644 --- a/ports/broadcom/supervisor/port.c +++ b/ports/broadcom/supervisor/port.c @@ -143,7 +143,11 @@ uint64_t port_get_raw_ticks(uint8_t *subticks) { } COMPLETE_MEMORY_READS; uint64_t microseconds = hi << 32 | lo; - return 1024 * (microseconds / 1000000) + (microseconds % 1000000) / 977; + int64_t all_subticks = microseconds * 512 / 15625; + if (subticks != NULL) { + *subticks = all_subticks % 32; + } + return all_subticks / 32; } void TIMER_1_IRQHandler(void) { diff --git a/ports/cxd56/supervisor/port.c b/ports/cxd56/supervisor/port.c index 237013ff2bdab..75abcbf6d93e0 100644 --- a/ports/cxd56/supervisor/port.c +++ b/ports/cxd56/supervisor/port.c @@ -124,7 +124,9 @@ void board_timerhook(void) { uint64_t port_get_raw_ticks(uint8_t *subticks) { uint64_t count = cxd56_rtc_count(); - *subticks = count % 32; + if (subticks != NULL) { + *subticks = count % 32; + } return count / 32; } diff --git a/ports/litex/supervisor/port.c b/ports/litex/supervisor/port.c index 7009956c317ab..98fce16152e0b 100644 --- a/ports/litex/supervisor/port.c +++ b/ports/litex/supervisor/port.c @@ -114,6 +114,9 @@ uint64_t port_get_raw_ticks(uint8_t *subticks) { common_hal_mcu_disable_interrupts(); uint64_t raw_tick_snapshot = raw_ticks; common_hal_mcu_enable_interrupts(); + if (subticks != NULL) { + *subticks = 0; + } return raw_tick_snapshot; } diff --git a/ports/raspberrypi/supervisor/port.c b/ports/raspberrypi/supervisor/port.c index 60d43e78ad361..f5bc67332af4b 100644 --- a/ports/raspberrypi/supervisor/port.c +++ b/ports/raspberrypi/supervisor/port.c @@ -491,11 +491,11 @@ static volatile bool ticks_enabled; static volatile bool _woken_up; uint64_t port_get_raw_ticks(uint8_t *subticks) { - uint64_t microseconds = time_us_64(); + int64_t all_subticks = time_us_64() * 512 / 15625; if (subticks != NULL) { - *subticks = (uint8_t)(((microseconds % 1000000) % 977) / 31); + *subticks = all_subticks % 32; } - return 1024 * (microseconds / 1000000) + (microseconds % 1000000) / 977; + return all_subticks / 32; } static void _tick_callback(uint alarm_num) { From fcf7df857eb8600849408d208652f991fa34bcc9 Mon Sep 17 00:00:00 2001 From: eightycc Date: Tue, 6 May 2025 11:01:05 -0700 Subject: [PATCH 42/76] Improve mp_hal_delay_ms by implementing subtick resolution. --- supervisor/shared/tick.c | 30 ++++++++++++++++++++---------- supervisor/shared/tick.h | 7 +++++++ 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/supervisor/shared/tick.c b/supervisor/shared/tick.c index 24a06e622a181..dc646ae07b408 100644 --- a/supervisor/shared/tick.c +++ b/supervisor/shared/tick.c @@ -85,6 +85,13 @@ void supervisor_tick(void) { background_callback_add(&tick_callback, supervisor_background_tick, NULL); } +uint64_t supervisor_get_raw_subticks(void) { + uint64_t ticks; + uint8_t subticks; + ticks = port_get_raw_ticks(&subticks); + return (ticks << 5) | subticks; +} + uint64_t supervisor_ticks_ms64() { uint64_t result; result = port_get_raw_ticks(NULL); @@ -97,26 +104,29 @@ uint32_t supervisor_ticks_ms32() { } void mp_hal_delay_ms(mp_uint_t delay_ms) { - uint64_t start_tick = port_get_raw_ticks(NULL); - // Adjust the delay to ticks vs ms. - uint64_t delay_ticks = (delay_ms * (uint64_t)1024) / 1000; - uint64_t end_tick = start_tick + delay_ticks; - int64_t remaining = delay_ticks; + uint64_t start_subtick = supervisor_get_raw_subticks(); + // Convert delay from ms to subticks + uint64_t delay_subticks = (delay_ms * (uint64_t)32768) / 1000; + uint64_t end_subtick = start_subtick + delay_subticks; + int64_t remaining = delay_subticks; // Loop until we've waited long enough or we've been CTRL-Ced by autoreload // or the user. while (remaining > 0 && !mp_hal_is_interrupted()) { RUN_BACKGROUND_TASKS; - remaining = end_tick - port_get_raw_ticks(NULL); + remaining = end_subtick - supervisor_get_raw_subticks(); // We break a bit early so we don't risk setting the alarm before the time when we call // sleep. if (remaining < 1) { break; } - port_interrupt_after_ticks(remaining); - // Idle until an interrupt happens. - port_idle_until_interrupt(); - remaining = end_tick - port_get_raw_ticks(NULL); + uint32_t remaining_ticks = remaining / 32; + if (remaining_ticks > 0) { + port_interrupt_after_ticks(remaining_ticks); + // Idle until an interrupt happens. + port_idle_until_interrupt(); + } + remaining = end_subtick - supervisor_get_raw_subticks(); } } diff --git a/supervisor/shared/tick.h b/supervisor/shared/tick.h index fc18e8f762f55..9f303e17e7faa 100644 --- a/supervisor/shared/tick.h +++ b/supervisor/shared/tick.h @@ -33,6 +33,13 @@ extern uint32_t supervisor_ticks_ms32(void); */ extern uint64_t supervisor_ticks_ms64(void); +/** @brief Get 64-bit current time in subticks + * + * Time is returned as a 64-bit count of subticks where each subtick is 1/32768 + * of a second. + */ +extern uint64_t supervisor_get_raw_subticks(void); + extern void supervisor_enable_tick(void); extern void supervisor_disable_tick(void); From 61071cb41c7e81a0be11fb3ccec54a60de2398ab Mon Sep 17 00:00:00 2001 From: eightycc Date: Wed, 7 May 2025 08:06:41 -0700 Subject: [PATCH 43/76] Improve update to mp_hal_delay_ms: o Test for console interrupt during RUN_BACKGROUND_TASK o Handle signedness of remaining tick/subtick values correctly for very large delays o Improve comments --- supervisor/shared/tick.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/supervisor/shared/tick.c b/supervisor/shared/tick.c index dc646ae07b408..56021fc04f6b2 100644 --- a/supervisor/shared/tick.c +++ b/supervisor/shared/tick.c @@ -114,13 +114,14 @@ void mp_hal_delay_ms(mp_uint_t delay_ms) { // or the user. while (remaining > 0 && !mp_hal_is_interrupted()) { RUN_BACKGROUND_TASKS; - remaining = end_subtick - supervisor_get_raw_subticks(); - // We break a bit early so we don't risk setting the alarm before the time when we call - // sleep. - if (remaining < 1) { + // Exit if interrupted while running background tasks + if (mp_hal_is_interrupted()) { break; } - uint32_t remaining_ticks = remaining / 32; + // Recalculate remaining delay after running background tasks + remaining = end_subtick - supervisor_get_raw_subticks(); + // If remaining delay is less than 1 tick, idle loop until end of delay + int64_t remaining_ticks = remaining / 32; if (remaining_ticks > 0) { port_interrupt_after_ticks(remaining_ticks); // Idle until an interrupt happens. From b05e80e0b687f07752b6bdad5b949432d50ba7d3 Mon Sep 17 00:00:00 2001 From: eightycc Date: Wed, 7 May 2025 11:01:17 -0700 Subject: [PATCH 44/76] Make supervisor_get_raw_subticks a static function _get_raw_subticks. --- supervisor/shared/tick.c | 8 ++++---- supervisor/shared/tick.h | 7 ------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/supervisor/shared/tick.c b/supervisor/shared/tick.c index 56021fc04f6b2..e19b7c4e68134 100644 --- a/supervisor/shared/tick.c +++ b/supervisor/shared/tick.c @@ -85,7 +85,7 @@ void supervisor_tick(void) { background_callback_add(&tick_callback, supervisor_background_tick, NULL); } -uint64_t supervisor_get_raw_subticks(void) { +static uint64_t _get_raw_subticks(void) { uint64_t ticks; uint8_t subticks; ticks = port_get_raw_ticks(&subticks); @@ -104,7 +104,7 @@ uint32_t supervisor_ticks_ms32() { } void mp_hal_delay_ms(mp_uint_t delay_ms) { - uint64_t start_subtick = supervisor_get_raw_subticks(); + uint64_t start_subtick = _get_raw_subticks(); // Convert delay from ms to subticks uint64_t delay_subticks = (delay_ms * (uint64_t)32768) / 1000; uint64_t end_subtick = start_subtick + delay_subticks; @@ -119,7 +119,7 @@ void mp_hal_delay_ms(mp_uint_t delay_ms) { break; } // Recalculate remaining delay after running background tasks - remaining = end_subtick - supervisor_get_raw_subticks(); + remaining = end_subtick - _get_raw_subticks(); // If remaining delay is less than 1 tick, idle loop until end of delay int64_t remaining_ticks = remaining / 32; if (remaining_ticks > 0) { @@ -127,7 +127,7 @@ void mp_hal_delay_ms(mp_uint_t delay_ms) { // Idle until an interrupt happens. port_idle_until_interrupt(); } - remaining = end_subtick - supervisor_get_raw_subticks(); + remaining = end_subtick - _get_raw_subticks(); } } diff --git a/supervisor/shared/tick.h b/supervisor/shared/tick.h index 9f303e17e7faa..fc18e8f762f55 100644 --- a/supervisor/shared/tick.h +++ b/supervisor/shared/tick.h @@ -33,13 +33,6 @@ extern uint32_t supervisor_ticks_ms32(void); */ extern uint64_t supervisor_ticks_ms64(void); -/** @brief Get 64-bit current time in subticks - * - * Time is returned as a 64-bit count of subticks where each subtick is 1/32768 - * of a second. - */ -extern uint64_t supervisor_get_raw_subticks(void); - extern void supervisor_enable_tick(void); extern void supervisor_disable_tick(void); From 5a8881452071730057eabba9f92f7a84a242da7d Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Fri, 2 May 2025 22:36:27 -0700 Subject: [PATCH 45/76] Fix imx microcontroller.pin We need to be able to include pin_names.h more than once for it to work. Broken by #9260. Fixes #9957 --- ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/pin_names.h | 3 +-- ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1015/pin_names.h | 2 +- ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1021/pin_names.h | 2 +- ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1042/pin_names.h | 2 +- ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1052/pin_names.h | 2 +- ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/pin_names.h | 2 +- ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1176/pin_names.h | 2 +- ports/mimxrt10xx/peripherals/mimxrt10xx/pin_names.h | 2 -- 8 files changed, 7 insertions(+), 10 deletions(-) diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/pin_names.h index 1d6a9cafaf841..3cf071f62caa9 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1011/pin_names.h @@ -6,8 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once - +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1015/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1015/pin_names.h index ee8b47b61afe9..a0bb59e547957 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1015/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1015/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1021/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1021/pin_names.h index 1218cd8ed8db6..45203c59968a8 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1021/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1021/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1042/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1042/pin_names.h index 42f03e02f9119..8a98f4560a6c5 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1042/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1042/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1052/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1052/pin_names.h index 5483206f94f37..41d2d67f81adb 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1052/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1052/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/pin_names.h index 5483206f94f37..41d2d67f81adb 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1062/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1176/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1176/pin_names.h index ec23d603de7d0..b5a5b86b4ddf8 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1176/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/MIMXRT1176/pin_names.h @@ -6,7 +6,7 @@ // // SPDX-License-Identifier: MIT -#pragma once +// OK to include more than once because FORMAT_PIN may be different. // define FORMAT_PIN(pin_name) and then include this file. diff --git a/ports/mimxrt10xx/peripherals/mimxrt10xx/pin_names.h b/ports/mimxrt10xx/peripherals/mimxrt10xx/pin_names.h index 22fa6c572964e..ffaa74edc3887 100644 --- a/ports/mimxrt10xx/peripherals/mimxrt10xx/pin_names.h +++ b/ports/mimxrt10xx/peripherals/mimxrt10xx/pin_names.h @@ -5,8 +5,6 @@ // // SPDX-License-Identifier: MIT -#pragma once - // OK to include more than once because FORMAT_PIN may be different. #ifdef MIMXRT1011_SERIES From 01da5c7c885dada1e14b1a25694ddbac78270725 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 7 May 2025 15:24:32 -0500 Subject: [PATCH 46/76] make TilePaletteMapper accept TileGrid as arg, make pixel_shader optional on TileGrid init, make TPM mark single tile dirty instead of whole TileGrid when mapping is changed. --- locale/circuitpython.pot | 22 +++++--- shared-bindings/displayio/TileGrid.c | 8 +-- .../tilepalettemapper/TilePaletteMapper.c | 31 ++++++++--- .../tilepalettemapper/TilePaletteMapper.h | 3 +- shared-module/displayio/Group.c | 3 ++ shared-module/displayio/TileGrid.c | 52 ++++++++----------- shared-module/displayio/TileGrid.h | 2 + .../tilepalettemapper/TilePaletteMapper.c | 27 +++++----- .../tilepalettemapper/TilePaletteMapper.h | 5 +- 9 files changed, 86 insertions(+), 67 deletions(-) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 6beb320527e43..25908c7ec9e43 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -1056,7 +1056,8 @@ msgstr "" msgid "File exists" msgstr "" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1251,6 +1252,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2068,6 +2070,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/displayio/Group.c +msgid "TileGrid must have a pixel_shader" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2591,16 +2597,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -4017,7 +4023,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/shared-bindings/displayio/TileGrid.c b/shared-bindings/displayio/TileGrid.c index eddf3f66c4ec0..36ba1361de242 100644 --- a/shared-bindings/displayio/TileGrid.c +++ b/shared-bindings/displayio/TileGrid.c @@ -68,7 +68,7 @@ void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader) { //| tile_width and tile_height match the height of the bitmap by default. //| //| :param Bitmap,OnDiskBitmap bitmap: The bitmap storing one or more tiles. -//| :param ColorConverter,Palette pixel_shader: The pixel shader that produces colors from values +//| :param Optional[ColorConverter,Palette] pixel_shader: The pixel shader that produces colors from values //| :param int width: Width of the grid in tiles. //| :param int height: Height of the grid in tiles. //| :param int tile_width: Width of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. @@ -81,7 +81,7 @@ static mp_obj_t displayio_tilegrid_make_new(const mp_obj_type_t *type, size_t n_ enum { ARG_bitmap, ARG_pixel_shader, ARG_width, ARG_height, ARG_tile_width, ARG_tile_height, ARG_default_tile, ARG_x, ARG_y }; static const mp_arg_t allowed_args[] = { { MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, - { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, + { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, { MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, { MP_QSTR_height, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, { MP_QSTR_tile_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, @@ -109,7 +109,9 @@ static mp_obj_t displayio_tilegrid_make_new(const mp_obj_type_t *type, size_t n_ mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_bitmap); } mp_obj_t pixel_shader = args[ARG_pixel_shader].u_obj; - displayio_tilegrid_validate_pixel_shader(pixel_shader); + if (pixel_shader != mp_const_none) { + displayio_tilegrid_validate_pixel_shader(pixel_shader); + } uint16_t tile_width = args[ARG_tile_width].u_int; if (tile_width == 0) { tile_width = bitmap_width; diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index 88189de549dbb..cf18e37ba120f 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -12,6 +12,7 @@ #include "shared-bindings/util.h" #include "shared-bindings/displayio/Palette.h" #include "shared-bindings/displayio/ColorConverter.h" +#include "shared-bindings/displayio/TileGrid.h" #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" //| class TilePaletteMapper: @@ -21,24 +22,23 @@ //| bitmap with a wider array of colors.""" //| //| def __init__( -//| self, palette: displayio.Palette, input_color_count: int, width: int, height: int +//| self, palette: displayio.Palette, input_color_count: int, tilegrid: TileGrid //| ) -> None: //| """Create a TilePaletteMApper object to store a set of color mappings for tiles. //| //| :param Union[displayio.Palette, displayio.ColorConverter] pixel_shader: //| The palette or ColorConverter to get mapped colors from. //| :param int input_color_count: The number of colors in in the input bitmap. -//| :param int width: The width of the grid in tiles. -//| :param int height: The height of the grid in tiles.""" +//| :param TileGrid tilegrid: The tilegrid to use with the TilePaletteMapper //| static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - enum { ARG_pixel_shader, ARG_input_color_count, ARG_width, ARG_height }; + enum { ARG_pixel_shader, ARG_input_color_count, ARG_tilegrid }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_REQUIRED }, { MP_QSTR_input_color_count, MP_ARG_INT | MP_ARG_REQUIRED }, - { MP_QSTR_width, MP_ARG_INT | MP_ARG_REQUIRED }, - { MP_QSTR_height, MP_ARG_INT | MP_ARG_REQUIRED }, + { MP_QSTR_tilegrid, MP_ARG_OBJ | MP_ARG_REQUIRED }, + }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); @@ -46,8 +46,14 @@ static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t if (!mp_obj_is_type(pixel_shader, &displayio_palette_type) && !mp_obj_is_type(pixel_shader, &displayio_colorconverter_type)) { mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); } + + mp_obj_t tilegrid = args[ARG_tilegrid].u_obj; + if (!mp_obj_is_type(tilegrid, &displayio_tilegrid_type)) { + mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_tilegrid); + } + tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type); - common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int, args[ARG_width].u_int, args[ARG_height].u_int); + common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int, tilegrid); return MP_OBJ_FROM_PTR(self); } @@ -87,6 +93,17 @@ MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_pixel_shader_o MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj, (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_pixel_shader_obj); +//| tilegrid: displayio.TileGrid +//| """The tilegrid that the TilePaletteMapper is used on.""" +//| +static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_tilegrid(mp_obj_t self_in) { + tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); + return common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(self); +} +MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_tilegrid_obj, tilepalettemapper_tilepalettemapper_obj_get_tilegrid); + +MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_tilegrid_obj, + (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_tilegrid_obj); //| def __getitem__(self, index: Union[Tuple[int, int], int]) -> Tuple[int]: //| """Returns the mapping for the given index. The index can either be an x,y tuple or an int equal diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.h b/shared-bindings/tilepalettemapper/TilePaletteMapper.h index 3fa1ab1e3a5cc..2063dc4e8848e 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.h +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.h @@ -8,11 +8,12 @@ extern const mp_obj_type_t tilepalettemapper_tilepalettemapper_type; void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t paltte, uint16_t input_color_count, uint16_t bitmap_width_in_tiles, uint16_t bitmap_height_in_tiles); + mp_obj_t paltte, uint16_t input_color_count, mp_obj_t tilegrid); uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self); uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_height(tilepalettemapper_tilepalettemapper_t *self); mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_pixel_shader(tilepalettemapper_tilepalettemapper_t *self); +mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(tilepalettemapper_tilepalettemapper_t *self); mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y); void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y, size_t len, mp_obj_t *items); diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index e2a1a527062b8..f4a984c0dff19 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -258,6 +258,9 @@ static void _add_layer(displayio_group_t *self, mp_obj_t layer) { mp_obj_t native_layer = mp_obj_cast_to_native_base(layer, &displayio_tilegrid_type); if (native_layer != MP_OBJ_NULL) { displayio_tilegrid_t *tilegrid = native_layer; + if (tilegrid->pixel_shader == mp_const_none) { + mp_raise_ValueError(MP_ERROR_TEXT("TileGrid must have a pixel_shader")); + } if (tilegrid->in_group) { mp_raise_ValueError(MP_ERROR_TEXT("Layer already in a group")); } else { diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index cfa97130b6aa0..b97f52ebac022 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -275,25 +275,7 @@ uint16_t common_hal_displayio_tilegrid_get_tile(displayio_tilegrid_t *self, uint } } -void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint16_t tile_index) { - if (tile_index >= self->tiles_in_bitmap) { - mp_raise_ValueError(MP_ERROR_TEXT("Tile index out of bounds")); - } - - void *tiles = self->tiles; - if (self->inline_tiles) { - tiles = &self->tiles; - } - if (tiles == NULL) { - return; - } - - uint32_t index = y * self->width_in_tiles + x; - if (self->tiles_in_bitmap > 255) { - ((uint16_t *)tiles)[index] = tile_index; - } else { - ((uint8_t *)tiles)[index] = (uint8_t)tile_index; - } +void displayio_tilegrid_mark_tile_dirty(displayio_tilegrid_t *self, uint16_t x, uint16_t y) { displayio_area_t temp_area; displayio_area_t *tile_area; if (!self->partial_change) { @@ -318,6 +300,28 @@ void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t displayio_area_union(&self->dirty_area, &temp_area, &self->dirty_area); } +} + +void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint16_t tile_index) { + if (tile_index >= self->tiles_in_bitmap) { + mp_raise_ValueError(MP_ERROR_TEXT("Tile index out of bounds")); + } + + void *tiles = self->tiles; + if (self->inline_tiles) { + tiles = &self->tiles; + } + if (tiles == NULL) { + return; + } + + uint32_t index = y * self->width_in_tiles + x; + if (self->tiles_in_bitmap > 255) { + ((uint16_t *)tiles)[index] = tile_index; + } else { + ((uint8_t *)tiles)[index] = (uint8_t)tile_index; + } + displayio_tilegrid_mark_tile_dirty(self, x, y); self->partial_change = true; } @@ -613,11 +617,6 @@ void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self) { } else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) { displayio_colorconverter_finish_refresh(self->pixel_shader); } - #if CIRCUITPY_TILEPALETTEMAPPER - if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { - tilepalettemapper_tilepalettemapper_finish_refresh(self->pixel_shader); - } - #endif if (mp_obj_is_type(self->bitmap, &displayio_bitmap_type)) { displayio_bitmap_finish_refresh(self->bitmap); } else if (mp_obj_is_type(self->bitmap, &displayio_ondiskbitmap_type)) { @@ -671,11 +670,6 @@ displayio_area_t *displayio_tilegrid_get_refresh_areas(displayio_tilegrid_t *sel displayio_palette_needs_refresh(self->pixel_shader)) || (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type) && displayio_colorconverter_needs_refresh(self->pixel_shader)); - #if CIRCUITPY_TILEPALETTEMAPPER - self->full_change = self->full_change || - (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type) && - tilepalettemapper_tilepalettemapper_needs_refresh(self->pixel_shader)); - #endif if (self->full_change || first_draw) { self->current_area.next = tail; diff --git a/shared-module/displayio/TileGrid.h b/shared-module/displayio/TileGrid.h index 400ade5359827..0051cc0ebf19d 100644 --- a/shared-module/displayio/TileGrid.h +++ b/shared-module/displayio/TileGrid.h @@ -68,3 +68,5 @@ void displayio_tilegrid_finish_refresh(displayio_tilegrid_t *self); bool displayio_tilegrid_get_rendered_hidden(displayio_tilegrid_t *self); void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader); + +void displayio_tilegrid_mark_tile_dirty(displayio_tilegrid_t *self, uint16_t x, uint16_t y); diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index fb784fd441b9b..31447eb1963b5 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -8,16 +8,16 @@ #include "shared-bindings/tilepalettemapper/TilePaletteMapper.h" #include "shared-bindings/displayio/Palette.h" #include "shared-bindings/displayio/ColorConverter.h" +#include "shared-bindings/displayio/TileGrid.h" void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t pixel_shader, uint16_t input_color_count, uint16_t width, uint16_t height) { - + mp_obj_t pixel_shader, uint16_t input_color_count, mp_obj_t tilegrid) { + self->tilegrid = tilegrid; self->pixel_shader = pixel_shader; - self->width_in_tiles = width; - self->height_in_tiles = height; + self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid); + self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid); self->input_color_count = input_color_count; - self->needs_refresh = false; - int mappings_len = width * height; + int mappings_len = self->width_in_tiles * self->height_in_tiles; self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *)); for (int i = 0; i < mappings_len; i++) { self->tile_mappings[i] = (uint32_t *)m_malloc_without_collect(input_color_count * sizeof(uint32_t)); @@ -31,6 +31,7 @@ void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_ } } } + common_hal_displayio_tilegrid_set_pixel_shader(self->tilegrid, self); } uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self) { @@ -45,6 +46,10 @@ mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_pixel_shader(tilepal return self->pixel_shader; } +mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_tilegrid(tilepalettemapper_tilepalettemapper_t *self) { + return self->tilegrid; +} + mp_obj_t common_hal_tilepalettemapper_tilepalettemapper_get_mapping(tilepalettemapper_tilepalettemapper_t *self, uint16_t x, uint16_t y) { int index = x + y * self->width_in_tiles; mp_obj_t result[self->input_color_count]; @@ -67,7 +72,7 @@ void common_hal_tilepalettemapper_tilepalettemapper_set_mapping(tilepalettemappe mp_arg_validate_int_range(mapping_val, 0, palette_max, MP_QSTR_mapping_value); self->tile_mappings[y * self->width_in_tiles + x][i] = mapping_val; } - self->needs_refresh = true; + displayio_tilegrid_mark_tile_dirty(self->tilegrid, x, y); } void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, const _displayio_colorspace_t *colorspace, displayio_input_pixel_t *input_pixel, displayio_output_pixel_t *output_color, uint16_t x_tile_index, uint16_t y_tile_index) { @@ -90,11 +95,3 @@ void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalette } } - -bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self) { - return self->needs_refresh; -} - -void tilepalettemapper_tilepalettemapper_finish_refresh(tilepalettemapper_tilepalettemapper_t *self) { - self->needs_refresh = false; -} diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.h b/shared-module/tilepalettemapper/TilePaletteMapper.h index 98226ae7e04fa..a56043f867aca 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.h +++ b/shared-module/tilepalettemapper/TilePaletteMapper.h @@ -16,14 +16,11 @@ typedef struct { mp_obj_base_t base; mp_obj_t pixel_shader; + mp_obj_t tilegrid; uint16_t width_in_tiles; uint16_t height_in_tiles; uint16_t input_color_count; uint32_t **tile_mappings; - bool needs_refresh; } tilepalettemapper_tilepalettemapper_t; -bool tilepalettemapper_tilepalettemapper_needs_refresh(tilepalettemapper_tilepalettemapper_t *self); -void tilepalettemapper_tilepalettemapper_finish_refresh(tilepalettemapper_tilepalettemapper_t *self); - void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, const _displayio_colorspace_t *colorspace, displayio_input_pixel_t *input_pixel, displayio_output_pixel_t *output_color, uint16_t x_tile_index, uint16_t y_tile_index); From f2de64c8835649a4e1dc24ee849e23f7801d0e4d Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 7 May 2025 16:21:17 -0500 Subject: [PATCH 47/76] set partial_change flag from mark_tile_dirty --- shared-module/displayio/TileGrid.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index b97f52ebac022..a1a37bf4d293e 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -299,7 +299,7 @@ void displayio_tilegrid_mark_tile_dirty(displayio_tilegrid_t *self, uint16_t x, if (self->partial_change) { displayio_area_union(&self->dirty_area, &temp_area, &self->dirty_area); } - + self->partial_change = true; } void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t x, uint16_t y, uint16_t tile_index) { @@ -322,7 +322,6 @@ void common_hal_displayio_tilegrid_set_tile(displayio_tilegrid_t *self, uint16_t ((uint8_t *)tiles)[index] = (uint8_t)tile_index; } displayio_tilegrid_mark_tile_dirty(self, x, y); - self->partial_change = true; } void common_hal_displayio_tilegrid_set_all_tiles(displayio_tilegrid_t *self, uint16_t tile_index) { From eb7fc97fb2c507c4c09f450337062a25709978a2 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Wed, 7 May 2025 18:59:19 -0500 Subject: [PATCH 48/76] fix docstring triple quote. --- shared-bindings/tilepalettemapper/TilePaletteMapper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index cf18e37ba120f..ce78738f90397 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -29,7 +29,7 @@ //| :param Union[displayio.Palette, displayio.ColorConverter] pixel_shader: //| The palette or ColorConverter to get mapped colors from. //| :param int input_color_count: The number of colors in in the input bitmap. -//| :param TileGrid tilegrid: The tilegrid to use with the TilePaletteMapper +//| :param TileGrid tilegrid: The tilegrid to use with the TilePaletteMapper""" //| static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { From 1b894c5e4efef752c70b9a403c4f87d9b6703dfc Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 8 May 2025 07:55:55 -0500 Subject: [PATCH 49/76] fix TileGrid type in docstring --- shared-bindings/tilepalettemapper/TilePaletteMapper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index ce78738f90397..f1ac89807c8e0 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -22,7 +22,7 @@ //| bitmap with a wider array of colors.""" //| //| def __init__( -//| self, palette: displayio.Palette, input_color_count: int, tilegrid: TileGrid +//| self, palette: displayio.Palette, input_color_count: int, tilegrid: displayio.TileGrid //| ) -> None: //| """Create a TilePaletteMApper object to store a set of color mappings for tiles. //| @@ -94,7 +94,7 @@ MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj, (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_pixel_shader_obj); //| tilegrid: displayio.TileGrid -//| """The tilegrid that the TilePaletteMapper is used on.""" +//| """The TileGrid that the TilePaletteMapper is used with.""" //| static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_tilegrid(mp_obj_t self_in) { tilepalettemapper_tilepalettemapper_t *self = MP_OBJ_TO_PTR(self_in); From 97950a55bd91e92d072532d39e360ae3cb971754 Mon Sep 17 00:00:00 2001 From: eightycc Date: Thu, 8 May 2025 06:45:48 -0700 Subject: [PATCH 50/76] Add missing linker fragment `esp32c3.rom.eco3_bt_funcs.ld` for ESP32-C3 Espressif boards. --- ports/espressif/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index bdf0fd53f6876..1bffe47ff1943 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -265,6 +265,7 @@ else ifeq ($(IDF_TARGET),esp32c3) LDFLAGS += \ -Tesp32c3.rom.newlib.ld \ -Tesp32c3.rom.version.ld \ + -Tesp32c3.rom.eco3_bt_funcs.ld \ -Tesp32c3.rom.eco3.ld \ -Tesp32c3.rom.bt_funcs.ld From 618e3356eabcc16b2e8f22d6652ff4da18a100a5 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 8 May 2025 09:15:27 -0500 Subject: [PATCH 51/76] remove weblate badge from readme for latex docs builds --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index ea0e26adfce03..7da8ec6ccdbbf 100644 --- a/Makefile +++ b/Makefile @@ -156,7 +156,9 @@ epub: @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: + $(PYTHON) docs/prepare_readme_for_latex.py $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + mv README.rst.bak README.rst @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ @@ -164,14 +166,18 @@ latex: # seems to be malfunctioning latexpdf: + $(PYTHON) docs/prepare_readme_for_latex.py $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + mv README.rst.bak README.rst @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." # seems to be malfunctioning latexpdfja: + $(PYTHON) docs/prepare_readme_for_latex.py $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + mv README.rst.bak README.rst @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." From 4663b3fd7116ddde16111a8f3374cb5a21a0c3e0 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 8 May 2025 09:16:18 -0500 Subject: [PATCH 52/76] add the prepare readme python script --- docs/prepare_readme_for_latex.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 docs/prepare_readme_for_latex.py diff --git a/docs/prepare_readme_for_latex.py b/docs/prepare_readme_for_latex.py new file mode 100644 index 0000000000000..a22abbdeb8a0a --- /dev/null +++ b/docs/prepare_readme_for_latex.py @@ -0,0 +1,18 @@ +import shutil + +with open("README.rst", "r") as f: + readme_content = f.read() + +shutil.copyfile("README.rst", "README.rst.bak") + +# turn badge into text only +modified_readme_content = readme_content.replace("|Weblate|", "Weblate", 1) + +# remove image link +badge_link_lines = """.. |Weblate| image:: https://hosted.weblate.org/widgets/circuitpython/-/svg-badge.svg + :target: https://hosted.weblate.org/engage/circuitpython/?utm_source=widget""" + +modified_readme_content = modified_readme_content.replace(badge_link_lines, "") + +with open("README.rst", "w") as f: + f.write(modified_readme_content) From 3da2914345e8f158dc69076a10594e0336fdd295 Mon Sep 17 00:00:00 2001 From: eightycc Date: Thu, 8 May 2025 07:17:05 -0700 Subject: [PATCH 53/76] For Espressif boards: o For Xtensa cores, wraps `longjmp` with a patched implementation that protects register window update in a critical section o Adds support for `ENABLE_JTAG=1` --- ports/espressif/Makefile | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index bdf0fd53f6876..ac3387332fdd8 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -202,21 +202,24 @@ else endif ifeq ($(IDF_TARGET_ARCH),xtensa) -# Remove the last two flags once TinyUSB is updated with the `#include ` instead of -# `#include "xtensa/xtensa_api.h"`. + # Remove the last two flags once TinyUSB is updated with the `#include ` instead of + # `#include "xtensa/xtensa_api.h"`. -CFLAGS += -mlongcalls -isystem esp-idf/components/xtensa/deprecated_include/ -Wno-error=cpp + CFLAGS += -mlongcalls -isystem esp-idf/components/xtensa/deprecated_include/ -Wno-error=cpp + + # Wrap longjmp with a patched version that protects register window update with a critical section + LDFLAGS += -Wl,--wrap=longjmp else ifeq ($(IDF_TARGET_ARCH),riscv) -ifeq ($(IDF_TARGET),esp32p4) -CFLAGS += -march=rv32imafc_zicsr_zifencei_xesppie -mabi=ilp32f -else -CFLAGS += -march=rv32imac_zicsr_zifencei -endif + ifeq ($(IDF_TARGET),esp32p4) + CFLAGS += -march=rv32imafc_zicsr_zifencei_xesppie -mabi=ilp32f + else + CFLAGS += -march=rv32imac_zicsr_zifencei + endif -LDFLAGS += \ - -Lesp-idf/components/riscv/ld \ - -Trom.api.ld + LDFLAGS += \ + -Lesp-idf/components/riscv/ld \ + -Trom.api.ld endif $(BUILD)/lib/tlsf/tlsf.o: CFLAGS += -Wno-cast-align @@ -545,6 +548,10 @@ else DEBUG_SDKCONFIG = esp-idf-config/sdkconfig-opt.defaults endif +ifeq ($(ENABLE_JTAG), 1) + CFLAGS += -DENABLE_JTAG=1 +endif + SDKCONFIGS := esp-idf-config/sdkconfig.defaults;$(DEBUG_SDKCONFIG);$(FLASH_SIZE_SDKCONFIG);$(FLASH_MODE_SDKCONFIG);$(FLASH_SPEED_SDKCONFIG);$(PSRAM_SDKCONFIG);$(PSRAM_SIZE_SDKCONFIG);$(PSRAM_MODE_SDKCONFIG);$(PSRAM_SPEED_SDKCONFIG);$(TARGET_SDKCONFIG);boards/$(BOARD)/sdkconfig ifneq ($(CIRCUITPY_BLEIO_NATIVE),0) SDKCONFIGS := esp-idf-config/sdkconfig-ble.defaults;$(SDKCONFIGS) From dc676f194bca897ea331926f005a98a2568164b6 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 8 May 2025 13:57:23 -0500 Subject: [PATCH 54/76] show 4 spaces in place of tab in Terminal --- shared-module/terminalio/Terminal.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c index 02bcffb30c5f2..1e2758780806e 100644 --- a/shared-module/terminalio/Terminal.c +++ b/shared-module/terminalio/Terminal.c @@ -226,7 +226,11 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con if (c < 0x20) { if (c == '\r') { self->cursor_x = 0; - } else if (c == '\n') { + } else if (c == '\t'){ + for (uint8_t space_i = 0; space_i < 4; space_i++){ + terminalio_terminal_set_tile(self, false, ' ', true); + } + }else if (c == '\n') { self->cursor_y++; // Commands below are used by MicroPython in the REPL } else if (c == '\b') { From 5b621b0bad9f21087e460a693788d397d87f418f Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 8 May 2025 14:32:18 -0500 Subject: [PATCH 55/76] format --- shared-module/terminalio/Terminal.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/shared-module/terminalio/Terminal.c b/shared-module/terminalio/Terminal.c index 1e2758780806e..c5a52ce39033f 100644 --- a/shared-module/terminalio/Terminal.c +++ b/shared-module/terminalio/Terminal.c @@ -226,11 +226,11 @@ size_t common_hal_terminalio_terminal_write(terminalio_terminal_obj_t *self, con if (c < 0x20) { if (c == '\r') { self->cursor_x = 0; - } else if (c == '\t'){ - for (uint8_t space_i = 0; space_i < 4; space_i++){ - terminalio_terminal_set_tile(self, false, ' ', true); - } - }else if (c == '\n') { + } else if (c == '\t') { + for (uint8_t space_i = 0; space_i < 4; space_i++) { + terminalio_terminal_set_tile(self, false, ' ', true); + } + } else if (c == '\n') { self->cursor_y++; // Commands below are used by MicroPython in the REPL } else if (c == '\b') { From 4fb7d447144c2a9d821d68ac855af4e3125b337a Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 8 May 2025 18:08:56 -0500 Subject: [PATCH 56/76] pixel_shader back to required on TileGrid. TPM init with no tilegrid or width/height, internal bind function is used to bind a TileGrid to a TilePaletteMapper when the TileGrid is init with or has pixel_shader set to a TPM --- shared-bindings/displayio/TileGrid.c | 8 ++-- .../tilepalettemapper/TilePaletteMapper.c | 14 ++----- .../tilepalettemapper/TilePaletteMapper.h | 2 +- shared-module/displayio/Group.c | 3 -- shared-module/displayio/TileGrid.c | 10 +++++ .../tilepalettemapper/TilePaletteMapper.c | 41 ++++++++++--------- .../tilepalettemapper/TilePaletteMapper.h | 2 + 7 files changed, 42 insertions(+), 38 deletions(-) diff --git a/shared-bindings/displayio/TileGrid.c b/shared-bindings/displayio/TileGrid.c index 36ba1361de242..eddf3f66c4ec0 100644 --- a/shared-bindings/displayio/TileGrid.c +++ b/shared-bindings/displayio/TileGrid.c @@ -68,7 +68,7 @@ void displayio_tilegrid_validate_pixel_shader(mp_obj_t pixel_shader) { //| tile_width and tile_height match the height of the bitmap by default. //| //| :param Bitmap,OnDiskBitmap bitmap: The bitmap storing one or more tiles. -//| :param Optional[ColorConverter,Palette] pixel_shader: The pixel shader that produces colors from values +//| :param ColorConverter,Palette pixel_shader: The pixel shader that produces colors from values //| :param int width: Width of the grid in tiles. //| :param int height: Height of the grid in tiles. //| :param int tile_width: Width of a single tile in pixels. Defaults to the full Bitmap and must evenly divide into the Bitmap's dimensions. @@ -81,7 +81,7 @@ static mp_obj_t displayio_tilegrid_make_new(const mp_obj_type_t *type, size_t n_ enum { ARG_bitmap, ARG_pixel_shader, ARG_width, ARG_height, ARG_tile_width, ARG_tile_height, ARG_default_tile, ARG_x, ARG_y }; static const mp_arg_t allowed_args[] = { { MP_QSTR_bitmap, MP_ARG_REQUIRED | MP_ARG_OBJ }, - { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_obj = mp_const_none} }, + { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_KW_ONLY | MP_ARG_REQUIRED }, { MP_QSTR_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, { MP_QSTR_height, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 1} }, { MP_QSTR_tile_width, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0} }, @@ -109,9 +109,7 @@ static mp_obj_t displayio_tilegrid_make_new(const mp_obj_type_t *type, size_t n_ mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_bitmap); } mp_obj_t pixel_shader = args[ARG_pixel_shader].u_obj; - if (pixel_shader != mp_const_none) { - displayio_tilegrid_validate_pixel_shader(pixel_shader); - } + displayio_tilegrid_validate_pixel_shader(pixel_shader); uint16_t tile_width = args[ARG_tile_width].u_int; if (tile_width == 0) { tile_width = bitmap_width; diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index f1ac89807c8e0..3b115546970c9 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -22,22 +22,20 @@ //| bitmap with a wider array of colors.""" //| //| def __init__( -//| self, palette: displayio.Palette, input_color_count: int, tilegrid: displayio.TileGrid +//| self, palette: displayio.Palette, input_color_count: int //| ) -> None: //| """Create a TilePaletteMApper object to store a set of color mappings for tiles. //| //| :param Union[displayio.Palette, displayio.ColorConverter] pixel_shader: //| The palette or ColorConverter to get mapped colors from. -//| :param int input_color_count: The number of colors in in the input bitmap. -//| :param TileGrid tilegrid: The tilegrid to use with the TilePaletteMapper""" +//| :param int input_color_count: The number of colors in in the input bitmap.""" //| static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) { - enum { ARG_pixel_shader, ARG_input_color_count, ARG_tilegrid }; + enum { ARG_pixel_shader, ARG_input_color_count }; static const mp_arg_t allowed_args[] = { { MP_QSTR_pixel_shader, MP_ARG_OBJ | MP_ARG_REQUIRED }, { MP_QSTR_input_color_count, MP_ARG_INT | MP_ARG_REQUIRED }, - { MP_QSTR_tilegrid, MP_ARG_OBJ | MP_ARG_REQUIRED }, }; mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)]; @@ -47,13 +45,9 @@ static mp_obj_t tilepalettemapper_tilepalettemapper_make_new(const mp_obj_type_t mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_pixel_shader); } - mp_obj_t tilegrid = args[ARG_tilegrid].u_obj; - if (!mp_obj_is_type(tilegrid, &displayio_tilegrid_type)) { - mp_raise_TypeError_varg(MP_ERROR_TEXT("unsupported %q type"), MP_QSTR_tilegrid); - } tilepalettemapper_tilepalettemapper_t *self = mp_obj_malloc(tilepalettemapper_tilepalettemapper_t, &tilepalettemapper_tilepalettemapper_type); - common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int, tilegrid); + common_hal_tilepalettemapper_tilepalettemapper_construct(self, pixel_shader, args[ARG_input_color_count].u_int); return MP_OBJ_FROM_PTR(self); } diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.h b/shared-bindings/tilepalettemapper/TilePaletteMapper.h index 2063dc4e8848e..ef0d949591722 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.h +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.h @@ -8,7 +8,7 @@ extern const mp_obj_type_t tilepalettemapper_tilepalettemapper_type; void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t paltte, uint16_t input_color_count, mp_obj_t tilegrid); + mp_obj_t paltte, uint16_t input_color_count); uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self); diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index f4a984c0dff19..e2a1a527062b8 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -258,9 +258,6 @@ static void _add_layer(displayio_group_t *self, mp_obj_t layer) { mp_obj_t native_layer = mp_obj_cast_to_native_base(layer, &displayio_tilegrid_type); if (native_layer != MP_OBJ_NULL) { displayio_tilegrid_t *tilegrid = native_layer; - if (tilegrid->pixel_shader == mp_const_none) { - mp_raise_ValueError(MP_ERROR_TEXT("TileGrid must have a pixel_shader")); - } if (tilegrid->in_group) { mp_raise_ValueError(MP_ERROR_TEXT("Layer already in a group")); } else { diff --git a/shared-module/displayio/TileGrid.c b/shared-module/displayio/TileGrid.c index a1a37bf4d293e..b5c691ccbd6ce 100644 --- a/shared-module/displayio/TileGrid.c +++ b/shared-module/displayio/TileGrid.c @@ -81,6 +81,11 @@ void common_hal_displayio_tilegrid_construct(displayio_tilegrid_t *self, mp_obj_ self->flip_y = false; self->transpose_xy = false; self->absolute_transform = NULL; + #if CIRCUITPY_TILEPALETTEMAPPER + if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { + tilepalettemapper_tilepalettemapper_bind(self->pixel_shader, self); + } + #endif } @@ -231,6 +236,11 @@ mp_obj_t common_hal_displayio_tilegrid_get_pixel_shader(displayio_tilegrid_t *se void common_hal_displayio_tilegrid_set_pixel_shader(displayio_tilegrid_t *self, mp_obj_t pixel_shader) { self->pixel_shader = pixel_shader; self->full_change = true; + #if CIRCUITPY_TILEPALETTEMAPPER + if (mp_obj_is_type(self->pixel_shader, &tilepalettemapper_tilepalettemapper_type)) { + tilepalettemapper_tilepalettemapper_bind(self->pixel_shader, self); + } + #endif } mp_obj_t common_hal_displayio_tilegrid_get_bitmap(displayio_tilegrid_t *self) { diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index 31447eb1963b5..b1d1eb24c6f87 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -11,27 +11,9 @@ #include "shared-bindings/displayio/TileGrid.h" void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_tilepalettemapper_t *self, - mp_obj_t pixel_shader, uint16_t input_color_count, mp_obj_t tilegrid) { - self->tilegrid = tilegrid; + mp_obj_t pixel_shader, uint16_t input_color_count) { self->pixel_shader = pixel_shader; - self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid); - self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid); self->input_color_count = input_color_count; - int mappings_len = self->width_in_tiles * self->height_in_tiles; - self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *)); - for (int i = 0; i < mappings_len; i++) { - self->tile_mappings[i] = (uint32_t *)m_malloc_without_collect(input_color_count * sizeof(uint32_t)); - if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) { - for (uint16_t j = 0; j < input_color_count; j++) { - self->tile_mappings[i][j] = j; - } - } else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) { - for (uint16_t j = 0; j < input_color_count; j++) { - self->tile_mappings[i][j] = 0; - } - } - } - common_hal_displayio_tilegrid_set_pixel_shader(self->tilegrid, self); } uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self) { @@ -95,3 +77,24 @@ void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalette } } + +void tilepalettemapper_tilepalettemapper_bind(tilepalettemapper_tilepalettemapper_t *self, displayio_tilegrid_t *tilegrid) { + self->tilegrid = tilegrid; + self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid); + self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid); + + int mappings_len = self->width_in_tiles * self->height_in_tiles; + self->tile_mappings = (uint32_t **)m_malloc(mappings_len * sizeof(uint32_t *)); + for (int i = 0; i < mappings_len; i++) { + self->tile_mappings[i] = (uint32_t *)m_malloc_without_collect(self->input_color_count * sizeof(uint32_t)); + if (mp_obj_is_type(self->pixel_shader, &displayio_palette_type)) { + for (uint16_t j = 0; j < self->input_color_count; j++) { + self->tile_mappings[i][j] = j; + } + } else if (mp_obj_is_type(self->pixel_shader, &displayio_colorconverter_type)) { + for (uint16_t j = 0; j < self->input_color_count; j++) { + self->tile_mappings[i][j] = 0; + } + } + } +} diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.h b/shared-module/tilepalettemapper/TilePaletteMapper.h index a56043f867aca..d1f535eda11bb 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.h +++ b/shared-module/tilepalettemapper/TilePaletteMapper.h @@ -12,6 +12,7 @@ #include "py/obj.h" #include "shared-module/displayio/Palette.h" +#include "shared-module/displayio/TileGrid.h" typedef struct { mp_obj_base_t base; @@ -24,3 +25,4 @@ typedef struct { } tilepalettemapper_tilepalettemapper_t; void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalettemapper_t *self, const _displayio_colorspace_t *colorspace, displayio_input_pixel_t *input_pixel, displayio_output_pixel_t *output_color, uint16_t x_tile_index, uint16_t y_tile_index); +void tilepalettemapper_tilepalettemapper_bind(tilepalettemapper_tilepalettemapper_t *self, displayio_tilegrid_t *tilegrid); From 2bec0562ebd7026e68bfeaf3aee88111a1759cd7 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 7 May 2025 17:01:45 -0700 Subject: [PATCH 57/76] Factor out register saves This fixes RISC-V ESP32 because it ignored registers on that architecture. --- main.c | 11 +- ports/analog/Makefile | 5 +- ports/analog/supervisor/cpu.s | 34 ------ ports/atmel-samd/Makefile | 4 +- ports/atmel-samd/supervisor/samd21_cpu.s | 35 ------ ports/atmel-samd/supervisor/samd51_cpu.s | 27 ----- ports/atmel-samd/supervisor/same51_cpu.s | 27 ----- ports/atmel-samd/supervisor/same54_cpu.s | 27 ----- ports/cxd56/Makefile | 4 +- ports/cxd56/supervisor/cpu.s | 27 ----- ports/espressif/Makefile | 3 + ports/espressif/mphalport.c | 6 +- ports/litex/Makefile | 7 +- ports/litex/mphalport.c | 6 -- ports/mimxrt10xx/Makefile | 5 +- ports/mimxrt10xx/supervisor/cpu.S | 27 ----- ports/nordic/Makefile | 4 +- ports/nordic/supervisor/cpu.s | 27 ----- ports/raspberrypi/Makefile | 2 +- ports/raspberrypi/supervisor/rp2_cpu.s | 35 ------ ports/renode/Makefile | 2 +- ports/renode/supervisor/cortex-m0+_cpu.s | 35 ------ ports/stm/Makefile | 3 +- ports/stm/supervisor/cpu.s | 27 ----- .../zephyr-cp/cptools/build_circuitpython.py | 2 +- supervisor/shared/cpu_regs.S | 102 ++++++++++++++++++ supervisor/shared/cpu_regs.h | 31 ++++++ 27 files changed, 166 insertions(+), 359 deletions(-) delete mode 100644 ports/analog/supervisor/cpu.s delete mode 100755 ports/atmel-samd/supervisor/samd21_cpu.s delete mode 100755 ports/atmel-samd/supervisor/samd51_cpu.s delete mode 100755 ports/atmel-samd/supervisor/same51_cpu.s delete mode 100755 ports/atmel-samd/supervisor/same54_cpu.s delete mode 100755 ports/cxd56/supervisor/cpu.s delete mode 100755 ports/mimxrt10xx/supervisor/cpu.S delete mode 100755 ports/nordic/supervisor/cpu.s delete mode 100755 ports/raspberrypi/supervisor/rp2_cpu.s delete mode 100755 ports/renode/supervisor/cortex-m0+_cpu.s delete mode 100755 ports/stm/supervisor/cpu.s create mode 100644 supervisor/shared/cpu_regs.S create mode 100644 supervisor/shared/cpu_regs.h diff --git a/main.c b/main.c index eefc081f33cc8..45b7af2725435 100644 --- a/main.c +++ b/main.c @@ -30,6 +30,7 @@ #include "supervisor/cpu.h" #include "supervisor/filesystem.h" #include "supervisor/port.h" +#include "supervisor/shared/cpu_regs.h" #include "supervisor/shared/reload.h" #include "supervisor/shared/safe_mode.h" #include "supervisor/shared/serial.h" @@ -1135,9 +1136,14 @@ int __attribute__((used)) main(void) { void gc_collect(void) { gc_collect_start(); - mp_uint_t regs[10]; + // Load register values onto the stack. They get collected below with the rest of the stack. + size_t regs[SAVED_REGISTER_COUNT]; mp_uint_t sp = cpu_get_regs_and_sp(regs); + // This naively collects all object references from an approximate stack + // range. + gc_collect_root((void **)sp, ((mp_uint_t)port_stack_get_top() - sp) / sizeof(mp_uint_t)); + // This collects root pointers from the VFS mount table. Some of them may // have lost their references in the VM even though they are mounted. gc_collect_root((void **)&MP_STATE_VM(vfs_mount_table), sizeof(mp_vfs_mount_t) / sizeof(mp_uint_t)); @@ -1170,9 +1176,6 @@ void gc_collect(void) { common_hal_wifi_gc_collect(); #endif - // This naively collects all object references from an approximate stack - // range. - gc_collect_root((void **)sp, ((mp_uint_t)port_stack_get_top() - sp) / sizeof(mp_uint_t)); gc_collect_end(); } diff --git a/ports/analog/Makefile b/ports/analog/Makefile index 8e4cf3bc91728..08b245c5897e3 100644 --- a/ports/analog/Makefile +++ b/ports/analog/Makefile @@ -138,8 +138,8 @@ LINKERFILE = linking/$(MCU_VARIANT_LOWER)_cktpy.ld LDFLAGS += -nostartfiles -specs=nano.specs endif -SRC_S += supervisor/cpu.s \ - $(STARTUPFILE) +SRC_S_UPPER = supervisor/shared/cpu_regs.S +SRC_S += $(STARTUPFILE) # Needed to compile some MAX32 headers CFLAGS += -D$(MCU_VARIANT_UPPER) \ @@ -236,6 +236,7 @@ OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) # List of sources for qstr extraction diff --git a/ports/analog/supervisor/cpu.s b/ports/analog/supervisor/cpu.s deleted file mode 100644 index 7cb8291045f14..0000000000000 --- a/ports/analog/supervisor/cpu.s +++ /dev/null @@ -1,34 +0,0 @@ -// This file is part of the CircuitPython project: https://circuitpython.org -// -// SPDX-FileCopyrightText: Copyright (c) 2017 Scott Shawcroft for Adafruit Industries -// SPDX-FileCopyrightText: Copyright (c) 2024 Brandon Hurst, Analog Devices, Inc -// -// SPDX-License-Identifier: MIT - -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/atmel-samd/Makefile b/ports/atmel-samd/Makefile index fa9bd923fdc4d..888729c7b7f3d 100644 --- a/ports/atmel-samd/Makefile +++ b/ports/atmel-samd/Makefile @@ -308,7 +308,7 @@ ifeq ($(CIRCUITPY_AUDIOBUSIO),1) SRC_C += peripherals/samd/i2s.c peripherals/samd/$(PERIPHERALS_CHIP_FAMILY)/i2s.c endif -SRC_S = supervisor/$(CHIP_FAMILY)_cpu.s +SRC_S_UPPER = supervisor/shared/cpu_regs.S OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_ASF:.c=.o)) @@ -317,7 +317,7 @@ ifeq ($(INTERNAL_LIBM),1) OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) QSTR_GLOBAL_REQUIREMENTS += $(HEADER_BUILD)/sdiodata.h diff --git a/ports/atmel-samd/supervisor/samd21_cpu.s b/ports/atmel-samd/supervisor/samd21_cpu.s deleted file mode 100755 index 741bb21358ad2..0000000000000 --- a/ports/atmel-samd/supervisor/samd21_cpu.s +++ /dev/null @@ -1,35 +0,0 @@ -.syntax unified -.cpu cortex-m0 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0, #0] -str r5, [r0, #4] -str r6, [r0, #8] -str r7, [r0, #12] -push {r1} -mov r1, r8 -str r1, [r0, #16] -mov r1, r9 -str r1, [r0, #20] -mov r1, r10 -str r1, [r0, #24] -mov r1, r11 -str r1, [r0, #28] -mov r1, r12 -str r1, [r0, #32] -mov r1, r13 -str r1, [r0, #36] -pop {r1} - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/atmel-samd/supervisor/samd51_cpu.s b/ports/atmel-samd/supervisor/samd51_cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/atmel-samd/supervisor/samd51_cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/atmel-samd/supervisor/same51_cpu.s b/ports/atmel-samd/supervisor/same51_cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/atmel-samd/supervisor/same51_cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/atmel-samd/supervisor/same54_cpu.s b/ports/atmel-samd/supervisor/same54_cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/atmel-samd/supervisor/same54_cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/cxd56/Makefile b/ports/cxd56/Makefile index ca97c33ca70ea..fdf3646c80d27 100644 --- a/ports/cxd56/Makefile +++ b/ports/cxd56/Makefile @@ -110,7 +110,7 @@ LDFLAGS = \ CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_CXD56 -DCFG_TUD_MIDI_RX_BUFSIZE=512 -DCFG_TUD_CDC_RX_BUFSIZE=1024 -DCFG_TUD_MIDI_TX_BUFSIZE=512 -DCFG_TUD_CDC_TX_BUFSIZE=1024 -DCFG_TUD_MSC_BUFSIZE=512 $(CFLAGS_MOD) -SRC_S = supervisor/cpu.s +SRC_S_UPPER = supervisor/shared/cpu_regs.S SRC_C += \ background.c \ @@ -120,7 +120,7 @@ SRC_C += \ lib/tinyusb/src/portable/sony/cxd56/dcd_cxd56.c \ OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) ifeq ($(INTERNAL_LIBM),1) OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) diff --git a/ports/cxd56/supervisor/cpu.s b/ports/cxd56/supervisor/cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/cxd56/supervisor/cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/espressif/Makefile b/ports/espressif/Makefile index bdf0fd53f6876..8152fc78ee031 100644 --- a/ports/espressif/Makefile +++ b/ports/espressif/Makefile @@ -486,6 +486,8 @@ FROZEN_MPY_PY_FILES := $(shell find -L $(FROZEN_MPY_DIR) -type f -name '*.py') FROZEN_MPY_MPY_FILES := $(addprefix $(BUILD)/,$(FROZEN_MPY_PY_FILES:.py=.mpy)) endif +SRC_S_UPPER = supervisor/shared/cpu_regs.S + OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) ifeq ($(INTERNAL_LIBM),1) @@ -493,6 +495,7 @@ OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) $(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os $(filter $(PY_BUILD)/../extmod/vfs_fat_%.o, $(PY_O)): COPT += -Os diff --git a/ports/espressif/mphalport.c b/ports/espressif/mphalport.c index d6a7ef1bfce41..9046bbf7b102f 100644 --- a/ports/espressif/mphalport.c +++ b/ports/espressif/mphalport.c @@ -21,7 +21,6 @@ void IRAM_ATTR mp_hal_delay_us(mp_uint_t delay) { // This is provided by the esp-idf/components/xtensa/esp32s2/libhal.a binary blob. #ifndef CONFIG_IDF_TARGET_ARCH_RISCV extern void xthal_window_spill(void); -#endif mp_uint_t cpu_get_regs_and_sp(mp_uint_t *regs) { // xtensa has more registers than an instruction can address. The 16 that @@ -37,8 +36,7 @@ mp_uint_t cpu_get_regs_and_sp(mp_uint_t *regs) { // there is a HAL call to do it. There is a bit of a race condition here // because the register value could change after it's been restored but that // is unlikely to happen with a heap pointer while we do a GC. - #ifndef CONFIG_IDF_TARGET_ARCH_RISCV xthal_window_spill(); - #endif - return (mp_uint_t)__builtin_frame_address(0); + return (mp_uint_t)__builtin_stack_address(); } +#endif diff --git a/ports/litex/Makefile b/ports/litex/Makefile index 688a1887959c8..bb1d88e755201 100644 --- a/ports/litex/Makefile +++ b/ports/litex/Makefile @@ -77,8 +77,9 @@ ifneq ($(CIRCUITPY_USB),0) SRC_C += lib/tinyusb/src/portable/valentyusb/eptri/dcd_eptri.c endif -SRC_S = \ - crt0-vexriscv.S +SRC_S_UPPER = \ + crt0-vexriscv.S \ + supervisor/shared/cpu_regs.S $(BUILD)/lib/tlsf/tlsf.o: CFLAGS += -Wno-cast-align @@ -93,7 +94,7 @@ ifeq ($(INTERNAL_LIBM),1) OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_S:.S=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) $(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os diff --git a/ports/litex/mphalport.c b/ports/litex/mphalport.c index cc74762a14f14..b94699e81e705 100644 --- a/ports/litex/mphalport.c +++ b/ports/litex/mphalport.c @@ -54,9 +54,3 @@ void isr(void) { // Decrease the "nesting count". Note: This should be going from 1 -> 0. nesting_count -= 1; } - -mp_uint_t cpu_get_regs_and_sp(mp_uint_t *regs) { - unsigned long __tmp; - asm volatile ("mv %0, x2" : "=r" (__tmp)); - return __tmp; -} diff --git a/ports/mimxrt10xx/Makefile b/ports/mimxrt10xx/Makefile index bbbb2479721ae..57a8beb069129 100644 --- a/ports/mimxrt10xx/Makefile +++ b/ports/mimxrt10xx/Makefile @@ -161,9 +161,9 @@ SRC_C += \ endif -SRC_S = \ +SRC_S_UPPER = \ sdk/devices/$(CHIP_FAMILY)/gcc/startup_$(CHIP_CORE).S \ - supervisor/cpu.S + supervisor/shared/cpu_regs.S OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_SDK:.c=.o)) @@ -173,6 +173,7 @@ OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_S:.S=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_CIRCUITPY_COMMON) diff --git a/ports/mimxrt10xx/supervisor/cpu.S b/ports/mimxrt10xx/supervisor/cpu.S deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/mimxrt10xx/supervisor/cpu.S +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/nordic/Makefile b/ports/nordic/Makefile index 9633dfdd3a824..e60b4072a8d48 100755 --- a/ports/nordic/Makefile +++ b/ports/nordic/Makefile @@ -146,7 +146,7 @@ SRC_C += $(SRC_DCD) $(patsubst %.c,$(BUILD)/%.o,$(SRC_DCD)): CFLAGS += -Wno-missing-prototypes endif # CIRCUITPY_USB_DEVICE -SRC_S = supervisor/cpu.s +SRC_S_UPPER = supervisor/shared/cpu_regs.S OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_NRFX:.c=.o)) @@ -155,7 +155,7 @@ ifeq ($(INTERNAL_LIBM),1) OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) -OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) # nrfx uses undefined preprocessor variables quite casually, so we can't do diff --git a/ports/nordic/supervisor/cpu.s b/ports/nordic/supervisor/cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/nordic/supervisor/cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/raspberrypi/Makefile b/ports/raspberrypi/Makefile index e9090f5fbe24e..582c04282734c 100644 --- a/ports/raspberrypi/Makefile +++ b/ports/raspberrypi/Makefile @@ -660,13 +660,13 @@ else OBJ_MBEDTLS := endif -SRC_S = supervisor/$(CHIP_FAMILY)_cpu.s BOOT2_S_CFLAGS ?= -DPICO_FLASH_SPI_CLKDIV=4 SRC_S_UPPER = sdk/src/rp2_common/hardware_irq/irq_handler_chain.S \ sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S \ sdk/src/rp2_common/pico_double/double_aeabi_$(DOUBLE_EABI).S \ sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S \ sdk/src/rp2_common/pico_crt0/crt0.S \ + supervisor/shared/cpu_regs.S \ $(SRC_S_UPPER_CHIP_VARIANT) ifeq ($(CIRCUITPY_PICODVI),1) diff --git a/ports/raspberrypi/supervisor/rp2_cpu.s b/ports/raspberrypi/supervisor/rp2_cpu.s deleted file mode 100755 index 741bb21358ad2..0000000000000 --- a/ports/raspberrypi/supervisor/rp2_cpu.s +++ /dev/null @@ -1,35 +0,0 @@ -.syntax unified -.cpu cortex-m0 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0, #0] -str r5, [r0, #4] -str r6, [r0, #8] -str r7, [r0, #12] -push {r1} -mov r1, r8 -str r1, [r0, #16] -mov r1, r9 -str r1, [r0, #20] -mov r1, r10 -str r1, [r0, #24] -mov r1, r11 -str r1, [r0, #28] -mov r1, r12 -str r1, [r0, #32] -mov r1, r13 -str r1, [r0, #36] -pop {r1} - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/renode/Makefile b/ports/renode/Makefile index 170198455fbf5..22e32f9d2fb6e 100644 --- a/ports/renode/Makefile +++ b/ports/renode/Makefile @@ -45,7 +45,7 @@ SRC_C += \ background.c \ mphalport.c \ -SRC_S = supervisor/$(CPU)_cpu.s +SRC_S_UPPER = supervisor/shared/cpu_regs.S OBJ = $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) diff --git a/ports/renode/supervisor/cortex-m0+_cpu.s b/ports/renode/supervisor/cortex-m0+_cpu.s deleted file mode 100755 index 741bb21358ad2..0000000000000 --- a/ports/renode/supervisor/cortex-m0+_cpu.s +++ /dev/null @@ -1,35 +0,0 @@ -.syntax unified -.cpu cortex-m0 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0, #0] -str r5, [r0, #4] -str r6, [r0, #8] -str r7, [r0, #12] -push {r1} -mov r1, r8 -str r1, [r0, #16] -mov r1, r9 -str r1, [r0, #20] -mov r1, r10 -str r1, [r0, #24] -mov r1, r11 -str r1, [r0, #28] -mov r1, r12 -str r1, [r0, #32] -mov r1, r13 -str r1, [r0, #36] -pop {r1} - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/stm/Makefile b/ports/stm/Makefile index 4bacecf60688a..baea6893a33d9 100755 --- a/ports/stm/Makefile +++ b/ports/stm/Makefile @@ -212,8 +212,8 @@ ifneq ($(CIRCUITPY_USB),0) endif endif +SRC_S_UPPER = supervisor/shared/cpu_regs.S SRC_S = \ - supervisor/cpu.s \ st_driver/cmsis_device_$(MCU_SERIES_LOWER)/Source/Templates/gcc/startup_$(MCU_VARIANT_LOWER).s ifneq ($(FROZEN_MPY_DIR),) @@ -229,6 +229,7 @@ OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) endif OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) +OBJ += $(addprefix $(BUILD)/, $(SRC_S_UPPER:.S=.o)) OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) $(BUILD)/$(FATFS_DIR)/ff.o: COPT += -Os diff --git a/ports/stm/supervisor/cpu.s b/ports/stm/supervisor/cpu.s deleted file mode 100755 index 9e6807a5e2e99..0000000000000 --- a/ports/stm/supervisor/cpu.s +++ /dev/null @@ -1,27 +0,0 @@ -.syntax unified -.cpu cortex-m4 -.thumb -.text -.align 2 - -@ uint cpu_get_regs_and_sp(r0=uint regs[10]) -.global cpu_get_regs_and_sp -.thumb -.thumb_func -.type cpu_get_regs_and_sp, %function -cpu_get_regs_and_sp: -@ store registers into given array -str r4, [r0], #4 -str r5, [r0], #4 -str r6, [r0], #4 -str r7, [r0], #4 -str r8, [r0], #4 -str r9, [r0], #4 -str r10, [r0], #4 -str r11, [r0], #4 -str r12, [r0], #4 -str r13, [r0], #4 - -@ return the sp -mov r0, sp -bx lr diff --git a/ports/zephyr-cp/cptools/build_circuitpython.py b/ports/zephyr-cp/cptools/build_circuitpython.py index 905b281f7ea96..15ed46b794e22 100644 --- a/ports/zephyr-cp/cptools/build_circuitpython.py +++ b/ports/zephyr-cp/cptools/build_circuitpython.py @@ -575,7 +575,7 @@ async def build_circuitpython(): source_files.append(portdir / "common-hal/zephyr_kernel/__init__.c") # source_files.append(srcdir / "ports" / port / "peripherals" / "nrf" / "nrf52840" / "pins.c") - assembly_files.append(srcdir / "ports/nordic/supervisor/cpu.s") + assembly_files.append(srcdir / "supervisor/shared/cpu_regs.S") source_files.extend(assembly_files) diff --git a/supervisor/shared/cpu_regs.S b/supervisor/shared/cpu_regs.S new file mode 100644 index 0000000000000..90e5367ed5808 --- /dev/null +++ b/supervisor/shared/cpu_regs.S @@ -0,0 +1,102 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "supervisor/shared/cpu_regs.h" + +#ifdef __arm__ +.syntax unified +.thumb +.text +.align 2 + +@ uint cpu_get_regs_and_sp(r0=uint regs[SAVED_REGISTER_COUNT]) +.global cpu_get_regs_and_sp +.thumb +.thumb_func +.type cpu_get_regs_and_sp, %function +cpu_get_regs_and_sp: +#if __ARM_ARCH_ISA_THUMB == 2 +@ store registers into given array +#ifdef __arm__ +stmia r0!, {r4-r11} +#endif +#if defined(__aarch64__) && __aarch64__ == 1 +#error "aarch64 not supported" +stmia r0!, {x19-x28} +#endif +#ifdef __ARM_FP +#ifdef __arm__ +vstmia r0!, {s16-s31} +#endif +#if defined(__aarch64__) && __aarch64__ == 1 +vst1.64 {d8-d15}, [r0], #16 +#endif +#endif +#endif +// Thumb 1 can only store directly from R0-R7. This is M0 and M23 mostly. +#if __ARM_ARCH_ISA_THUMB == 1 +str r4, [r0, #0] +str r5, [r0, #4] +str r6, [r0, #8] +str r7, [r0, #12] +push {r1} +mov r1, r8 +str r1, [r0, #16] +mov r1, r9 +str r1, [r0, #20] +mov r1, r10 +str r1, [r0, #24] +mov r1, r11 +str r1, [r0, #28] +mov r1, r12 +str r1, [r0, #32] +mov r1, r13 +str r1, [r0, #36] +pop {r1} +#endif + +@ return the sp +mov r0, sp +bx lr +#endif + +#ifdef __riscv +#if __riscv_xlen == 32 +.global cpu_get_regs_and_sp +.type cpu_get_regs_and_sp, %function +cpu_get_regs_and_sp: +sw s0, 0(a0) +sw s1, 4(a0) +sw s2, 8(a0) +sw s3, 12(a0) +sw s4, 16(a0) +sw s5, 20(a0) +sw s6, 24(a0) +sw s7, 28(a0) +sw s8, 32(a0) +sw s9, 36(a0) +sw s10, 40(a0) +sw s11, 44(a0) +#ifdef __riscv_vector +sw fs0, 48(a0) +sw fs1, 52(a0) +sw fs2, 56(a0) +sw fs3, 60(a0) +sw fs4, 64(a0) +sw fs5, 68(a0) +sw fs6, 72(a0) +sw fs7, 76(a0) +sw fs8, 80(a0) +sw fs9, 84(a0) +sw fs10, 88(a0) +sw fs11, 92(a0) +#endif +move a0, sp +ret +#else +#error "Unsupported RISC-V bit length" +#endif +#endif diff --git a/supervisor/shared/cpu_regs.h b/supervisor/shared/cpu_regs.h new file mode 100644 index 0000000000000..aff0b69ebab0c --- /dev/null +++ b/supervisor/shared/cpu_regs.h @@ -0,0 +1,31 @@ +// This file is part of the CircuitPython project: https://circuitpython.org +// +// SPDX-FileCopyrightText: Copyright (c) 2025 Scott Shawcroft for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#pragma once + +#ifdef __arm__ +#define INTEGER_REGS 8 +#ifdef __ARM_FP +#define FLOATING_POINT_REGS 16 +#endif +#endif + +#ifdef __aarch64__ +#define INTEGER_REGS 10 +#ifdef __ARM_FP +#define FLOATING_POINT_REGS 8 +#endif +#endif + +#ifndef INTEGER_REGS +#define INTEGER_REGS 0 +#endif + +#ifndef FLOATING_POINT_REGS +#define FLOATING_POINT_REGS 0 +#endif + +#define SAVED_REGISTER_COUNT (INTEGER_REGS + FLOATING_POINT_REGS) From 04b98ed71fc92315018d78b1704e7baf67d93c4e Mon Sep 17 00:00:00 2001 From: foamyguy Date: Fri, 9 May 2025 09:56:34 -0500 Subject: [PATCH 58/76] fix pixel_shader property name, add tilegrid property and set tilegrid to None before it is bound, disallow TPM from being bound multiple times. --- locale/circuitpython.pot | 4 ++-- shared-bindings/tilepalettemapper/TilePaletteMapper.c | 5 +++-- shared-module/tilepalettemapper/TilePaletteMapper.c | 4 ++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 25908c7ec9e43..6dc0262d2f629 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -2070,8 +2070,8 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" -#: shared-module/displayio/Group.c -msgid "TileGrid must have a pixel_shader" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" msgstr "" #: shared-bindings/alarm/time/TimeAlarm.c diff --git a/shared-bindings/tilepalettemapper/TilePaletteMapper.c b/shared-bindings/tilepalettemapper/TilePaletteMapper.c index 3b115546970c9..ed3e928957f9f 100644 --- a/shared-bindings/tilepalettemapper/TilePaletteMapper.c +++ b/shared-bindings/tilepalettemapper/TilePaletteMapper.c @@ -84,7 +84,7 @@ static mp_obj_t tilepalettemapper_tilepalettemapper_obj_get_pixel_shader(mp_obj_ } MP_DEFINE_CONST_FUN_OBJ_1(tilepalettemapper_tilepalettemapper_get_pixel_shader_obj, tilepalettemapper_tilepalettemapper_obj_get_pixel_shader); -MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_palette_obj, +MP_PROPERTY_GETTER(tilepalettemapper_tilepalettemapper_pixel_shader_obj, (mp_obj_t)&tilepalettemapper_tilepalettemapper_get_pixel_shader_obj); //| tilegrid: displayio.TileGrid @@ -165,7 +165,8 @@ static mp_obj_t tilepalettemapper_subscr(mp_obj_t self_in, mp_obj_t index_obj, m static const mp_rom_map_elem_t tilepalettemapper_tilepalettemapper_locals_dict_table[] = { { MP_ROM_QSTR(MP_QSTR_width), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_width_obj) }, { MP_ROM_QSTR(MP_QSTR_height), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_height_obj) }, - { MP_ROM_QSTR(MP_QSTR_palette), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_palette_obj) }, + { MP_ROM_QSTR(MP_QSTR_pixel_shader), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_pixel_shader_obj) }, + { MP_ROM_QSTR(MP_QSTR_tilegrid), MP_ROM_PTR(&tilepalettemapper_tilepalettemapper_tilegrid_obj) }, }; static MP_DEFINE_CONST_DICT(tilepalettemapper_tilepalettemapper_locals_dict, tilepalettemapper_tilepalettemapper_locals_dict_table); diff --git a/shared-module/tilepalettemapper/TilePaletteMapper.c b/shared-module/tilepalettemapper/TilePaletteMapper.c index b1d1eb24c6f87..13711b2c2537d 100644 --- a/shared-module/tilepalettemapper/TilePaletteMapper.c +++ b/shared-module/tilepalettemapper/TilePaletteMapper.c @@ -14,6 +14,7 @@ void common_hal_tilepalettemapper_tilepalettemapper_construct(tilepalettemapper_ mp_obj_t pixel_shader, uint16_t input_color_count) { self->pixel_shader = pixel_shader; self->input_color_count = input_color_count; + self->tilegrid = mp_const_none; } uint16_t common_hal_tilepalettemapper_tilepalettemapper_get_width(tilepalettemapper_tilepalettemapper_t *self) { @@ -79,6 +80,9 @@ void tilepalettemapper_tilepalettemapper_get_color(tilepalettemapper_tilepalette } void tilepalettemapper_tilepalettemapper_bind(tilepalettemapper_tilepalettemapper_t *self, displayio_tilegrid_t *tilegrid) { + if (self->tilegrid != mp_const_none) { + mp_raise_RuntimeError(MP_ERROR_TEXT("TilePaletteMapper may only be bound to a TileGrid once")); + } self->tilegrid = tilegrid; self->width_in_tiles = common_hal_displayio_tilegrid_get_width(tilegrid); self->height_in_tiles = common_hal_displayio_tilegrid_get_height(tilegrid); From 6fcdf1418d3f9153adc1bcc64e6daa8cf667927b Mon Sep 17 00:00:00 2001 From: foamyguy Date: Fri, 9 May 2025 12:15:36 -0500 Subject: [PATCH 59/76] disable tilepalettemapper for overflowing boards --- ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk | 1 + ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk | 1 + ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk | 1 + ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk | 1 + 4 files changed, 4 insertions(+) diff --git a/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk b/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk index f907853f2382e..366586c1d5568 100644 --- a/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk +++ b/ports/espressif/boards/ai_thinker_esp32-c3s/mpconfigboard.mk @@ -10,3 +10,4 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG = 0 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk b/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk index a03e6c32eb2c6..4341584e4cef3 100644 --- a/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk +++ b/ports/espressif/boards/beetle-esp32-c3/mpconfigboard.mk @@ -11,3 +11,4 @@ CIRCUITPY_ESP_FLASH_SIZE=4MB CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk b/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk index 36dc38883ff39..2481a95928bda 100644 --- a/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk +++ b/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk @@ -10,3 +10,4 @@ CIRCUITPY_ESP_FLASH_SIZE=4MB CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 +CIRCUITPY_TILEPALETTEMAPPER = 0 diff --git a/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk b/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk index b2ea6005db53a..fa51216e911a1 100644 --- a/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk +++ b/ports/espressif/boards/microdev_micro_c3/mpconfigboard.mk @@ -10,3 +10,4 @@ CIRCUITPY_ESP_FLASH_SIZE = 4MB CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 +CIRCUITPY_TILEPALETTEMAPPER = 0 From 55f0be2b45abbb86dd74286e36bc983d64ead281 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 9 May 2025 20:08:24 +0200 Subject: [PATCH 60/76] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: CircuitPython/main Translate-URL: https://hosted.weblate.org/projects/circuitpython/main/ --- locale/ID.po | 22 ++++++++++++++-------- locale/cs.po | 22 ++++++++++++++-------- locale/de_DE.po | 22 ++++++++++++++-------- locale/el.po | 22 ++++++++++++++-------- locale/en_GB.po | 22 ++++++++++++++-------- locale/es.po | 22 ++++++++++++++-------- locale/fil.po | 22 ++++++++++++++-------- locale/fr.po | 22 ++++++++++++++-------- locale/hi.po | 22 ++++++++++++++-------- locale/it_IT.po | 22 ++++++++++++++-------- locale/ja.po | 22 ++++++++++++++-------- locale/ko.po | 22 ++++++++++++++-------- locale/nl.po | 22 ++++++++++++++-------- locale/pl.po | 22 ++++++++++++++-------- locale/pt_BR.po | 22 ++++++++++++++-------- locale/ru.po | 22 ++++++++++++++-------- locale/sv.po | 22 ++++++++++++++-------- locale/tr.po | 22 ++++++++++++++-------- locale/zh_Latn_pinyin.po | 22 ++++++++++++++-------- 19 files changed, 266 insertions(+), 152 deletions(-) diff --git a/locale/ID.po b/locale/ID.po index 9310f0e4e19cc..6155c9fd2626e 100644 --- a/locale/ID.po +++ b/locale/ID.po @@ -1081,7 +1081,8 @@ msgstr "Gagal menulis flash internal." msgid "File exists" msgstr "File sudah ada" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1276,6 +1277,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2106,6 +2108,10 @@ msgstr "Indeks ubin di luar batas" msgid "Tile width must exactly divide bitmap width" msgstr "Lebar ubin harus persis membagi lebar bitmap" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Waktu sudah berlalu." @@ -2640,16 +2646,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -4066,7 +4072,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/cs.po b/locale/cs.po index 1bbfd95e5f2e7..a996f27a2319d 100644 --- a/locale/cs.po +++ b/locale/cs.po @@ -1074,7 +1074,8 @@ msgstr "Nepodařilo se zapsat do interní paměti." msgid "File exists" msgstr "soubor existuje" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "Soubor nenalezen" @@ -1271,6 +1272,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2091,6 +2093,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Čas je v minulosti." @@ -2620,16 +2626,16 @@ msgstr "velikosti bitmapy musí odpovídat" msgid "bits must be 32 or less" msgstr "počet bitů nesmí přesáhnout 32" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -4046,7 +4052,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/de_DE.po b/locale/de_DE.po index 50ab439bdbe7d..5e7dc935b3c42 100644 --- a/locale/de_DE.po +++ b/locale/de_DE.po @@ -1081,7 +1081,8 @@ msgstr "Interner Flash konnte nicht geschrieben werden." msgid "File exists" msgstr "Datei existiert" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "Datei nicht gefunden" @@ -1282,6 +1283,7 @@ msgstr "Unterbrochen durch Ausgabefunktion" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2116,6 +2118,10 @@ msgstr "Kachelindex außerhalb der Grenzen" msgid "Tile width must exactly divide bitmap width" msgstr "Die Kachelbreite muss die Bitmap-Breite genau teilen" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Zeit liegt in der Vergangenheit." @@ -2652,16 +2658,16 @@ msgstr "Bitmap-Größen müssen übereinstimmen" msgid "bits must be 32 or less" msgstr "bits müssen 32 oder kleiner sein" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "Es müssen 8 oder 16 bits_per_sample sein" @@ -4104,7 +4110,7 @@ msgstr "Roll-Argument muss ein ndarray sein" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/el.po b/locale/el.po index db5a66f01e18f..fa52089a3cafd 100644 --- a/locale/el.po +++ b/locale/el.po @@ -1082,7 +1082,8 @@ msgstr "" msgid "File exists" msgstr "" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1277,6 +1278,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2096,6 +2098,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2619,16 +2625,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -4045,7 +4051,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/en_GB.po b/locale/en_GB.po index e57c947211787..c0481af6c0420 100644 --- a/locale/en_GB.po +++ b/locale/en_GB.po @@ -1074,7 +1074,8 @@ msgstr "Failed to write internal flash." msgid "File exists" msgstr "File exists" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "File not found" @@ -1270,6 +1271,7 @@ msgstr "Interrupted by output function" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2094,6 +2096,10 @@ msgstr "Tile index out of bounds" msgid "Tile width must exactly divide bitmap width" msgstr "Tile width must exactly divide bitmap width" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Time is in the past." @@ -2624,16 +2630,16 @@ msgstr "bitmap sizes must match" msgid "bits must be 32 or less" msgstr "bits must be 32 or less" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample must be 16" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "bits_per_sample must be 16" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample must be 8 or 16" @@ -4053,7 +4059,7 @@ msgstr "roll argument must be an ndarray" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "samples_signed must be true" diff --git a/locale/es.po b/locale/es.po index d9fd427bcea44..19892fbdca741 100644 --- a/locale/es.po +++ b/locale/es.po @@ -1085,7 +1085,8 @@ msgstr "Error al escribir el flash interno." msgid "File exists" msgstr "El archivo ya existe" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "Archivo no encontrado" @@ -1292,6 +1293,7 @@ msgstr "Interrumpido por resultado de función" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2125,6 +2127,10 @@ msgstr "Índice de mosaico fuera de límites" msgid "Tile width must exactly divide bitmap width" msgstr "Ancho del Tile debe dividir exactamente el ancho de mapa de bits" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Tiempo suministrado esta en el pasado." @@ -2661,16 +2667,16 @@ msgstr "los tamaños de los bitmap deben coincidir" msgid "bits must be 32 or less" msgstr "los bits deben ser 32 o menos" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample debe ser 8 ó 16" @@ -4099,7 +4105,7 @@ msgstr "argumento enrolado tiene que ser un ndarray" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/fil.po b/locale/fil.po index 935906cdf7e09..51fae18079231 100644 --- a/locale/fil.po +++ b/locale/fil.po @@ -1068,7 +1068,8 @@ msgstr "" msgid "File exists" msgstr "Mayroong file" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1263,6 +1264,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2085,6 +2087,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2610,16 +2616,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample ay dapat 8 o 16" @@ -4049,7 +4055,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/fr.po b/locale/fr.po index da51ac1ddc2cc..33ba163d6fc1a 100644 --- a/locale/fr.po +++ b/locale/fr.po @@ -1093,7 +1093,8 @@ msgstr "Échec de l'écriture vers flash interne." msgid "File exists" msgstr "Le fichier existe" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "Fichier non trouvé" @@ -1296,6 +1297,7 @@ msgstr "Interrompu par la fonction de sortie" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2134,6 +2136,10 @@ msgstr "Index des tuiles hors limites" msgid "Tile width must exactly divide bitmap width" msgstr "La largeur de la tuile doit diviser exactement la largeur de l'image" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "L'heure est dans le passé." @@ -2671,16 +2677,16 @@ msgstr "les tailles des images doivent correspondre" msgid "bits must be 32 or less" msgstr "les bits doivent être 32 ou moins" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "'bits_per_sample' doivent être 8 ou 16" @@ -4120,7 +4126,7 @@ msgstr "paramêtre roll doit être un ndarray" msgid "rsplit(None,n)" msgstr "rsplit(None, n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/hi.po b/locale/hi.po index 3845a8ad8526c..d35bd73452587 100644 --- a/locale/hi.po +++ b/locale/hi.po @@ -1058,7 +1058,8 @@ msgstr "" msgid "File exists" msgstr "" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1253,6 +1254,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2070,6 +2072,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2593,16 +2599,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -4019,7 +4025,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/it_IT.po b/locale/it_IT.po index da6c8ed6188cf..c1a1d65552080 100644 --- a/locale/it_IT.po +++ b/locale/it_IT.po @@ -1066,7 +1066,8 @@ msgstr "" msgid "File exists" msgstr "File esistente" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1261,6 +1262,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2083,6 +2085,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2608,16 +2614,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c #, fuzzy msgid "bits_per_sample must be 8 or 16" msgstr "i bit devono essere 7, 8 o 9" @@ -4051,7 +4057,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/ja.po b/locale/ja.po index 4b91303e8ceed..0b6db3d762499 100644 --- a/locale/ja.po +++ b/locale/ja.po @@ -1075,7 +1075,8 @@ msgstr "内部フラッシュ書き込みに失敗" msgid "File exists" msgstr "ファイルが存在します" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1270,6 +1271,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2092,6 +2094,10 @@ msgstr "タイルのインデクスが範囲外" msgid "Tile width must exactly divide bitmap width" msgstr "タイルの幅はビットマップの幅を割り切れる値でなければなりません" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2616,16 +2622,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sampleは8または16でなければなりません" @@ -4047,7 +4053,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/ko.po b/locale/ko.po index 08b9f3a455f9c..b957b326585f2 100644 --- a/locale/ko.po +++ b/locale/ko.po @@ -1108,7 +1108,8 @@ msgstr "내부 플래시를 쓰는 것에 실패했습니다." msgid "File exists" msgstr "파일이 있습니다" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "파일을 찾을 수 없습니다" @@ -1305,6 +1306,7 @@ msgstr "출력 함수로 인해 종료되었다" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2145,6 +2147,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2669,16 +2675,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample은 8 또는 16이어야합니다." @@ -4095,7 +4101,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/nl.po b/locale/nl.po index a1451ab8af069..dae31967559f6 100644 --- a/locale/nl.po +++ b/locale/nl.po @@ -1061,7 +1061,8 @@ msgstr "Schrijven naar interne flash mislukt." msgid "File exists" msgstr "Bestand bestaat" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1256,6 +1257,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2082,6 +2084,10 @@ msgstr "Tile index buiten bereik" msgid "Tile width must exactly divide bitmap width" msgstr "Tile breedte moet exact de bitmap breedte verdelen" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Tijdstip ligt in het verleden." @@ -2609,16 +2615,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample moet 8 of 16 zijn" @@ -4041,7 +4047,7 @@ msgstr "roll argument moet een ndarray zijn" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/pl.po b/locale/pl.po index f87a8c73df555..8040dbcf02948 100644 --- a/locale/pl.po +++ b/locale/pl.po @@ -1074,7 +1074,8 @@ msgstr "Nie udało się zapisać wewnętrznej pamięci flash." msgid "File exists" msgstr "Plik istnieje" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "Plik nie znaleziony" @@ -1275,6 +1276,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2096,6 +2098,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "Szerokość bitmapy musi być wielokrotnością szerokości kafelka" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2621,16 +2627,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample musi być 8 lub 16" @@ -4049,7 +4055,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/pt_BR.po b/locale/pt_BR.po index 65db17fbb32ff..768bf107f280b 100644 --- a/locale/pt_BR.po +++ b/locale/pt_BR.po @@ -1085,7 +1085,8 @@ msgstr "Falha ao gravar o flash interno." msgid "File exists" msgstr "Arquivo já existe" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "Arquivo não encontrado" @@ -1289,6 +1290,7 @@ msgstr "Interrompido pela função de saída" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2127,6 +2129,10 @@ msgstr "O índice do bloco está fora dos limites" msgid "Tile width must exactly divide bitmap width" msgstr "A largura do bloco deve dividir exatamente com a largura do bitmap" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "O tempo está no passado." @@ -2667,16 +2673,16 @@ msgstr "os tamanhos do bitmap devem coincidir" msgid "bits must be 32 or less" msgstr "bits deve ser 32 ou menos" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample deve ser 8 ou 16" @@ -4113,7 +4119,7 @@ msgstr "argumento de enrolar deve ser um ndarray" msgid "rsplit(None,n)" msgstr "rsplit(Nenhum,n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/ru.po b/locale/ru.po index 878c8cd2fe894..c94b9698d3547 100644 --- a/locale/ru.po +++ b/locale/ru.po @@ -1087,7 +1087,8 @@ msgstr "Не удалось записать внутреннюю флэш-па msgid "File exists" msgstr "Файл существует" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "Файл не найден" @@ -1292,6 +1293,7 @@ msgstr "Прерывается функцией выхода" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2126,6 +2128,10 @@ msgstr "Выход индекса плитки за пределы" msgid "Tile width must exactly divide bitmap width" msgstr "Ширина плитки должна точно делить ширину растрового изображения" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Время в прошлом." @@ -2663,16 +2669,16 @@ msgstr "Размеры растровых изображений должны с msgid "bits must be 32 or less" msgstr "биты должны быть 32 или менее" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample должно быть 8 или 16" @@ -4108,7 +4114,7 @@ msgstr "аргумент roll должен быть массивом ndarray" msgid "rsplit(None,n)" msgstr "rsplit(Нет;n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/sv.po b/locale/sv.po index 4404d2c4a48bd..d56f55f8f683d 100644 --- a/locale/sv.po +++ b/locale/sv.po @@ -1079,7 +1079,8 @@ msgstr "Det gick inte att skriva till intern flash." msgid "File exists" msgstr "Filen finns redan" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "Filen hittades inte" @@ -1278,6 +1279,7 @@ msgstr "Avbruten av utgångsfunktion" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2105,6 +2107,10 @@ msgstr "Tile-index utanför gräns" msgid "Tile width must exactly divide bitmap width" msgstr "Tile-bredd måste vara jämnt delbar med bredd på bitmap" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "Tid har passerats." @@ -2636,16 +2642,16 @@ msgstr "bitmappsstorlekar måste matcha" msgid "bits must be 32 or less" msgstr "bits måste vara 32 eller färre" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample måste vara 16" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "bits_per_sample måste vara 16" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "bits_per_sample måste vara 8 eller 16" @@ -4069,7 +4075,7 @@ msgstr "argumentet roll måste vara en ndarray" msgid "rsplit(None,n)" msgstr "rsplit(None,n)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "samples_signed måste vara sann" diff --git a/locale/tr.po b/locale/tr.po index 62eb5d4d58390..704b3598521ad 100644 --- a/locale/tr.po +++ b/locale/tr.po @@ -1072,7 +1072,8 @@ msgstr "Dahili flaş yazılamadı." msgid "File exists" msgstr "Dosya var" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "" @@ -1271,6 +1272,7 @@ msgstr "" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2092,6 +2094,10 @@ msgstr "" msgid "Tile width must exactly divide bitmap width" msgstr "" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "" @@ -2615,16 +2621,16 @@ msgstr "" msgid "bits must be 32 or less" msgstr "" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "" @@ -4041,7 +4047,7 @@ msgstr "" msgid "rsplit(None,n)" msgstr "" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "" diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po index f4509f9bfd408..57bb73e6e8ec6 100644 --- a/locale/zh_Latn_pinyin.po +++ b/locale/zh_Latn_pinyin.po @@ -1080,7 +1080,8 @@ msgstr "Wúfǎ xiě rù nèibù shǎncún." msgid "File exists" msgstr "Wénjiàn cúnzài" -#: shared-module/lvfontio/OnDiskFont.c shared-module/os/getenv.c +#: shared-bindings/supervisor/__init__.c shared-module/lvfontio/OnDiskFont.c +#: shared-module/os/getenv.c msgid "File not found" msgstr "zhǎo bú dào wén jiàn" @@ -1284,6 +1285,7 @@ msgstr "bèi shūchū gōngnéng zhōngduàn" #: ports/raspberrypi/common-hal/picodvi/Framebuffer_RP2040.c py/argcheck.c #: shared-bindings/digitalio/DigitalInOut.c #: shared-bindings/epaperdisplay/EPaperDisplay.c shared-bindings/pwmio/PWMOut.c +#: shared-bindings/supervisor/__init__.c #: shared-module/aurora_epaper/aurora_framebuffer.c #: shared-module/lvfontio/OnDiskFont.c msgid "Invalid %q" @@ -2112,6 +2114,10 @@ msgstr "Píng pū zhǐshù chāochū fànwéi" msgid "Tile width must exactly divide bitmap width" msgstr "Píng pū kuāndù bìxū huàfēn wèi tú kuāndù" +#: shared-module/tilepalettemapper/TilePaletteMapper.c +msgid "TilePaletteMapper may only be bound to a TileGrid once" +msgstr "" + #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." msgstr "shí jiān yǐ jīng guò qù." @@ -2642,16 +2648,16 @@ msgstr "wèi tú dà xiǎo bì xū pǐ pèi" msgid "bits must be 32 or less" msgstr "wèi bì xū shì 32 huò gèng shǎo" +#: shared-bindings/audiofreeverb/Freeverb.c +msgid "bits_per_sample must be 16" +msgstr "bits_per_sample bìxū wèi 16" + #: shared-bindings/audiodelays/Chorus.c shared-bindings/audiodelays/Echo.c #: shared-bindings/audiodelays/MultiTapDelay.c #: shared-bindings/audiodelays/PitchShift.c #: shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiodelays/Reverb.c -msgid "bits_per_sample must be 16" -msgstr "bits_per_sample bìxū wèi 16" - -#: shared-bindings/audiodelays/Echo.c shared-bindings/audiofilters/Distortion.c -#: shared-bindings/audiofilters/Filter.c shared-bindings/audiomixer/Mixer.c +#: shared-bindings/audiofilters/Filter.c shared-bindings/audiofilters/Phaser.c +#: shared-bindings/audiomixer/Mixer.c msgid "bits_per_sample must be 8 or 16" msgstr "měi jiàn yàngběn bìxū wèi 8 huò 16" @@ -4075,7 +4081,7 @@ msgstr "gǔn dòng cān shù bì xū shì ndarray" msgid "rsplit(None,n)" msgstr "Rchāifēn(wú,N)" -#: shared-bindings/audiodelays/Reverb.c +#: shared-bindings/audiofreeverb/Freeverb.c msgid "samples_signed must be true" msgstr "samples_signed bìxū wéi zhēn" From e6271b2d7760e539e0d57493daaf4d9853348279 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Fri, 9 May 2025 11:23:26 -0700 Subject: [PATCH 61/76] Shrink lolin_c3_mini --- ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk b/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk index 36dc38883ff39..2a8d4c97b69a7 100644 --- a/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk +++ b/ports/espressif/boards/lolin_c3_mini/mpconfigboard.mk @@ -9,4 +9,7 @@ CIRCUITPY_ESP_FLASH_SIZE=4MB CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 +# Not enough flash +CIRCUITPY_SOCKETPOOL_IPV6 = 0 + CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 From 3435f47385da407df742039d3ec00a4e0609c898 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Fri, 9 May 2025 14:43:31 -0700 Subject: [PATCH 62/76] Remove non-standard sys.print_exception() It already warned about it. Fixes #9451 --- py/modsys.c | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/py/modsys.c b/py/modsys.c index 2bb2606a0627b..4f9f8759dd322 100644 --- a/py/modsys.c +++ b/py/modsys.c @@ -170,29 +170,7 @@ static mp_obj_t mp_sys_exit(size_t n_args, const mp_obj_t *args) { } MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_sys_exit_obj, 0, 1, mp_sys_exit); -static mp_obj_t mp_sys_print_exception(size_t n_args, const mp_obj_t *args) { - // CIRCUITPY-CHANGE - #if CIRCUITPY_WARNINGS - warnings_warn(&mp_type_FutureWarning, MP_ERROR_TEXT("%q moved from %q to %q"), MP_QSTR_print_exception, MP_QSTR_sys, MP_QSTR_traceback); - #endif - - #if MICROPY_PY_IO && MICROPY_PY_SYS_STDFILES - void *stream_obj = &mp_sys_stdout_obj; - if (n_args > 1) { - mp_get_stream_raise(args[1], MP_STREAM_OP_WRITE); - stream_obj = MP_OBJ_TO_PTR(args[1]); - } - - mp_print_t print = {stream_obj, mp_stream_write_adaptor}; - mp_obj_print_exception(&print, args[0]); - #else - (void)n_args; - mp_obj_print_exception(&mp_plat_print, args[0]); - #endif - - return mp_const_none; -} -MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_sys_print_exception_obj, 1, 2, mp_sys_print_exception); +// CIRCUITPY-CHANGE: Removed print_exception because it isn't in CPython. #if MICROPY_PY_SYS_EXC_INFO static mp_obj_t mp_sys_exc_info(void) { @@ -347,8 +325,6 @@ static const mp_rom_map_elem_t mp_module_sys_globals_table[] = { /* * Extensions to CPython */ - - { MP_ROM_QSTR(MP_QSTR_print_exception), MP_ROM_PTR(&mp_sys_print_exception_obj) }, #if MICROPY_PY_SYS_ATEXIT { MP_ROM_QSTR(MP_QSTR_atexit), MP_ROM_PTR(&mp_sys_atexit_obj) }, #endif From fc540b7ee44bc4c915752a8732b708308cf20b5b Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Fri, 9 May 2025 15:13:51 -0700 Subject: [PATCH 63/76] Fix terminal on rotation This fixes an issue where a terminal can't be started after being stopped (when tilegrid_tiles is freed and set to NULL.) Fixes #10241 --- supervisor/shared/display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supervisor/shared/display.c b/supervisor/shared/display.c index 87af13d64688b..8d53b0e62be7e 100644 --- a/supervisor/shared/display.c +++ b/supervisor/shared/display.c @@ -141,7 +141,7 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) { displayio_tilegrid_t *scroll_area = &supervisor_terminal_scroll_area_text_grid; displayio_tilegrid_t *status_bar = &supervisor_terminal_status_bar_text_grid; - bool reset_tiles = false; + bool reset_tiles = tilegrid_tiles == NULL; uint16_t glyph_width = 0; uint16_t glyph_height = 0; From 2601436eb23178e61b1ac844e4965cdb3bed1820 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Fri, 9 May 2025 15:55:45 -0700 Subject: [PATCH 64/76] Fix vectorio in group tracking They have Group specific state so limit them to one group at a time. Fixes #10226 --- shared-bindings/vectorio/VectorShape.c | 1 + shared-bindings/vectorio/VectorShape.h | 1 + shared-bindings/vectorio/__init__.h | 2 ++ shared-module/displayio/Group.c | 7 ++++++- shared-module/vectorio/VectorShape.c | 6 ++++++ shared-module/vectorio/VectorShape.h | 1 + 6 files changed, 17 insertions(+), 1 deletion(-) diff --git a/shared-bindings/vectorio/VectorShape.c b/shared-bindings/vectorio/VectorShape.c index 041600bff4e49..ff29609fc4e91 100644 --- a/shared-bindings/vectorio/VectorShape.c +++ b/shared-bindings/vectorio/VectorShape.c @@ -82,6 +82,7 @@ vectorio_draw_protocol_impl_t vectorio_vector_shape_draw_protocol_impl = { .draw_finish_refresh = (draw_finish_refresh_fun)vectorio_vector_shape_finish_refresh, .draw_get_refresh_areas = (draw_get_refresh_areas_fun)vectorio_vector_shape_get_refresh_areas, .draw_set_dirty = (draw_set_dirty_fun)common_hal_vectorio_vector_shape_set_dirty, + .draw_set_in_group = (draw_set_in_group_fun)vectorio_vector_shape_set_in_group, }; // Stub checker does not approve of these shared properties. diff --git a/shared-bindings/vectorio/VectorShape.h b/shared-bindings/vectorio/VectorShape.h index 9e06a0c146e8d..7924eb07ba287 100644 --- a/shared-bindings/vectorio/VectorShape.h +++ b/shared-bindings/vectorio/VectorShape.h @@ -43,6 +43,7 @@ mp_obj_t common_hal_vectorio_vector_shape_get_pixel_shader(vectorio_vector_shape void common_hal_vectorio_vector_shape_set_pixel_shader(vectorio_vector_shape_t *self, mp_obj_t pixel_shader); void vectorio_vector_shape_update_transform(vectorio_vector_shape_t *self, displayio_buffer_transform_t *group_transform); +bool vectorio_vector_shape_set_in_group(vectorio_vector_shape_t *self, bool in_group); // Composable property definition for shapes that use VectorShape extern vectorio_draw_protocol_impl_t vectorio_vector_shape_draw_protocol_impl; diff --git a/shared-bindings/vectorio/__init__.h b/shared-bindings/vectorio/__init__.h index c982f63815b4d..c5dcc02656738 100644 --- a/shared-bindings/vectorio/__init__.h +++ b/shared-bindings/vectorio/__init__.h @@ -23,6 +23,7 @@ typedef bool (*draw_get_dirty_area_fun)(mp_obj_t draw_protocol_self, displayio_a typedef void (*draw_update_transform_fun)(mp_obj_t draw_protocol_self, displayio_buffer_transform_t *group_transform); typedef void (*draw_finish_refresh_fun)(mp_obj_t draw_protocol_self); typedef void (*draw_set_dirty_fun)(mp_obj_t draw_protocol_self); +typedef bool (*draw_set_in_group_fun)(mp_obj_t draw_protocol_self, bool in_group); typedef displayio_area_t *(*draw_get_refresh_areas_fun)(mp_obj_t draw_protocol_self, displayio_area_t *tail); typedef struct _vectorio_draw_protocol_impl_t { @@ -32,6 +33,7 @@ typedef struct _vectorio_draw_protocol_impl_t { draw_finish_refresh_fun draw_finish_refresh; draw_get_refresh_areas_fun draw_get_refresh_areas; draw_set_dirty_fun draw_set_dirty; + draw_set_in_group_fun draw_set_in_group; } vectorio_draw_protocol_impl_t; // Draw protocol diff --git a/shared-module/displayio/Group.c b/shared-module/displayio/Group.c index e2a1a527062b8..a2bf685d0f7c4 100644 --- a/shared-module/displayio/Group.c +++ b/shared-module/displayio/Group.c @@ -251,7 +251,11 @@ static void _add_layer(displayio_group_t *self, mp_obj_t layer) { #if CIRCUITPY_VECTORIO const vectorio_draw_protocol_t *draw_protocol = mp_proto_get(MP_QSTR_protocol_draw, layer); if (draw_protocol != NULL) { - draw_protocol->draw_protocol_impl->draw_update_transform(draw_protocol->draw_get_protocol_self(layer), &self->absolute_transform); + mp_obj_t protocol_self = draw_protocol->draw_get_protocol_self(layer); + if (draw_protocol->draw_protocol_impl->draw_set_in_group(protocol_self, true)) { + mp_raise_ValueError(MP_ERROR_TEXT("Layer already in a group")); + } + draw_protocol->draw_protocol_impl->draw_update_transform(protocol_self, &self->absolute_transform); return; } #endif @@ -296,6 +300,7 @@ static void _remove_layer(displayio_group_t *self, size_t index) { bool has_dirty_area = draw_protocol->draw_protocol_impl->draw_get_dirty_area(layer, &layer_area); rendered_last_frame = has_dirty_area; draw_protocol->draw_protocol_impl->draw_update_transform(layer, NULL); + draw_protocol->draw_protocol_impl->draw_set_in_group(layer, false); } #endif layer = mp_obj_cast_to_native_base( diff --git a/shared-module/vectorio/VectorShape.c b/shared-module/vectorio/VectorShape.c index 75e1de8b96071..680a9f157c360 100644 --- a/shared-module/vectorio/VectorShape.c +++ b/shared-module/vectorio/VectorShape.c @@ -555,3 +555,9 @@ void vectorio_vector_shape_update_transform(vectorio_vector_shape_t *self, displ self->absolute_transform = group_transform == NULL ? &null_transform : group_transform; common_hal_vectorio_vector_shape_set_dirty(self); } + +bool vectorio_vector_shape_set_in_group(vectorio_vector_shape_t *self, bool in_group) { + bool was_in_group = self->in_group; + self->in_group = in_group; + return was_in_group; +} diff --git a/shared-module/vectorio/VectorShape.h b/shared-module/vectorio/VectorShape.h index db77fc0acb940..f66569f97d492 100644 --- a/shared-module/vectorio/VectorShape.h +++ b/shared-module/vectorio/VectorShape.h @@ -43,6 +43,7 @@ typedef struct { displayio_area_t current_area; bool current_area_dirty; bool hidden; + bool in_group; } vectorio_vector_shape_t; displayio_area_t *vectorio_vector_shape_get_refresh_areas(vectorio_vector_shape_t *self, displayio_area_t *tail); From a54e707c43a4627616a83de41921641b50ea70b8 Mon Sep 17 00:00:00 2001 From: Jonny Bergdahl Date: Sat, 10 May 2025 17:32:10 +0200 Subject: [PATCH 65/76] Fix duplicated error messages --- ports/espressif/common-hal/wifi/Radio.c | 4 ++-- ports/raspberrypi/common-hal/wifi/Radio.c | 2 +- ports/zephyr-cp/common-hal/wifi/Radio.c | 6 +++--- shared-module/audiocore/WaveFile.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ports/espressif/common-hal/wifi/Radio.c b/ports/espressif/common-hal/wifi/Radio.c index abb7cb8626cf1..dc5311bb8adc8 100644 --- a/ports/espressif/common-hal/wifi/Radio.c +++ b/ports/espressif/common-hal/wifi/Radio.c @@ -200,7 +200,7 @@ mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, u mp_raise_RuntimeError(MP_ERROR_TEXT("Already scanning for wifi networks")); } if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } set_mode_station(self, true); @@ -319,7 +319,7 @@ mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self) { wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, mp_float_t timeout, uint8_t *bssid, size_t bssid_len) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } wifi_config_t *config = &self->sta_config; diff --git a/ports/raspberrypi/common-hal/wifi/Radio.c b/ports/raspberrypi/common-hal/wifi/Radio.c index 5ac3a196fdcc9..69819639ba976 100644 --- a/ports/raspberrypi/common-hal/wifi/Radio.c +++ b/ports/raspberrypi/common-hal/wifi/Radio.c @@ -243,7 +243,7 @@ bool common_hal_wifi_radio_get_ap_active(wifi_radio_obj_t *self) { void common_hal_wifi_radio_stop_ap(wifi_radio_obj_t *self) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } cyw43_arch_disable_ap_mode(); diff --git a/ports/zephyr-cp/common-hal/wifi/Radio.c b/ports/zephyr-cp/common-hal/wifi/Radio.c index a5bb59db04590..726b406b3ca89 100644 --- a/ports/zephyr-cp/common-hal/wifi/Radio.c +++ b/ports/zephyr-cp/common-hal/wifi/Radio.c @@ -214,8 +214,8 @@ mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, u mp_raise_RuntimeError(MP_ERROR_TEXT("Already scanning for wifi networks")); } if (!common_hal_wifi_radio_get_enabled(self)) { - printk("wifi is not enabled\n"); - mp_raise_RuntimeError(MP_ERROR_TEXT("wifi is not enabled")); + printk("WiFi is not enabled\n"); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } wifi_scannednetworks_obj_t *scan = mp_obj_malloc(wifi_scannednetworks_obj_t, &wifi_scannednetworks_type); @@ -349,7 +349,7 @@ mp_obj_t common_hal_wifi_radio_get_stations_ap(wifi_radio_obj_t *self) { wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, mp_float_t timeout, uint8_t *bssid, size_t bssid_len) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } // wifi_config_t *config = &self->sta_config; diff --git a/shared-module/audiocore/WaveFile.c b/shared-module/audiocore/WaveFile.c index fcad5bc696289..77ca2445edbf3 100644 --- a/shared-module/audiocore/WaveFile.c +++ b/shared-module/audiocore/WaveFile.c @@ -69,7 +69,7 @@ void common_hal_audioio_wavefile_construct(audioio_wavefile_obj_t *self, (format.audio_format != 0xfffe || format.extended_audio_format != 1 || format.valid_bits_per_sample != format.bits_per_sample))) { - mp_raise_ValueError(MP_ERROR_TEXT("Unsupported format")); + mp_raise_ValueError(MP_ERROR_TEXT("Format not supported")); } // Get the sample_rate self->base.sample_rate = format.sample_rate; From 863e7a51d29c07620402ab5d9122f759bc8b42ba Mon Sep 17 00:00:00 2001 From: Jonny Bergdahl Date: Sat, 10 May 2025 20:15:48 +0200 Subject: [PATCH 66/76] Fix wrong python command in Makefile Add pot file --- Makefile | 2 +- locale/circuitpython.pot | 18 +++++++----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 7da8ec6ccdbbf..554945691b459 100644 --- a/Makefile +++ b/Makefile @@ -242,7 +242,7 @@ pseudoxml: .PHONY: all-source all-source: -TRANSLATE_CHECK_SUBMODULES=if ! [ -f extmod/ulab/README.md ]; then python tools/ci_fetch_deps.py translate; fi +TRANSLATE_CHECK_SUBMODULES=if ! [ -f extmod/ulab/README.md ]; then $(PYTHON) tools/ci_fetch_deps.py translate; fi TRANSLATE_COMMAND=find $(TRANSLATE_SOURCES) -type d \( $(TRANSLATE_SOURCES_EXC) \) -prune -o -type f \( -iname "*.c" -o -iname "*.h" \) -print | (LC_ALL=C sort) | xgettext -x locale/synthetic.pot -f- -L C -s --add-location=file --keyword=MP_ERROR_TEXT -o - | sed -e '/"POT-Creation-Date: /d' locale/circuitpython.pot: all-source $(TRANSLATE_CHECK_SUBMODULES) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 6dc0262d2f629..97186c9c25e99 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -1088,7 +1088,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -2300,10 +2300,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2360,6 +2356,12 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c +#: ports/raspberrypi/common-hal/wifi/Radio.c +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" + #: ports/raspberrypi/common-hal/wifi/Radio.c msgid "Wifi is not enabled" msgstr "" @@ -4392,12 +4394,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" From 739b24212c0beb48c569d24eaed0a337b9794e46 Mon Sep 17 00:00:00 2001 From: eightycc Date: Sat, 10 May 2025 15:56:21 -0700 Subject: [PATCH 67/76] Fix crashing bug in PR #10325 for RISC-V builds. --- supervisor/shared/cpu_regs.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/supervisor/shared/cpu_regs.h b/supervisor/shared/cpu_regs.h index aff0b69ebab0c..335201fe94231 100644 --- a/supervisor/shared/cpu_regs.h +++ b/supervisor/shared/cpu_regs.h @@ -20,6 +20,13 @@ #endif #endif +#ifdef __riscv +#define INTEGER_REGS 12 +#ifdef __riscv_vector +#define FLOATING_POINT_REGS 12 +#endif +#endif + #ifndef INTEGER_REGS #define INTEGER_REGS 0 #endif From 1cca6916c2a2b0ad92c34b2ed0eed3193a62cf71 Mon Sep 17 00:00:00 2001 From: eightycc Date: Sat, 10 May 2025 16:26:00 -0700 Subject: [PATCH 68/76] Revert PR #10301, obsoleted by PR #10325. --- shared/runtime/pyexec.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/shared/runtime/pyexec.c b/shared/runtime/pyexec.c index df2b60e207c94..54384528a59a4 100644 --- a/shared/runtime/pyexec.c +++ b/shared/runtime/pyexec.c @@ -91,9 +91,8 @@ static int parse_compile_execute(const void *source, mp_parse_input_kind_t input nlr_buf_t nlr; nlr.ret_val = NULL; if (nlr_push(&nlr) == 0) { - // CIRCUITPY-CHANGE: Made volatile to prevent gcc from re-ordering store of function pointer into stack frame - // after call to gc_collect. For RISC-V this was causing free of the compiled function before execution. - volatile mp_obj_t module_fun = mp_const_none; + // CIRCUITPY-CHANGE + mp_obj_t module_fun = mp_const_none; // CIRCUITPY-CHANGE #if CIRCUITPY_ATEXIT if (!(exec_flags & EXEC_FLAG_SOURCE_IS_ATEXIT)) From 98996d99d88b182f3727fbe221a81b7097b805cc Mon Sep 17 00:00:00 2001 From: Jonny Bergdahl Date: Sat, 10 May 2025 15:51:05 +0200 Subject: [PATCH 69/76] Translated using Weblate (Swedish) Currently translated at 100.0% (1017 of 1017 strings) Translation: CircuitPython/main Translate-URL: https://hosted.weblate.org/projects/circuitpython/main/sv/ --- locale/sv.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/sv.po b/locale/sv.po index d56f55f8f683d..e489cc603e32c 100644 --- a/locale/sv.po +++ b/locale/sv.po @@ -6,7 +6,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-01-04 12:55-0600\n" -"PO-Revision-Date: 2025-04-23 08:01+0000\n" +"PO-Revision-Date: 2025-05-11 14:02+0000\n" "Last-Translator: Jonny Bergdahl \n" "Language-Team: LANGUAGE \n" "Language: sv\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.11.1-dev\n" +"X-Generator: Weblate 5.12-dev\n" #: main.c msgid "" @@ -2109,7 +2109,7 @@ msgstr "Tile-bredd måste vara jämnt delbar med bredd på bitmap" #: shared-module/tilepalettemapper/TilePaletteMapper.c msgid "TilePaletteMapper may only be bound to a TileGrid once" -msgstr "" +msgstr "TilePaletteMapper får bara bindas till ett TileGrid en gång" #: shared-bindings/alarm/time/TimeAlarm.c msgid "Time is in the past." From 419243a44bc9d691ff1627f487c53322ca7f2c18 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Mon, 12 May 2025 11:02:44 -0700 Subject: [PATCH 70/76] Turn off codeop on c3 qtpy --- ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk b/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk index 4063a6395226c..1f47795002df9 100644 --- a/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk +++ b/ports/espressif/boards/adafruit_qtpy_esp32c3/mpconfigboard.mk @@ -11,5 +11,8 @@ CIRCUITPY_LEGACY_4MB_FLASH_LAYOUT = 1 CIRCUITPY_ESP_USB_SERIAL_JTAG = 1 +# Not enough flash space. +CIRCUITPY_CODEOP = 0 + # Not enough pins. CIRCUITPY_PARALLELDISPLAYBUS = 0 From d82b91ec19a0d4043f4f4d2d3f1df903503bcd2a Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Mon, 12 May 2025 14:47:37 -0700 Subject: [PATCH 71/76] Remove old traceback type Both #1167 and #5072 add traceback types. #1167 added a bunch of named tuples in order to reproduce the traceback string. Since #5072 added traceback printing, we don't need the old way. So, rollback PR #1167 in favor of the newer traceback type. --- py/modsys.c | 4 +- py/objexcept.c | 125 ------------------------------------------------- 2 files changed, 3 insertions(+), 126 deletions(-) diff --git a/py/modsys.c b/py/modsys.c index 4f9f8759dd322..ff63f1e2f88cc 100644 --- a/py/modsys.c +++ b/py/modsys.c @@ -26,6 +26,7 @@ */ #include "py/builtin.h" +#include "py/objexcept.h" #include "py/objlist.h" #include "py/objmodule.h" #include "py/objtuple.h" @@ -187,7 +188,8 @@ static mp_obj_t mp_sys_exc_info(void) { t->items[0] = MP_OBJ_FROM_PTR(mp_obj_get_type(cur_exc)); t->items[1] = cur_exc; // CIRCUITPY-CHANGE: has traceback obj - t->items[2] = mp_obj_exception_get_traceback_obj(cur_exc); + mp_obj_exception_t *native_exc = mp_obj_exception_get_native(cur_exc); + t->items[2] = native_exc->traceback; return MP_OBJ_FROM_PTR(t); } MP_DEFINE_CONST_FUN_OBJ_0(mp_sys_exc_info_obj, mp_sys_exc_info); diff --git a/py/objexcept.c b/py/objexcept.c index 70fdc15df4e47..6a6b1e4d4a7a5 100644 --- a/py/objexcept.c +++ b/py/objexcept.c @@ -31,8 +31,6 @@ #include #include "py/objlist.h" -// CIRCUITPY-CHANGE -#include "py/objnamedtuple.h" #include "py/objstr.h" #include "py/objtuple.h" #include "py/objtype.h" @@ -729,126 +727,3 @@ void mp_obj_exception_get_traceback(mp_obj_t self_in, size_t *n, size_t **values *values = self->traceback->data; } } - -// CIRCUITPY-CHANGE: here until end -#if MICROPY_PY_SYS_EXC_INFO -static const mp_obj_namedtuple_type_t code_type_obj = { - NAMEDTUPLE_TYPE_BASE_AND_SLOTS(MP_QSTR_code), - .n_fields = 15, - .fields = { - MP_QSTR_co_argcount, - MP_QSTR_co_kwonlyargcount, - MP_QSTR_co_nlocals, - MP_QSTR_co_stacksize, - MP_QSTR_co_flags, - MP_QSTR_co_code, - MP_QSTR_co_consts, - MP_QSTR_co_names, - MP_QSTR_co_varnames, - MP_QSTR_co_freevars, - MP_QSTR_co_cellvars, - MP_QSTR_co_filename, - MP_QSTR_co_name, - MP_QSTR_co_firstlineno, - MP_QSTR_co_lnotab, - }, -}; - -static mp_obj_t code_make_new(qstr file, qstr block) { - mp_obj_t elems[15] = { - mp_obj_new_int(0), // co_argcount - mp_obj_new_int(0), // co_kwonlyargcount - mp_obj_new_int(0), // co_nlocals - mp_obj_new_int(0), // co_stacksize - mp_obj_new_int(0), // co_flags - mp_obj_new_bytearray(0, NULL), // co_code - mp_obj_new_tuple(0, NULL), // co_consts - mp_obj_new_tuple(0, NULL), // co_names - mp_obj_new_tuple(0, NULL), // co_varnames - mp_obj_new_tuple(0, NULL), // co_freevars - mp_obj_new_tuple(0, NULL), // co_cellvars - MP_OBJ_NEW_QSTR(file), // co_filename - MP_OBJ_NEW_QSTR(block), // co_name - mp_obj_new_int(1), // co_firstlineno - mp_obj_new_bytearray(0, NULL), // co_lnotab - }; - - return namedtuple_make_new((const mp_obj_type_t *)&code_type_obj, 15, 0, elems); -} - -static const mp_obj_namedtuple_type_t frame_type_obj = { - NAMEDTUPLE_TYPE_BASE_AND_SLOTS(MP_QSTR_frame), - .n_fields = 8, - .fields = { - MP_QSTR_f_back, - MP_QSTR_f_builtins, - MP_QSTR_f_code, - MP_QSTR_f_globals, - MP_QSTR_f_lasti, - MP_QSTR_f_lineno, - MP_QSTR_f_locals, - MP_QSTR_f_trace, - }, -}; - -static mp_obj_t frame_make_new(mp_obj_t f_code, int f_lineno) { - mp_obj_t elems[8] = { - mp_const_none, // f_back - mp_obj_new_dict(0), // f_builtins - f_code, // f_code - mp_obj_new_dict(0), // f_globals - mp_obj_new_int(0), // f_lasti - mp_obj_new_int(f_lineno), // f_lineno - mp_obj_new_dict(0), // f_locals - mp_const_none, // f_trace - }; - - return namedtuple_make_new((const mp_obj_type_t *)&frame_type_obj, 8, 0, elems); -} - -static const mp_obj_namedtuple_type_t traceback_type_obj = { - NAMEDTUPLE_TYPE_BASE_AND_SLOTS(MP_QSTR_traceback), - .n_fields = 4, - .fields = { - MP_QSTR_tb_frame, - MP_QSTR_tb_lasti, - MP_QSTR_tb_lineno, - MP_QSTR_tb_next, - }, -}; - -static mp_obj_t traceback_from_values(size_t *values, mp_obj_t tb_next) { - int lineno = values[1]; - - mp_obj_t elems[4] = { - frame_make_new(code_make_new(values[0], values[2]), lineno), - mp_obj_new_int(0), - mp_obj_new_int(lineno), - tb_next, - }; - - return namedtuple_make_new((const mp_obj_type_t *)&traceback_type_obj, 4, 0, elems); -}; - -mp_obj_t mp_obj_exception_get_traceback_obj(mp_obj_t self_in) { - mp_obj_exception_t *self = MP_OBJ_TO_PTR(self_in); - - if (!mp_obj_is_exception_instance(self)) { - return mp_const_none; - } - - size_t n, *values; - mp_obj_exception_get_traceback(self, &n, &values); - if (n == 0) { - return mp_const_none; - } - - mp_obj_t tb_next = mp_const_none; - - for (size_t i = 0; i < n; i += 3) { - tb_next = traceback_from_values(&values[i], tb_next); - } - - return tb_next; -} -#endif From a0ec6f8632191deaa5933155f133c0b165a7aa01 Mon Sep 17 00:00:00 2001 From: Jonny Bergdahl Date: Tue, 13 May 2025 07:51:25 +0200 Subject: [PATCH 72/76] More variations of "Wifi" spelling --- locale/circuitpython.pot | 4 ---- ports/raspberrypi/common-hal/wifi/Radio.c | 6 +++--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/locale/circuitpython.pot b/locale/circuitpython.pot index 97186c9c25e99..1c6fcce1d417a 100644 --- a/locale/circuitpython.pot +++ b/locale/circuitpython.pot @@ -2362,10 +2362,6 @@ msgstr "" msgid "WiFi is not enabled" msgstr "" -#: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "" - #: main.c msgid "Woken up by alarm.\n" msgstr "" diff --git a/ports/raspberrypi/common-hal/wifi/Radio.c b/ports/raspberrypi/common-hal/wifi/Radio.c index 69819639ba976..3c22c3548d191 100644 --- a/ports/raspberrypi/common-hal/wifi/Radio.c +++ b/ports/raspberrypi/common-hal/wifi/Radio.c @@ -157,7 +157,7 @@ mp_obj_t common_hal_wifi_radio_start_scanning_networks(wifi_radio_obj_t *self, u mp_raise_RuntimeError(MP_ERROR_TEXT("Already scanning for wifi networks")); } if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("Wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } wifi_scannednetworks_obj_t *scan = mp_obj_malloc(wifi_scannednetworks_obj_t, &wifi_scannednetworks_type); mp_obj_t args[] = { mp_const_empty_tuple, MP_OBJ_NEW_SMALL_INT(16) }; @@ -193,7 +193,7 @@ void common_hal_wifi_radio_stop_station(wifi_radio_obj_t *self) { void common_hal_wifi_radio_start_ap(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, uint32_t authmode, uint8_t max_connections) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("Wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } /* TODO: If the AP is stopped once it cannot be restarted. @@ -321,7 +321,7 @@ static bool connection_unchanged(wifi_radio_obj_t *self, const uint8_t *ssid, si wifi_radio_error_t common_hal_wifi_radio_connect(wifi_radio_obj_t *self, uint8_t *ssid, size_t ssid_len, uint8_t *password, size_t password_len, uint8_t channel, mp_float_t timeout, uint8_t *bssid, size_t bssid_len) { if (!common_hal_wifi_radio_get_enabled(self)) { - mp_raise_RuntimeError(MP_ERROR_TEXT("Wifi is not enabled")); + mp_raise_RuntimeError(MP_ERROR_TEXT("WiFi is not enabled")); } if (ssid_len > 32) { From efcaa1c2fffd4e59855accf2fb199eb147f9b0ec Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 13 May 2025 19:58:46 +0200 Subject: [PATCH 73/76] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: CircuitPython/main Translate-URL: https://hosted.weblate.org/projects/circuitpython/main/ --- locale/ID.po | 27 ++++++++++++++------------- locale/cs.po | 24 +++++++++++------------- locale/de_DE.po | 27 ++++++++++++++------------- locale/el.po | 16 ++++------------ locale/en_GB.po | 27 ++++++++++++++------------- locale/es.po | 27 ++++++++++++++------------- locale/fil.po | 19 +++++++------------ locale/fr.po | 27 ++++++++++++++------------- locale/hi.po | 16 ++++------------ locale/it_IT.po | 19 +++++++------------ locale/ja.po | 19 +++++++------------ locale/ko.po | 16 ++++------------ locale/nl.po | 19 +++++++------------ locale/pl.po | 19 +++++++------------ locale/pt_BR.po | 27 ++++++++++++++------------- locale/ru.po | 27 ++++++++++++++------------- locale/sv.po | 27 ++++++++++++++------------- locale/tr.po | 16 ++++------------ locale/zh_Latn_pinyin.po | 27 ++++++++++++++------------- 19 files changed, 188 insertions(+), 238 deletions(-) diff --git a/locale/ID.po b/locale/ID.po index 6155c9fd2626e..0eedaf07868d4 100644 --- a/locale/ID.po +++ b/locale/ID.po @@ -1113,7 +1113,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -2343,10 +2343,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "Tipe bus tampilan tidak didukung" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Format tidak didukung" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Algoritma hash tidak didukung" @@ -2409,9 +2405,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Wifi tidak diaktifkan" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -4441,12 +4439,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "wifi tidak diaktifkan" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4509,6 +4501,15 @@ msgstr "zi harus berjenis float" msgid "zi must be of shape (n_section, 2)" msgstr "Zi harus berbentuk (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Format tidak didukung" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Wifi tidak diaktifkan" + +#~ msgid "wifi is not enabled" +#~ msgstr "wifi tidak diaktifkan" + #~ msgid "Cannot remount '/' when visible via USB." #~ msgstr "Tidak dapat memasang kembali '/' saat terlihat melalui USB." diff --git a/locale/cs.po b/locale/cs.po index a996f27a2319d..f9e5f9f670350 100644 --- a/locale/cs.po +++ b/locale/cs.po @@ -1106,7 +1106,7 @@ msgstr "Pro barevný prostor L8 musí mít vstupní bitmapa 8 bitů na pixel" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "Pro barevný prostor RGB musí mít vstupní bitmapa 16 bitů na pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Formát není podporován" @@ -2324,10 +2324,6 @@ msgstr "Nepodporovaný barevný prostor" msgid "Unsupported display bus type" msgstr "Nepodporovaná sběrnice dispalye" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Nepodporovaný formát" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Nepodporovaný hash algoritmus" @@ -2389,9 +2385,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Wifi není povoleno" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -4421,12 +4419,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor není dostupný" @@ -4489,6 +4481,12 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Unsupported format" +#~ msgstr "Nepodporovaný formát" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Wifi není povoleno" + #~ msgid "Cannot remount '/' when visible via USB." #~ msgstr "Není možné znovu připojit '/', pokud je viditelné pomocí USB." diff --git a/locale/de_DE.po b/locale/de_DE.po index 5e7dc935b3c42..8d509153cbf2c 100644 --- a/locale/de_DE.po +++ b/locale/de_DE.po @@ -1113,7 +1113,7 @@ msgstr "Für den L8-Farbraum muss die Eingabe-Bitmap 8 Bit pro Pixel aufweisen" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "Für RGB-Farbräume muss die Eingabe-Bitmap 16 Bit pro Pixel haben" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Format nicht unterstützt" @@ -2353,10 +2353,6 @@ msgstr "Nicht unterstützter Farbraum" msgid "Unsupported display bus type" msgstr "Nicht unterstützter display bus type" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Nicht unterstütztes Format" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Hash Algorithmus wird nicht unterstützt" @@ -2421,9 +2417,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "WLAN ist nicht aktiviert" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -4483,12 +4481,6 @@ msgstr "Gewichte müssen ein Objekt des Typs %q, %q, %q, or %q, not %q sein " msgid "width must be greater than zero" msgstr "Breite muss größer als 0 sein" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "wifi ist nicht aktiviert" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor nicht verfügbar" @@ -4551,6 +4543,15 @@ msgstr "zi muss eine Gleitkommazahl sein" msgid "zi must be of shape (n_section, 2)" msgstr "zi muss die Form (n_section, 2) haben" +#~ msgid "Unsupported format" +#~ msgstr "Nicht unterstütztes Format" + +#~ msgid "Wifi is not enabled" +#~ msgstr "WLAN ist nicht aktiviert" + +#~ msgid "wifi is not enabled" +#~ msgstr "wifi ist nicht aktiviert" + #~ msgid "Cannot remount '/' when visible via USB." #~ msgstr "'/' kann nicht wiedereingehängt werden, wenn per USB sichtbar." diff --git a/locale/el.po b/locale/el.po index fa52089a3cafd..8eb66311bd74a 100644 --- a/locale/el.po +++ b/locale/el.po @@ -1114,7 +1114,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -2328,10 +2328,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2388,8 +2384,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -4420,12 +4418,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" diff --git a/locale/en_GB.po b/locale/en_GB.po index c0481af6c0420..f62a09e1db378 100644 --- a/locale/en_GB.po +++ b/locale/en_GB.po @@ -1106,7 +1106,7 @@ msgstr "For L8 colourspace, input bitmap must have 8 bits per pixel" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "For RGB colourspaces, input bitmap must have 16 bits per pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Format not supported" @@ -2328,10 +2328,6 @@ msgstr "Unsupported colourspace" msgid "Unsupported display bus type" msgstr "Unsupported display bus type" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Unsupported format" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Unsupported hash algorithm" @@ -2393,9 +2389,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -4430,12 +4428,6 @@ msgstr "weights must be an object of type %q, %q, %q, or %q, not %q " msgid "width must be greater than zero" msgstr "width must be greater than zero" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "WiFi is not enabled" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor not available" @@ -4498,6 +4490,15 @@ msgstr "zi must be of float type" msgid "zi must be of shape (n_section, 2)" msgstr "zi must be of shape (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Unsupported format" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Wifi is not enabled" + +#~ msgid "wifi is not enabled" +#~ msgstr "WiFi is not enabled" + #~ msgid "Cannot remount '/' when visible via USB." #~ msgstr "Cannot remount '/' when visible via USB." diff --git a/locale/es.po b/locale/es.po index 19892fbdca741..065782c2b07e6 100644 --- a/locale/es.po +++ b/locale/es.po @@ -1120,7 +1120,7 @@ msgstr "" "Para espacios de colores RGB, el bitmap de entrada debe tener 16 bits por " "pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Sin capacidades para el formato" @@ -2364,10 +2364,6 @@ msgstr "Espacio de color no sportado" msgid "Unsupported display bus type" msgstr "Sin capacidad de bus tipo display" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Formato no soportado" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Algoritmo hash no soportado" @@ -2430,9 +2426,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Wifi no esta activado" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -4477,12 +4475,6 @@ msgstr "los pesos deben ser un tipo de objetos %q, %q, %q, or %q, y no %q. " msgid "width must be greater than zero" msgstr "el ancho debe ser mayor que cero" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "wifi no esta habilitado" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor no esta disponible" @@ -4545,6 +4537,15 @@ msgstr "zi debe ser de tipo flotante" msgid "zi must be of shape (n_section, 2)" msgstr "zi debe ser una forma (n_section,2)" +#~ msgid "Unsupported format" +#~ msgstr "Formato no soportado" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Wifi no esta activado" + +#~ msgid "wifi is not enabled" +#~ msgstr "wifi no esta habilitado" + #~ msgid "Cannot remount '/' when visible via USB." #~ msgstr "No se puede remountar '/' cuanto se es visible vía USB." diff --git a/locale/fil.po b/locale/fil.po index 51fae18079231..3069ed78c1dd5 100644 --- a/locale/fil.po +++ b/locale/fil.po @@ -1100,7 +1100,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -2319,10 +2319,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "Hindi supportadong tipo ng bitmap" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Hindi supportadong format" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2379,8 +2375,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -4424,12 +4422,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4492,6 +4484,9 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Unsupported format" +#~ msgstr "Hindi supportadong format" + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "Dapat sunurin ng Data chunk ang fmt chunk" diff --git a/locale/fr.po b/locale/fr.po index 33ba163d6fc1a..e7516a609da30 100644 --- a/locale/fr.po +++ b/locale/fr.po @@ -1127,7 +1127,7 @@ msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" "Pour l'espace de couleur RVB, l'image d'entrée doit avoir 16 bits par pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Format non supporté" @@ -2374,10 +2374,6 @@ msgstr "Espace de couleur non supporté" msgid "Unsupported display bus type" msgstr "Type de bus d'affichage non supporté" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Format non pris en charge" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Algorithme de hachage non supporté" @@ -2439,9 +2435,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi : " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Le WiFi n'est pas activé" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -4497,12 +4495,6 @@ msgstr "le poids requier un objet de type %q, %q, %q ou %q, pas %q. " msgid "width must be greater than zero" msgstr "width doit être plus grand que zero" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "le WiFi est inactif" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor indisponible" @@ -4565,6 +4557,15 @@ msgstr "zi doit être de type float" msgid "zi must be of shape (n_section, 2)" msgstr "zi doit être de forme (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Format non pris en charge" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Le WiFi n'est pas activé" + +#~ msgid "wifi is not enabled" +#~ msgstr "le WiFi est inactif" + #~ msgid "Cannot remount '/' when visible via USB." #~ msgstr "" #~ "Ne peut démonter '/' la racine du système de fichier quand elle est déja " diff --git a/locale/hi.po b/locale/hi.po index d35bd73452587..abffcfe88cb52 100644 --- a/locale/hi.po +++ b/locale/hi.po @@ -1090,7 +1090,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -2302,10 +2302,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2362,8 +2358,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -4394,12 +4392,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" diff --git a/locale/it_IT.po b/locale/it_IT.po index c1a1d65552080..7ef52213ced3d 100644 --- a/locale/it_IT.po +++ b/locale/it_IT.po @@ -1098,7 +1098,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "" @@ -2317,10 +2317,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "tipo di bitmap non supportato" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Formato non supportato" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2377,8 +2373,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -4426,12 +4424,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4494,6 +4486,9 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Unsupported format" +#~ msgstr "Formato non supportato" + #~ msgid "Buffer length must be a multiple of 512" #~ msgstr "La lunghezza del buffer deve essere un multiplo di 512" diff --git a/locale/ja.po b/locale/ja.po index 0b6db3d762499..ef29c947b1316 100644 --- a/locale/ja.po +++ b/locale/ja.po @@ -1107,7 +1107,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "非対応の形式" @@ -2325,10 +2325,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "非対応の形式" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2385,8 +2381,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -4422,12 +4420,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4490,6 +4482,9 @@ msgstr "ziはfloat値でなければなりません" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Unsupported format" +#~ msgstr "非対応の形式" + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "fmtチャンクの後にdataチャンクが続かなければなりません" diff --git a/locale/ko.po b/locale/ko.po index b957b326585f2..a06ff26372503 100644 --- a/locale/ko.po +++ b/locale/ko.po @@ -1140,7 +1140,7 @@ msgstr "L8 색상 공간의 경우, 입력 비트맵은 픽셀 당 8 비트를 msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "RGB 색상 공간의 경우, 입력 비트맵은 픽셀 당 16 비트를 가져야 합니다" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "지원되지 않는 형식입니다" @@ -2378,10 +2378,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2438,8 +2434,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -4470,12 +4468,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" diff --git a/locale/nl.po b/locale/nl.po index dae31967559f6..ade9593a2cea1 100644 --- a/locale/nl.po +++ b/locale/nl.po @@ -1093,7 +1093,7 @@ msgstr "" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Formaat wordt niet ondersteund" @@ -2316,10 +2316,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "Niet-ondersteund beeldscherm bus type" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Niet-ondersteunde format" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2378,8 +2374,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -4416,12 +4414,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "breedte moet groter dan nul zijn" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4484,6 +4476,9 @@ msgstr "zi moet van type float zijn" msgid "zi must be of shape (n_section, 2)" msgstr "zi moet vorm (n_section, 2) hebben" +#~ msgid "Unsupported format" +#~ msgstr "Niet-ondersteunde format" + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "Data chunk moet gevolgd worden door fmt chunk" diff --git a/locale/pl.po b/locale/pl.po index 8040dbcf02948..0c565f72d8d1c 100644 --- a/locale/pl.po +++ b/locale/pl.po @@ -1110,7 +1110,7 @@ msgstr "" "W bitmapie wejściowej dla przestrzeni kolorów RGB piksel musi składać się z " "16 bitów" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Nie wspierany format" @@ -2330,10 +2330,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "Zły typ magistrali wyświetlaczy" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Zły format" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2390,8 +2386,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -4424,12 +4422,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "szerokość musi być większa niż zero" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" @@ -4492,6 +4484,9 @@ msgstr "" msgid "zi must be of shape (n_section, 2)" msgstr "" +#~ msgid "Unsupported format" +#~ msgstr "Zły format" + #~ msgid "Data chunk must follow fmt chunk" #~ msgstr "Fragment danych musi następować po fragmencie fmt" diff --git a/locale/pt_BR.po b/locale/pt_BR.po index 768bf107f280b..a1b6b9ff5c6b5 100644 --- a/locale/pt_BR.po +++ b/locale/pt_BR.po @@ -1118,7 +1118,7 @@ msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" "Para espaços de cor RGB, o bitmap da entrada deve ter 16 bits por pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "O formato não é suportado" @@ -2368,10 +2368,6 @@ msgstr "Espaço de cor não compatível" msgid "Unsupported display bus type" msgstr "Não há suporte para o tipo do display bus" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Formato não suportado" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Sem compatibilidade com o algoritmo de hash" @@ -2435,9 +2431,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "O Wi-Fi não está ativado" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -4491,12 +4489,6 @@ msgstr "os pesos devem ser um objeto do tipo %q, %q, %q ou %q, e não %q " msgid "width must be greater than zero" msgstr "a largura deve ser maior que zero" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "o wifi não está ativo" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "O wifi.Monitor não está disponível" @@ -4559,6 +4551,15 @@ msgstr "zi deve ser de um tipo float" msgid "zi must be of shape (n_section, 2)" msgstr "zi deve estar na forma (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Formato não suportado" + +#~ msgid "Wifi is not enabled" +#~ msgstr "O Wi-Fi não está ativado" + +#~ msgid "wifi is not enabled" +#~ msgstr "o wifi não está ativo" + #~ msgid "Cannot remount '/' when visible via USB." #~ msgstr "Não é possível montar '/' quando estiver visível pelo USB." diff --git a/locale/ru.po b/locale/ru.po index c94b9698d3547..d2e11451a0d7d 100644 --- a/locale/ru.po +++ b/locale/ru.po @@ -1123,7 +1123,7 @@ msgstr "" "Для цветовых пространств RGB входное растровое изображение должно иметь 16 " "бит на пиксель" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Формат не поддерживается" @@ -2361,10 +2361,6 @@ msgstr "Неподдерживаемое цветовое пространств msgid "Unsupported display bus type" msgstr "Неподдерживаемый тип шины дисплея" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Неподдерживаемый формат" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Неподдерживаемый алгоритм хеширования" @@ -2428,9 +2424,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "Wifi не включен" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -4488,12 +4486,6 @@ msgstr "Веса должны быть объектом типа %q, %q, %q ил msgid "width must be greater than zero" msgstr "ширина должна быть больше нуля" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "Wi-Fi не включен" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "Wi-Fi. Монитор недоступен" @@ -4556,6 +4548,15 @@ msgstr "zi должно быть типа float" msgid "zi must be of shape (n_section, 2)" msgstr "zi должен иметь форму (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Неподдерживаемый формат" + +#~ msgid "Wifi is not enabled" +#~ msgstr "Wifi не включен" + +#~ msgid "wifi is not enabled" +#~ msgstr "Wi-Fi не включен" + #~ msgid "Cannot remount '/' when visible via USB." #~ msgstr "Невозможно перемонтировать '/' пока он виден через USB." diff --git a/locale/sv.po b/locale/sv.po index e489cc603e32c..12920f465c866 100644 --- a/locale/sv.po +++ b/locale/sv.po @@ -1111,7 +1111,7 @@ msgstr "För L8-färgrymden måste indatabitmappen ha 8 bitar per pixel" msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "För RGB-färgrymder måste indatabitmappen ha 16 bitar per pixel" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Format stöds inte" @@ -2340,10 +2340,6 @@ msgstr "Färgrymd stöds inte" msgid "Unsupported display bus type" msgstr "Busstyp för display stöds inte" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Format stöds inte" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "Hash-algoritmen stöds inte" @@ -2405,9 +2401,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "WiFi är inte aktiverat" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -4446,12 +4444,6 @@ msgstr "Vikter måste vara ett objekt av typen %q, %q, %q eller %q, inte %q " msgid "width must be greater than zero" msgstr "width måste vara större än noll" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "WiFi är inte aktiverat" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wifi.Monitor är inte tillgänglig" @@ -4514,6 +4506,15 @@ msgstr "zi måste vara av typ float" msgid "zi must be of shape (n_section, 2)" msgstr "zi måste vara i formen (n_section, 2)" +#~ msgid "Unsupported format" +#~ msgstr "Format stöds inte" + +#~ msgid "Wifi is not enabled" +#~ msgstr "WiFi är inte aktiverat" + +#~ msgid "wifi is not enabled" +#~ msgstr "WiFi är inte aktiverat" + #~ msgid "Cannot remount '/' when visible via USB." #~ msgstr "Det går inte att montera om '/' när den är synlig via USB." diff --git a/locale/tr.po b/locale/tr.po index 704b3598521ad..30c8f3d107f71 100644 --- a/locale/tr.po +++ b/locale/tr.po @@ -1106,7 +1106,7 @@ msgid "For RGB colorspaces, input bitmap must have 16 bits per pixel" msgstr "" "RGB renk uzayı için, giriş bitmap'i piksel başına 16 bayta sahip olmalıdır" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Format desteklenmiyor" @@ -2324,10 +2324,6 @@ msgstr "" msgid "Unsupported display bus type" msgstr "" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "" @@ -2384,8 +2380,10 @@ msgstr "" msgid "Wi-Fi: " msgstr "" +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" msgstr "" #: main.c @@ -4416,12 +4414,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "" diff --git a/locale/zh_Latn_pinyin.po b/locale/zh_Latn_pinyin.po index 57bb73e6e8ec6..85eb703d4db01 100644 --- a/locale/zh_Latn_pinyin.po +++ b/locale/zh_Latn_pinyin.po @@ -1115,7 +1115,7 @@ msgstr "" "zài GRB sè yù zhōng, měi gè shū rù de xiàng sù bì xū shì 16 wèi (16 bit) shù " "jù" -#: ports/cxd56/common-hal/camera/Camera.c +#: ports/cxd56/common-hal/camera/Camera.c shared-module/audiocore/WaveFile.c msgid "Format not supported" msgstr "Bù zhīyuán géshì" @@ -2346,10 +2346,6 @@ msgstr "bú zhī chí de sè cǎi kōng jiān" msgid "Unsupported display bus type" msgstr "Bù zhīchí de gōnggòng qìchē lèixíng" -#: shared-module/audiocore/WaveFile.c -msgid "Unsupported format" -msgstr "Bù zhīchí de géshì" - #: shared-bindings/hashlib/__init__.c msgid "Unsupported hash algorithm" msgstr "bù zhīchí de hā xī suànfǎ" @@ -2411,9 +2407,11 @@ msgstr "" msgid "Wi-Fi: " msgstr "Wi-Fi: " +#: ports/espressif/common-hal/wifi/Radio.c #: ports/raspberrypi/common-hal/wifi/Radio.c -msgid "Wifi is not enabled" -msgstr "wú xiàn wǎng luò wèi qǐ yòng" +#: ports/zephyr-cp/common-hal/wifi/Radio.c +msgid "WiFi is not enabled" +msgstr "" #: main.c msgid "Woken up by alarm.\n" @@ -4456,12 +4454,6 @@ msgstr "" msgid "width must be greater than zero" msgstr "kuāndù bìxū dàyú líng" -#: ports/espressif/common-hal/wifi/Radio.c -#: ports/raspberrypi/common-hal/wifi/Radio.c -#: ports/zephyr-cp/common-hal/wifi/Radio.c -msgid "wifi is not enabled" -msgstr "wèi qǐ yòng WIFI" - #: ports/raspberrypi/common-hal/wifi/Monitor.c msgid "wifi.Monitor not available" msgstr "wú xiàn wǎng luò xiǎn shì qì bù kě yòng" @@ -4524,6 +4516,15 @@ msgstr "zi bìxū wèi fú diǎn xíng" msgid "zi must be of shape (n_section, 2)" msgstr "zi bìxū jùyǒu xíngzhuàng (n_section,2)" +#~ msgid "Unsupported format" +#~ msgstr "Bù zhīchí de géshì" + +#~ msgid "Wifi is not enabled" +#~ msgstr "wú xiàn wǎng luò wèi qǐ yòng" + +#~ msgid "wifi is not enabled" +#~ msgstr "wèi qǐ yòng WIFI" + #~ msgid "Cannot remount '/' when visible via USB." #~ msgstr "tōngguò USB kějiàn shí wúfǎ chóngxīn ānzhuāng '/'." From 0f6d71ac09960a4c854d2f97c68104e5429e4246 Mon Sep 17 00:00:00 2001 From: Emmanuel Ferdman Date: Wed, 14 May 2025 10:55:23 -0700 Subject: [PATCH 74/76] Resolve Python Logger warnings Signed-off-by: Emmanuel Ferdman --- conf.py | 4 ++-- ports/zephyr-cp/cptools/cpbuild.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf.py b/conf.py index 7555540174742..34436c09020e3 100644 --- a/conf.py +++ b/conf.py @@ -434,11 +434,11 @@ def generate_redirects(app): return if not isinstance(app.builder, builders.StandaloneHTMLBuilder): - logging.warn( + logging.warning( "The 'sphinxcontib-redirects' plugin is only supported " "by the 'html' builder and subclasses. Skipping..." ) - logging.warn(f"Builder is {app.builder.name} ({type(app.builder)})") + logging.warning(f"Builder is {app.builder.name} ({type(app.builder)})") return with open(path) as redirects: diff --git a/ports/zephyr-cp/cptools/cpbuild.py b/ports/zephyr-cp/cptools/cpbuild.py index 335234b8c761f..ef836b3df8af3 100644 --- a/ports/zephyr-cp/cptools/cpbuild.py +++ b/ports/zephyr-cp/cptools/cpbuild.py @@ -24,7 +24,7 @@ LAST_BUILD_TIMES = json.load(f) logger.info("Build times loaded.") else: - logger.warn( + logger.warning( "No last build times found. This is normal if you're running this for the first time." ) From 1f4d1cff853e177228bd1736886f6cda3fe740d2 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Tue, 22 Apr 2025 11:38:17 -0700 Subject: [PATCH 75/76] Update tinyusb to improve direct USB host These changes improve direct USB host on RP2350 in particular. --- lib/tinyusb | 2 +- ports/raspberrypi/lib/Pico-PIO-USB | 2 +- shared-module/usb/core/Device.c | 33 +++++++++++++++++++----------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/lib/tinyusb b/lib/tinyusb index 60e6d53d10082..542e5b4550a01 160000 --- a/lib/tinyusb +++ b/lib/tinyusb @@ -1 +1 @@ -Subproject commit 60e6d53d10082df884819c3958e621a2e1e0a214 +Subproject commit 542e5b4550a01d034b78308d77c408ed89427513 diff --git a/ports/raspberrypi/lib/Pico-PIO-USB b/ports/raspberrypi/lib/Pico-PIO-USB index 7e1c086ba865a..032a469e79f6a 160000 --- a/ports/raspberrypi/lib/Pico-PIO-USB +++ b/ports/raspberrypi/lib/Pico-PIO-USB @@ -1 +1 @@ -Subproject commit 7e1c086ba865aa5918419193bb19855cd69ffc30 +Subproject commit 032a469e79f6a4ba40760d7868e6db26e15002d7 diff --git a/shared-module/usb/core/Device.c b/shared-module/usb/core/Device.c index 0a52b925facf1..c9df0cf73805f 100644 --- a/shared-module/usb/core/Device.c +++ b/shared-module/usb/core/Device.c @@ -154,33 +154,42 @@ mp_obj_t common_hal_usb_core_device_get_manufacturer(usb_core_device_obj_t *self mp_int_t common_hal_usb_core_device_get_bus(usb_core_device_obj_t *self) { - hcd_devtree_info_t devtree; - hcd_devtree_get_info(self->device_address, &devtree); - return devtree.rhport; + tuh_bus_info_t bus_info; + if (!tuh_bus_info_get(self->device_address, &bus_info)) { + return 0; + } + return bus_info.rhport; } mp_obj_t common_hal_usb_core_device_get_port_numbers(usb_core_device_obj_t *self) { - hcd_devtree_info_t devtree; - hcd_devtree_get_info(self->device_address, &devtree); - if (devtree.hub_addr == 0) { + tuh_bus_info_t bus_info; + if (!tuh_bus_info_get(self->device_address, &bus_info)) { + return mp_const_none; + } + if (bus_info.hub_addr == 0) { return mp_const_none; } // USB allows for 5 hubs deep chaining. So we're at most 5 ports deep. mp_obj_t ports[5]; size_t port_count = 0; - while (devtree.hub_addr != 0 && port_count < MP_ARRAY_SIZE(ports)) { + tuh_bus_info_t current_bus_info = bus_info; + while (current_bus_info.hub_addr != 0 && port_count < MP_ARRAY_SIZE(ports)) { // Reverse the order of the ports so most downstream comes last. - ports[MP_ARRAY_SIZE(ports) - 1 - port_count] = MP_OBJ_NEW_SMALL_INT(devtree.hub_port); + ports[MP_ARRAY_SIZE(ports) - 1 - port_count] = MP_OBJ_NEW_SMALL_INT(current_bus_info.hub_port); port_count++; - hcd_devtree_get_info(devtree.hub_addr, &devtree); + if (!tuh_bus_info_get(current_bus_info.hub_addr, ¤t_bus_info)) { + break; + } } return mp_obj_new_tuple(port_count, ports + (MP_ARRAY_SIZE(ports) - port_count)); } mp_int_t common_hal_usb_core_device_get_speed(usb_core_device_obj_t *self) { - hcd_devtree_info_t devtree; - hcd_devtree_get_info(self->device_address, &devtree); - switch (devtree.speed) { + tuh_bus_info_t bus_info; + if (!tuh_bus_info_get(self->device_address, &bus_info)) { + return 0; + } + switch (bus_info.speed) { case TUSB_SPEED_HIGH: return PYUSB_SPEED_HIGH; case TUSB_SPEED_FULL: From 86c5680ea4646c405acd8b1fee02e59bdaec8e0b Mon Sep 17 00:00:00 2001 From: Dan Halbert Date: Wed, 14 May 2025 14:38:32 -0400 Subject: [PATCH 76/76] nordic: don't confuse microcontroller.reset() with deep sleep wakeup --- ports/nordic/common-hal/microcontroller/__init__.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ports/nordic/common-hal/microcontroller/__init__.c b/ports/nordic/common-hal/microcontroller/__init__.c index 86e7916d754a8..38a3b1ee60938 100644 --- a/ports/nordic/common-hal/microcontroller/__init__.c +++ b/ports/nordic/common-hal/microcontroller/__init__.c @@ -8,6 +8,10 @@ #include "py/obj.h" #include "py/runtime.h" +#if CIRCUITPY_ALARM +#include "common-hal/alarm/__init__.h" +#endif + #include "common-hal/microcontroller/Pin.h" #include "common-hal/microcontroller/Processor.h" @@ -78,6 +82,14 @@ void common_hal_mcu_on_next_reset(mcu_runmode_t runmode) { void common_hal_mcu_reset(void) { filesystem_flush(); + + // Clear any saved info about last deep sleep wakeup, + // to avoid confusing this software reset with a real deep sleep reset. + // See logic in common_hal_mcu_processor_get_reset_reason(). + #if CIRCUITPY_ALARM + sleepmem_wakeup_event = SLEEPMEM_WAKEUP_BY_NONE; + #endif + reset_cpu(); }