diff --git a/ports/zephyr-cp/boards/adafruit/feather_nrf52840_sense_zephyr/autogen_board_info.toml b/ports/zephyr-cp/boards/adafruit/feather_nrf52840_sense_zephyr/autogen_board_info.toml index 69896f950b56b..d6aca312226ea 100644 --- a/ports/zephyr-cp/boards/adafruit/feather_nrf52840_sense_zephyr/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/adafruit/feather_nrf52840_sense_zephyr/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false diff --git a/ports/zephyr-cp/boards/adafruit/feather_nrf52840_zephyr/autogen_board_info.toml b/ports/zephyr-cp/boards/adafruit/feather_nrf52840_zephyr/autogen_board_info.toml index 8cd4a71e3fec2..dafe7811779e1 100644 --- a/ports/zephyr-cp/boards/adafruit/feather_nrf52840_zephyr/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/adafruit/feather_nrf52840_zephyr/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false diff --git a/ports/zephyr-cp/boards/adafruit/feather_rp2040_zephyr/autogen_board_info.toml b/ports/zephyr-cp/boards/adafruit/feather_rp2040_zephyr/autogen_board_info.toml index 33e54d0f7a9f4..cecf8e55a8397 100644 --- a/ports/zephyr-cp/boards/adafruit/feather_rp2040_zephyr/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/adafruit/feather_rp2040_zephyr/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/boards/native/native_sim/autogen_board_info.toml b/ports/zephyr-cp/boards/native/native_sim/autogen_board_info.toml index 9ad5fa7849dc4..4cc9f3e934c95 100644 --- a/ports/zephyr-cp/boards/native/native_sim/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/native/native_sim/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true # Zephyr networking enabled hostnetwork = true # Zephyr board has hostnetwork @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = true # Zephyr networking enabled is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false diff --git a/ports/zephyr-cp/boards/native/nrf5340bsim/autogen_board_info.toml b/ports/zephyr-cp/boards/native/nrf5340bsim/autogen_board_info.toml index 19432b2dc1bc7..aa723b53f6461 100644 --- a/ports/zephyr-cp/boards/native/nrf5340bsim/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/native/nrf5340bsim/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml index 8f7bdba94bd52..ee20efa6feec5 100644 --- a/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nordic/nrf5340dk/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false diff --git a/ports/zephyr-cp/boards/nordic/nrf54h20dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf54h20dk/autogen_board_info.toml index 9b4d993369759..ca2c90ceb0b79 100644 --- a/ports/zephyr-cp/boards/nordic/nrf54h20dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nordic/nrf54h20dk/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = false # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = false +jpegio = false # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -99,7 +99,7 @@ struct = true supervisor = true synthio = false terminalio = true # Zephyr board has busio -tilepalettemapper = true # Zephyr board has busio +tilepalettemapper = false # Zephyr board has busio time = true touchio = false traceback = true diff --git a/ports/zephyr-cp/boards/nordic/nrf54h20dk/circuitpython.toml b/ports/zephyr-cp/boards/nordic/nrf54h20dk/circuitpython.toml index 010ae9953e432..415c471b3d41c 100644 --- a/ports/zephyr-cp/boards/nordic/nrf54h20dk/circuitpython.toml +++ b/ports/zephyr-cp/boards/nordic/nrf54h20dk/circuitpython.toml @@ -1,2 +1,2 @@ CIRCUITPY_BUILD_EXTENSIONS = ["elf"] -DISABLED_MODULES=["jpegio"] +DISABLED_MODULES=["jpegio", "gifio", "tilepalettemapper"] diff --git a/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml index e13fba484b8e6..69fdc2da903c0 100644 --- a/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nordic/nrf54l15dk/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false diff --git a/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml b/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml index 54e2b89d638a2..e0b759e01cec0 100644 --- a/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nordic/nrf7002dk/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = false # Zephyr board has busio gnss = false hashlib = true # Zephyr networking enabled hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = true # Zephyr networking enabled is31fl3741 = false -jpegio = false +jpegio = false # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -99,7 +99,7 @@ struct = true supervisor = true synthio = false terminalio = true # Zephyr board has busio -tilepalettemapper = true # Zephyr board has busio +tilepalettemapper = false # Zephyr board has busio time = true touchio = false traceback = true diff --git a/ports/zephyr-cp/boards/nordic/nrf7002dk/circuitpython.toml b/ports/zephyr-cp/boards/nordic/nrf7002dk/circuitpython.toml index b64fd8756a72d..761d263147741 100644 --- a/ports/zephyr-cp/boards/nordic/nrf7002dk/circuitpython.toml +++ b/ports/zephyr-cp/boards/nordic/nrf7002dk/circuitpython.toml @@ -2,4 +2,4 @@ CIRCUITPY_BUILD_EXTENSIONS = ["elf"] USB_VID=0x239A USB_PID=0x8168 BLOBS=["nrf_wifi"] -DISABLED_MODULES=["aesio", "adafruit_bus_device", "zlib", "jpegio"] +DISABLED_MODULES=["aesio", "adafruit_bus_device", "zlib", "jpegio", "tilepalettemapper", "gifio"] diff --git a/ports/zephyr-cp/boards/nxp/frdm_mcxn947/autogen_board_info.toml b/ports/zephyr-cp/boards/nxp/frdm_mcxn947/autogen_board_info.toml index d4f903e515859..b8e2c0601aa8f 100644 --- a/ports/zephyr-cp/boards/nxp/frdm_mcxn947/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nxp/frdm_mcxn947/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false diff --git a/ports/zephyr-cp/boards/nxp/frdm_rw612/autogen_board_info.toml b/ports/zephyr-cp/boards/nxp/frdm_rw612/autogen_board_info.toml index 659089d20ad4e..557b4f0448f80 100644 --- a/ports/zephyr-cp/boards/nxp/frdm_rw612/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nxp/frdm_rw612/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true # Zephyr networking enabled hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = true # Zephyr networking enabled is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = true # Zephyr networking enabled spitarget = false ssl = true # Zephyr networking enabled -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/boards/nxp/mimxrt1170_evk/autogen_board_info.toml b/ports/zephyr-cp/boards/nxp/mimxrt1170_evk/autogen_board_info.toml index a5f343c76913f..ee43ef86e8c2e 100644 --- a/ports/zephyr-cp/boards/nxp/mimxrt1170_evk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/nxp/mimxrt1170_evk/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false -storage = false +storage = true struct = true supervisor = true synthio = true # Zephyr board has audiobusio diff --git a/ports/zephyr-cp/boards/raspberrypi/rpi_pico2_w_zephyr/autogen_board_info.toml b/ports/zephyr-cp/boards/raspberrypi/rpi_pico2_w_zephyr/autogen_board_info.toml index ba59347f21eed..2215bcf4135d3 100644 --- a/ports/zephyr-cp/boards/raspberrypi/rpi_pico2_w_zephyr/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/raspberrypi/rpi_pico2_w_zephyr/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true # Zephyr networking enabled hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = true # Zephyr networking enabled is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = true # Zephyr networking enabled spitarget = false ssl = true # Zephyr networking enabled -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/boards/raspberrypi/rpi_pico2_zephyr/autogen_board_info.toml b/ports/zephyr-cp/boards/raspberrypi/rpi_pico2_zephyr/autogen_board_info.toml index 138f7f14e4d33..6132404209261 100644 --- a/ports/zephyr-cp/boards/raspberrypi/rpi_pico2_zephyr/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/raspberrypi/rpi_pico2_zephyr/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/boards/raspberrypi/rpi_pico_w_zephyr/autogen_board_info.toml b/ports/zephyr-cp/boards/raspberrypi/rpi_pico_w_zephyr/autogen_board_info.toml index f0b10b59783db..203f5fd7048d0 100644 --- a/ports/zephyr-cp/boards/raspberrypi/rpi_pico_w_zephyr/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/raspberrypi/rpi_pico_w_zephyr/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true # Zephyr networking enabled hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = true # Zephyr networking enabled is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = true # Zephyr networking enabled spitarget = false ssl = true # Zephyr networking enabled -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/boards/raspberrypi/rpi_pico_zephyr/autogen_board_info.toml b/ports/zephyr-cp/boards/raspberrypi/rpi_pico_zephyr/autogen_board_info.toml index 647d9ee9ac3b7..13c77bf292884 100644 --- a/ports/zephyr-cp/boards/raspberrypi/rpi_pico_zephyr/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/raspberrypi/rpi_pico_zephyr/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/boards/renesas/da14695_dk_usb/autogen_board_info.toml b/ports/zephyr-cp/boards/renesas/da14695_dk_usb/autogen_board_info.toml index f4d6dee7f8a60..e596ea1aebcf7 100644 --- a/ports/zephyr-cp/boards/renesas/da14695_dk_usb/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/renesas/da14695_dk_usb/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml b/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml index ff95cc49b424b..7751ec96715d8 100644 --- a/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/renesas/ek_ra6m5/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false diff --git a/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml b/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml index 41d8923524263..42bef11db0c29 100644 --- a/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/renesas/ek_ra8d1/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false diff --git a/ports/zephyr-cp/boards/st/nucleo_n657x0_q/autogen_board_info.toml b/ports/zephyr-cp/boards/st/nucleo_n657x0_q/autogen_board_info.toml index 5611f62e33efd..7ad9c4f211105 100644 --- a/ports/zephyr-cp/boards/st/nucleo_n657x0_q/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/st/nucleo_n657x0_q/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml b/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml index 2ad6616e2bab1..2796f76782f38 100644 --- a/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/st/nucleo_u575zi_q/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/boards/st/stm32h750b_dk/autogen_board_info.toml b/ports/zephyr-cp/boards/st/stm32h750b_dk/autogen_board_info.toml index ba7593fbc33fd..2d5385d90b2c9 100644 --- a/ports/zephyr-cp/boards/st/stm32h750b_dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/st/stm32h750b_dk/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false diff --git a/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml b/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml index 1cd4ca1a87f22..7f158d6f278ad 100644 --- a/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/st/stm32h7b3i_dk/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false diff --git a/ports/zephyr-cp/boards/st/stm32wba65i_dk1/autogen_board_info.toml b/ports/zephyr-cp/boards/st/stm32wba65i_dk1/autogen_board_info.toml index 9751aea8fc693..19141f3006598 100644 --- a/ports/zephyr-cp/boards/st/stm32wba65i_dk1/autogen_board_info.toml +++ b/ports/zephyr-cp/boards/st/stm32wba65i_dk1/autogen_board_info.toml @@ -48,7 +48,7 @@ fourwire = true # Zephyr board has busio framebufferio = true # Zephyr board has busio frequencyio = false getpass = true -gifio = false +gifio = true # Zephyr board has busio gnss = false hashlib = true hostnetwork = false @@ -58,7 +58,7 @@ i2ctarget = false imagecapture = false ipaddress = false is31fl3741 = false -jpegio = true +jpegio = true # Zephyr board has busio keypad = false keypad_demux = false locale = false @@ -94,7 +94,7 @@ sharpdisplay = true # Zephyr board has busio socketpool = false spitarget = false ssl = false -storage = false +storage = true struct = true supervisor = true synthio = false diff --git a/ports/zephyr-cp/cptools/build_circuitpython.py b/ports/zephyr-cp/cptools/build_circuitpython.py index 8ff210def0fcd..0a37ad159385f 100644 --- a/ports/zephyr-cp/cptools/build_circuitpython.py +++ b/ports/zephyr-cp/cptools/build_circuitpython.py @@ -66,7 +66,7 @@ "zlib", "adafruit_bus_device", "getpass", - "jpegio", + "storage", ] # Flags that don't match with with a *bindings module. Some used by adafruit_requests MPCONFIG_FLAGS = ["array", "errno", "io", "json", "math"] @@ -96,6 +96,8 @@ "lvfontio", "tilepalettemapper", "fontio", + "gifio", + "jpegio", ], "sharpdisplay": ["framebufferio"], "framebufferio": ["displayio"], @@ -121,6 +123,7 @@ "lib/uzlib/crc32.c", ], "jpegio": ["lib/tjpgd/src/tjpgd.c"], + "gifio": ["lib/AnimatedGIF/gif.c"], } SHARED_MODULE_AND_COMMON_HAL = ["_bleio", "os", "rotaryio"] diff --git a/ports/zephyr-cp/tests/test_storage.py b/ports/zephyr-cp/tests/test_storage.py new file mode 100644 index 0000000000000..33e63e5ea85df --- /dev/null +++ b/ports/zephyr-cp/tests/test_storage.py @@ -0,0 +1,162 @@ +# SPDX-FileCopyrightText: 2026 Tim Cocks for Adafruit Industries +# SPDX-License-Identifier: MIT + +"""Test the `storage` core module on native_sim.""" + +import pytest + + +REMOUNT_READWRITE_CODE = """\ +import storage +storage.remount("/", readonly=False) +with open("/rw.txt", "w") as f: + f.write("writable") +with open("/rw.txt", "r") as f: + print(f"content: {f.read()}") +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": REMOUNT_READWRITE_CODE}) +def test_storage_remount_readwrite(circuitpython): + """remount with readonly=False allows writes to /.""" + circuitpython.wait_until_done() + output = circuitpython.serial.all_output + assert "content: writable" in output + assert "done" in output + + +REMOUNT_READONLY_CODE = """\ +import storage +storage.remount("/", readonly=True) +try: + with open("/should_fail.txt", "w") as f: + f.write("nope") + print("unexpected: write succeeded") +except OSError as e: + print(f"caught OSError: errno={e.errno}") +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": REMOUNT_READONLY_CODE}) +def test_storage_remount_readonly_blocks_writes(circuitpython): + """remount with readonly=True prevents writes to /.""" + circuitpython.wait_until_done() + output = circuitpython.serial.all_output + assert "caught OSError" in output + assert "unexpected: write succeeded" not in output + assert "done" in output + + +GETMOUNT_CODE = """\ +import storage +mount = storage.getmount("/") +print(f"type: {type(mount).__name__}") +print(f"readonly: {mount.readonly}") +# label attribute should be accessible +print(f"label: {mount.label!r}") +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": GETMOUNT_CODE}) +def test_storage_getmount(circuitpython): + """getmount('/') returns the VfsFat object for the root mount.""" + circuitpython.wait_until_done() + output = circuitpython.serial.all_output + assert "type: VfsFat" in output + assert "readonly:" in output + assert "label:" in output + assert "done" in output + + +GETMOUNT_MISSING_CODE = """\ +import storage +try: + storage.getmount("/does_not_exist") + print("unexpected: getmount succeeded") +except OSError as e: + print(f"caught OSError: errno={e.errno}") +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": GETMOUNT_MISSING_CODE}) +def test_storage_getmount_missing(circuitpython): + """getmount on an unmounted path raises OSError.""" + circuitpython.wait_until_done() + output = circuitpython.serial.all_output + assert "caught OSError" in output + assert "unexpected: getmount succeeded" not in output + assert "done" in output + + +REMOUNT_PERSISTS_CODE = """\ +import storage +storage.remount("/", readonly=False) +with open("/persist.txt", "w") as f: + f.write("across-reload") +print("wrote persist.txt") +""" + +REMOUNT_PERSISTS_READ_CODE = """\ +with open("/persist.txt", "r") as f: + print(f"readback: {f.read()}") +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": REMOUNT_PERSISTS_CODE}) +@pytest.mark.code_py_runs(2) +def test_storage_remount_persists_across_reload(circuitpython): + """Data written after remount(readonly=False) persists across soft reload.""" + circuitpython.serial.wait_for("wrote persist.txt") + # Replace code.py via raw REPL-style approach: write new file then reload. + # Simpler: just trigger a soft reload and check the file is still there. + circuitpython.serial.write("\x04") + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "wrote persist.txt" in output + + +LABEL_CODE = """\ +import storage +storage.remount("/", readonly=False) +mount = storage.getmount("/") +mount.label = "CIRCUITPY" +print(f"label: {mount.label!r}") +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": LABEL_CODE}) +def test_storage_set_label(circuitpython): + """VfsFat.label can be set when mounted read-write.""" + circuitpython.wait_until_done() + output = circuitpython.serial.all_output + assert "label: 'CIRCUITPY'" in output + assert "done" in output + + +UMOUNT_MISSING_CODE = """\ +import storage +# Unmounting an unmounted path should raise. +try: + storage.umount("/not_mounted") + print("unexpected: umount succeeded") +except OSError as e: + print(f"umount OSError: errno={e.errno}") +print("done") +""" + + +@pytest.mark.circuitpy_drive({"code.py": UMOUNT_MISSING_CODE}) +def test_storage_umount_missing(circuitpython): + """umount on an unmounted path raises OSError.""" + circuitpython.wait_until_done() + output = circuitpython.serial.all_output + assert "umount OSError" in output + assert "unexpected:" not in output + assert "done" in output diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_00_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_00_320x240.png new file mode 100644 index 0000000000000..8f7fc051365c0 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_00_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_01_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_01_320x240.png new file mode 100644 index 0000000000000..67d17856c7dca Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_01_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_02_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_02_320x240.png new file mode 100644 index 0000000000000..99c832b68ecd0 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_02_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_03_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_03_320x240.png new file mode 100644 index 0000000000000..38f403a2ad339 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_03_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_04_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_04_320x240.png new file mode 100644 index 0000000000000..2a6649a0014c1 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_04_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_05_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_05_320x240.png new file mode 100644 index 0000000000000..507a929093763 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_05_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_06_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_06_320x240.png new file mode 100644 index 0000000000000..217b98f680bdf Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_06_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_07_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_07_320x240.png new file mode 100644 index 0000000000000..507a929093763 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_07_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_08_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_08_320x240.png new file mode 100644 index 0000000000000..2a6649a0014c1 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_08_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_09_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_09_320x240.png new file mode 100644 index 0000000000000..38f403a2ad339 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_09_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_10_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_10_320x240.png new file mode 100644 index 0000000000000..99c832b68ecd0 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_10_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_11_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_11_320x240.png new file mode 100644 index 0000000000000..67d17856c7dca Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_11_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_12_320x240.png b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_12_320x240.png new file mode 100644 index 0000000000000..8f7fc051365c0 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/golden/gifio_frame_12_320x240.png differ diff --git a/ports/zephyr-cp/tests/zephyr_display/test.gif b/ports/zephyr-cp/tests/zephyr_display/test.gif new file mode 100644 index 0000000000000..4f96816a1f032 Binary files /dev/null and b/ports/zephyr-cp/tests/zephyr_display/test.gif differ diff --git a/ports/zephyr-cp/tests/zephyr_display/test_gifio.py b/ports/zephyr-cp/tests/zephyr_display/test_gifio.py new file mode 100644 index 0000000000000..d4a665e2d44f0 --- /dev/null +++ b/ports/zephyr-cp/tests/zephyr_display/test_gifio.py @@ -0,0 +1,201 @@ +# SPDX-FileCopyrightText: 2026 Scott Shawcroft for Adafruit Industries +# SPDX-License-Identifier: MIT + +import shutil +from pathlib import Path + +import pytest +from PIL import Image + + +_TEST_GIF_PATH = Path(__file__).parent / "test.gif" +_TEST_GIF_BYTES = _TEST_GIF_PATH.read_bytes() + + +def _read_image(path: Path) -> tuple[int, int, bytes]: + with Image.open(path) as img: + rgb = img.convert("RGB") + return rgb.width, rgb.height, rgb.tobytes() + + +def _golden_compare_or_update(request, captures, golden_path): + if not captures or not captures[0].exists(): + pytest.skip("display capture was not produced") + + if request.config.getoption("--update-goldens"): + golden_path.parent.mkdir(parents=True, exist_ok=True) + shutil.copy2(captures[0], golden_path) + return + + gw, gh, gpx = _read_image(golden_path) + dw, dh, dpx = _read_image(captures[0]) + assert (dw, dh) == (gw, gh) + assert gpx == dpx + + +GIFIO_METADATA_CODE = """\ +import gifio + +odg = gifio.OnDiskGif('/test.gif') +print('size', odg.width, odg.height) +print('frame_count', odg.frame_count) +print('duration', round(odg.duration, 3)) +print('min_delay', round(odg.min_delay, 3)) +print('max_delay', round(odg.max_delay, 3)) + +delay = odg.next_frame() +print('delay', round(delay, 3)) + +bitmap = odg.bitmap +print('bitmap_size', bitmap.width, bitmap.height) + +for i in range(min(odg.width, 8)): + print('px', i, hex(bitmap[i, 0])) + +odg.deinit() +print('deinited') + +try: + odg.next_frame() +except Exception as e: + print('after_deinit', type(e).__name__) + +print('done') +""" + + +GIFIO_DECODE_CODE = """\ +import board +import displayio +import time +from gifio import OnDiskGif + +odg = OnDiskGif('/test.gif') +print('size', odg.width, odg.height) +print('frame_count', odg.frame_count) + +scale = 10 +tg = displayio.TileGrid( + odg.bitmap, + pixel_shader=displayio.ColorConverter( + input_colorspace=displayio.Colorspace.RGB565_SWAPPED + ), +) +g = displayio.Group(scale=scale) +g.x = (board.DISPLAY.width - odg.width * scale) // 2 +g.y = (board.DISPLAY.height - odg.height * scale) // 2 +g.append(tg) + +board.DISPLAY.auto_refresh = False +board.DISPLAY.root_group = g + +# Pin the render loop to a known point in simulated time so that the +# capture_times_ns schedule below lands on each GIF frame while it is on screen. +LOOP_START = 10.0 +FRAME_HOLD = 2.0 +while time.monotonic() < LOOP_START: + time.sleep(0.05) +print('loop_start', round(time.monotonic(), 3)) + +for frame_index in range(odg.frame_count): + odg.next_frame() + board.DISPLAY.refresh() + print('rendered', frame_index, round(time.monotonic(), 3)) + # Hold this frame on screen; the capture for this frame is scheduled + # for the middle of this window. + target = LOOP_START + (frame_index + 1) * FRAME_HOLD + while time.monotonic() < target: + time.sleep(0.05) + +print('done') +while True: + time.sleep(1) +""" + + +# Keep these in sync with LOOP_START / FRAME_HOLD in GIFIO_DECODE_CODE. +_DECODE_LOOP_START_S = 10.0 +_DECODE_FRAME_HOLD_S = 2.0 +_DECODE_FRAME_COUNT = 13 +# Capture at the midpoint of each frame's hold window. +_DECODE_CAPTURE_TIMES_NS = [ + int( + (_DECODE_LOOP_START_S + i * _DECODE_FRAME_HOLD_S + _DECODE_FRAME_HOLD_S / 2) + * 1_000_000_000 + ) + for i in range(_DECODE_FRAME_COUNT) +] + + +GIFIO_WRITER_CODE = """\ +import displayio +import gifio +import os + +width, height = 8, 4 +buf = bytearray(width * height * 2) +for i in range(width * height): + # RGB565 gradient + value = (i * 0x0841) & 0xFFFF + buf[2 * i] = (value >> 8) & 0xFF + buf[2 * i + 1] = value & 0xFF + +path = '/out.gif' +with gifio.GifWriter(path, width, height, displayio.Colorspace.RGB565, loop=True) as writer: + writer.add_frame(buf, 0.1) + writer.add_frame(buf, 0.2) + +size = os.stat(path)[6] +print('wrote_size', size) + +with open(path, 'rb') as f: + header = f.read(6) +print('header', header) + +print('done') +""" + + +_GIFIO_METADATA_DRIVE = {"code.py": GIFIO_METADATA_CODE, "test.gif": _TEST_GIF_BYTES} +_GIFIO_DECODE_DRIVE = {"code.py": GIFIO_DECODE_CODE, "test.gif": _TEST_GIF_BYTES} +_GIFIO_WRITER_DRIVE = {"code.py": GIFIO_WRITER_CODE} + + +@pytest.mark.circuitpy_drive(_GIFIO_METADATA_DRIVE) +def test_gifio_metadata(circuitpython): + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "size 16 16" in output + assert "frame_count 13" in output + assert "bitmap_size 16 16" in output + assert "min_delay 0.08" in output + assert "max_delay 0.08" in output + # 13 frames * 0.08s = 1.04s + assert "duration 1.04" in output + assert "delay 0.08" in output + assert "deinited" in output + # Using a deinited OnDiskGif should raise an exception. + assert "after_deinit" in output + assert "done" in output + + +@pytest.mark.circuitpy_drive(_GIFIO_DECODE_DRIVE) +@pytest.mark.display(capture_times_ns=_DECODE_CAPTURE_TIMES_NS) +@pytest.mark.duration(60) +def test_gifio_decode(request, circuitpython): + circuitpython.wait_until_done() + + output = circuitpython.serial.all_output + assert "size 16 16" in output + assert "frame_count 13" in output + for frame_index in range(_DECODE_FRAME_COUNT): + assert f"rendered {frame_index}" in output + assert "done" in output + + captures = circuitpython.display_capture_paths() + assert len(captures) == _DECODE_FRAME_COUNT + golden_dir = Path(__file__).parent / "golden" + for frame_index, capture in enumerate(captures): + golden = golden_dir / f"gifio_frame_{frame_index:02d}_320x240.png" + _golden_compare_or_update(request, [capture], golden)