From 76811d3c669cf86e6991099b19de42459f144282 Mon Sep 17 00:00:00 2001 From: "Earle F. Philhower, III" Date: Wed, 11 Sep 2024 18:55:28 -0700 Subject: [PATCH] Add RP2350B generic/Pimoroni PGA2350 support (#2433) * Add support for the extra 16 GPIO pins in the menus and core. * Clean up Generic RP2350 PSRAM ("none" is valid) and flash (other than 16MB) options. * Add extra GPIO<->peripheral connections * Add Pimoroni PGA2350 RP2350B-based board * Pins 32-47 can be used for PIOPrograms * Avoid hang when PSRAM fails to initialize * Move libpico to an RP2350B board for SDK (otherwise the SDK drops all GPIOHI support) --- boards.txt | 608 ++++++++++++++---- cores/rp2040/Arduino.h | 13 +- cores/rp2040/PIOProgram.cpp | 76 ++- cores/rp2040/PIOProgram.h | 2 +- cores/rp2040/SerialPIO.cpp | 5 +- cores/rp2040/SerialUART.cpp | 40 +- cores/rp2040/Tone.cpp | 6 +- cores/rp2040/pio_uart.pio | 4 +- cores/rp2040/pio_uart.pio.h | 4 +- cores/rp2040/psram.cpp | 3 + cores/rp2040/wiring_analog.cpp | 22 +- cores/rp2040/wiring_digital.cpp | 17 +- cores/rp2040/wiring_pulse.cpp | 2 +- cores/rp2040/wiring_shift.cpp | 8 +- docs/contrib.rst | 38 ++ .../rp2350/pico_base/pico/config_autogen.h | 2 +- lib/core_inc.txt | 2 +- lib/rp2040/libipv4-big.a | Bin 2365492 -> 2365492 bytes lib/rp2040/libipv4-bt-big.a | Bin 7529650 -> 7529650 bytes lib/rp2040/libipv4-bt.a | Bin 7529654 -> 7529654 bytes lib/rp2040/libipv4-ipv6-big.a | Bin 2736534 -> 2736534 bytes lib/rp2040/libipv4-ipv6-bt-big.a | Bin 7900908 -> 7900908 bytes lib/rp2040/libipv4-ipv6-bt.a | Bin 7900908 -> 7900908 bytes lib/rp2040/libipv4-ipv6.a | Bin 2736534 -> 2736534 bytes lib/rp2040/libipv4.a | Bin 2365488 -> 2365488 bytes lib/rp2040/libpico.a | Bin 1407600 -> 1407600 bytes lib/rp2350/libipv4-big.a | Bin 1671282 -> 1671242 bytes lib/rp2350/libipv4-ipv6-big.a | Bin 2027352 -> 2027312 bytes lib/rp2350/libipv4-ipv6.a | Bin 2027352 -> 2027312 bytes lib/rp2350/libipv4.a | Bin 1671282 -> 1671242 bytes lib/rp2350/libpico.a | Bin 1415428 -> 1432432 bytes libraries/I2S/src/I2S.cpp | 13 +- libraries/I2S/src/pio_i2s.pio | 39 +- libraries/I2S/src/pio_i2s.pio.h | 39 +- libraries/SPI/src/SPI.cpp | 40 +- libraries/SPISlave/src/SPISlave.cpp | 40 +- libraries/Servo/src/Servo.cpp | 2 +- libraries/Wire/src/Wire.cpp | 20 +- package/package_pico_index.template.json | 3 + platform.txt | 3 +- tools/json/pimoroni_pga2350.json | 56 ++ tools/libpico/CMakeLists.txt | 4 +- tools/makeboards.py | 18 +- variants/amken_revelop_es/pins_arduino.h | 2 +- variants/breadstick_raspberry/pins_arduino.h | 1 - variants/generic/common.h | 146 +++++ variants/pimoroni_pga2350/pins_arduino.h | 8 + 47 files changed, 1032 insertions(+), 254 deletions(-) create mode 100644 tools/json/pimoroni_pga2350.json create mode 100644 variants/pimoroni_pga2350/pins_arduino.h diff --git a/boards.txt b/boards.txt index 69e8f912b..4fe266577 100644 --- a/boards.txt +++ b/boards.txt @@ -3,9 +3,10 @@ # run 'python3 makeboards.py > ../boards.txt' to regenerate menu.BoardModel=Model +menu.variantchip=Chip Variant menu.flash=Flash Size -menu.psram=PSRAM Size menu.psramcs=PSRAM CS +menu.psram=PSRAM Size menu.psramfreq=PSRAM Speed menu.freq=CPU Speed menu.opt=Optimize @@ -18335,6 +18336,333 @@ pimoroni_pga2040.menu.uploadmethod.picoprobe_cmsis_dap.upload.maximum_data_size= pimoroni_pga2040.menu.uploadmethod.picoprobe_cmsis_dap.upload.tool=picoprobe_cmsis_dap pimoroni_pga2040.menu.uploadmethod.picoprobe_cmsis_dap.upload.tool.default=picoprobe_cmsis_dap +# ----------------------------------- +# Pimoroni PGA2350 +# ----------------------------------- +pimoroni_pga2350.name=Pimoroni PGA2350 +pimoroni_pga2350.vid.0=0x2e8a +pimoroni_pga2350.pid.0=0x1018 +pimoroni_pga2350.vid.1=0x2e8a +pimoroni_pga2350.pid.1=0x1118 +pimoroni_pga2350.vid.2=0x2e8a +pimoroni_pga2350.pid.2=0x5018 +pimoroni_pga2350.vid.3=0x2e8a +pimoroni_pga2350.pid.3=0x5118 +pimoroni_pga2350.vid.4=0x2e8a +pimoroni_pga2350.pid.4=0x9018 +pimoroni_pga2350.vid.5=0x2e8a +pimoroni_pga2350.pid.5=0x9118 +pimoroni_pga2350.vid.6=0x2e8a +pimoroni_pga2350.pid.6=0xd018 +pimoroni_pga2350.vid.7=0x2e8a +pimoroni_pga2350.pid.7=0xd118 +pimoroni_pga2350.upload_port.0.vid=0x2e8a +pimoroni_pga2350.upload_port.0.pid=0x1018 +pimoroni_pga2350.upload_port.1.vid=0x2e8a +pimoroni_pga2350.upload_port.1.pid=0x1118 +pimoroni_pga2350.upload_port.2.vid=0x2e8a +pimoroni_pga2350.upload_port.2.pid=0x5018 +pimoroni_pga2350.upload_port.3.vid=0x2e8a +pimoroni_pga2350.upload_port.3.pid=0x5118 +pimoroni_pga2350.upload_port.4.vid=0x2e8a +pimoroni_pga2350.upload_port.4.pid=0x9018 +pimoroni_pga2350.upload_port.5.vid=0x2e8a +pimoroni_pga2350.upload_port.5.pid=0x9118 +pimoroni_pga2350.upload_port.6.vid=0x2e8a +pimoroni_pga2350.upload_port.6.pid=0xd018 +pimoroni_pga2350.upload_port.7.vid=0x2e8a +pimoroni_pga2350.upload_port.7.pid=0xd118 +pimoroni_pga2350.build.usbvid=-DUSBD_VID=0x2e8a +pimoroni_pga2350.build.usbpid=-DUSBD_PID=0x1018 +pimoroni_pga2350.build.usbpwr=-DUSBD_MAX_POWER_MA=250 +pimoroni_pga2350.build.board=PIMORONI_PGA2350 +pimoroni_pga2350.build.chip=rp2350 +pimoroni_pga2350.build.toolchain=arm-none-eabi +pimoroni_pga2350.build.toolchainopts=-mcpu=cortex-m33 -mthumb -march=armv8-m.main+fp+dsp -mfloat-abi=softfp -mcmse +pimoroni_pga2350.build.uf2family=--family rp2350-arm-s --abs-block +pimoroni_pga2350.build.variant=pimoroni_pga2350 +pimoroni_pga2350.upload.maximum_size=16777216 +pimoroni_pga2350.upload.wait_for_upload_port=true +pimoroni_pga2350.upload.erase_cmd= +pimoroni_pga2350.serial.disableDTR=false +pimoroni_pga2350.serial.disableRTS=false +pimoroni_pga2350.build.f_cpu=125000000 +pimoroni_pga2350.build.led= +pimoroni_pga2350.build.core=rp2040 +pimoroni_pga2350.build.ldscript=memmap_default.ld +pimoroni_pga2350.build.boot2=boot2_w25q080_4_padded_checksum +pimoroni_pga2350.build.usb_manufacturer="Pimoroni" +pimoroni_pga2350.build.usb_product="PGA2350" +pimoroni_pga2350.build.psram_length=0x800000 +pimoroni_pga2350.menu.flash.16777216_0=16MB (no FS) +pimoroni_pga2350.menu.flash.16777216_0.upload.maximum_size=16769024 +pimoroni_pga2350.menu.flash.16777216_0.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_0.build.flash_length=16769024 +pimoroni_pga2350.menu.flash.16777216_0.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_0.build.fs_start=285204480 +pimoroni_pga2350.menu.flash.16777216_0.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_65536=16MB (Sketch: 16320KB, FS: 64KB) +pimoroni_pga2350.menu.flash.16777216_65536.upload.maximum_size=16703488 +pimoroni_pga2350.menu.flash.16777216_65536.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_65536.build.flash_length=16703488 +pimoroni_pga2350.menu.flash.16777216_65536.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_65536.build.fs_start=285138944 +pimoroni_pga2350.menu.flash.16777216_65536.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_131072=16MB (Sketch: 16256KB, FS: 128KB) +pimoroni_pga2350.menu.flash.16777216_131072.upload.maximum_size=16637952 +pimoroni_pga2350.menu.flash.16777216_131072.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_131072.build.flash_length=16637952 +pimoroni_pga2350.menu.flash.16777216_131072.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_131072.build.fs_start=285073408 +pimoroni_pga2350.menu.flash.16777216_131072.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_262144=16MB (Sketch: 16128KB, FS: 256KB) +pimoroni_pga2350.menu.flash.16777216_262144.upload.maximum_size=16506880 +pimoroni_pga2350.menu.flash.16777216_262144.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_262144.build.flash_length=16506880 +pimoroni_pga2350.menu.flash.16777216_262144.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_262144.build.fs_start=284942336 +pimoroni_pga2350.menu.flash.16777216_262144.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_524288=16MB (Sketch: 15872KB, FS: 512KB) +pimoroni_pga2350.menu.flash.16777216_524288.upload.maximum_size=16244736 +pimoroni_pga2350.menu.flash.16777216_524288.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_524288.build.flash_length=16244736 +pimoroni_pga2350.menu.flash.16777216_524288.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_524288.build.fs_start=284680192 +pimoroni_pga2350.menu.flash.16777216_524288.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_1048576=16MB (Sketch: 15MB, FS: 1MB) +pimoroni_pga2350.menu.flash.16777216_1048576.upload.maximum_size=15720448 +pimoroni_pga2350.menu.flash.16777216_1048576.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_1048576.build.flash_length=15720448 +pimoroni_pga2350.menu.flash.16777216_1048576.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_1048576.build.fs_start=284155904 +pimoroni_pga2350.menu.flash.16777216_1048576.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_2097152=16MB (Sketch: 14MB, FS: 2MB) +pimoroni_pga2350.menu.flash.16777216_2097152.upload.maximum_size=14671872 +pimoroni_pga2350.menu.flash.16777216_2097152.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_2097152.build.flash_length=14671872 +pimoroni_pga2350.menu.flash.16777216_2097152.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_2097152.build.fs_start=283107328 +pimoroni_pga2350.menu.flash.16777216_2097152.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_3145728=16MB (Sketch: 13MB, FS: 3MB) +pimoroni_pga2350.menu.flash.16777216_3145728.upload.maximum_size=13623296 +pimoroni_pga2350.menu.flash.16777216_3145728.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_3145728.build.flash_length=13623296 +pimoroni_pga2350.menu.flash.16777216_3145728.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_3145728.build.fs_start=282058752 +pimoroni_pga2350.menu.flash.16777216_3145728.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_4194304=16MB (Sketch: 12MB, FS: 4MB) +pimoroni_pga2350.menu.flash.16777216_4194304.upload.maximum_size=12574720 +pimoroni_pga2350.menu.flash.16777216_4194304.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_4194304.build.flash_length=12574720 +pimoroni_pga2350.menu.flash.16777216_4194304.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_4194304.build.fs_start=281010176 +pimoroni_pga2350.menu.flash.16777216_4194304.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_5242880=16MB (Sketch: 11MB, FS: 5MB) +pimoroni_pga2350.menu.flash.16777216_5242880.upload.maximum_size=11526144 +pimoroni_pga2350.menu.flash.16777216_5242880.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_5242880.build.flash_length=11526144 +pimoroni_pga2350.menu.flash.16777216_5242880.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_5242880.build.fs_start=279961600 +pimoroni_pga2350.menu.flash.16777216_5242880.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_6291456=16MB (Sketch: 10MB, FS: 6MB) +pimoroni_pga2350.menu.flash.16777216_6291456.upload.maximum_size=10477568 +pimoroni_pga2350.menu.flash.16777216_6291456.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_6291456.build.flash_length=10477568 +pimoroni_pga2350.menu.flash.16777216_6291456.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_6291456.build.fs_start=278913024 +pimoroni_pga2350.menu.flash.16777216_6291456.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_7340032=16MB (Sketch: 9MB, FS: 7MB) +pimoroni_pga2350.menu.flash.16777216_7340032.upload.maximum_size=9428992 +pimoroni_pga2350.menu.flash.16777216_7340032.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_7340032.build.flash_length=9428992 +pimoroni_pga2350.menu.flash.16777216_7340032.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_7340032.build.fs_start=277864448 +pimoroni_pga2350.menu.flash.16777216_7340032.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_8388608=16MB (Sketch: 8MB, FS: 8MB) +pimoroni_pga2350.menu.flash.16777216_8388608.upload.maximum_size=8380416 +pimoroni_pga2350.menu.flash.16777216_8388608.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_8388608.build.flash_length=8380416 +pimoroni_pga2350.menu.flash.16777216_8388608.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_8388608.build.fs_start=276815872 +pimoroni_pga2350.menu.flash.16777216_8388608.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_9437184=16MB (Sketch: 7MB, FS: 9MB) +pimoroni_pga2350.menu.flash.16777216_9437184.upload.maximum_size=7331840 +pimoroni_pga2350.menu.flash.16777216_9437184.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_9437184.build.flash_length=7331840 +pimoroni_pga2350.menu.flash.16777216_9437184.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_9437184.build.fs_start=275767296 +pimoroni_pga2350.menu.flash.16777216_9437184.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_10485760=16MB (Sketch: 6MB, FS: 10MB) +pimoroni_pga2350.menu.flash.16777216_10485760.upload.maximum_size=6283264 +pimoroni_pga2350.menu.flash.16777216_10485760.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_10485760.build.flash_length=6283264 +pimoroni_pga2350.menu.flash.16777216_10485760.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_10485760.build.fs_start=274718720 +pimoroni_pga2350.menu.flash.16777216_10485760.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_11534336=16MB (Sketch: 5MB, FS: 11MB) +pimoroni_pga2350.menu.flash.16777216_11534336.upload.maximum_size=5234688 +pimoroni_pga2350.menu.flash.16777216_11534336.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_11534336.build.flash_length=5234688 +pimoroni_pga2350.menu.flash.16777216_11534336.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_11534336.build.fs_start=273670144 +pimoroni_pga2350.menu.flash.16777216_11534336.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_12582912=16MB (Sketch: 4MB, FS: 12MB) +pimoroni_pga2350.menu.flash.16777216_12582912.upload.maximum_size=4186112 +pimoroni_pga2350.menu.flash.16777216_12582912.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_12582912.build.flash_length=4186112 +pimoroni_pga2350.menu.flash.16777216_12582912.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_12582912.build.fs_start=272621568 +pimoroni_pga2350.menu.flash.16777216_12582912.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_13631488=16MB (Sketch: 3MB, FS: 13MB) +pimoroni_pga2350.menu.flash.16777216_13631488.upload.maximum_size=3137536 +pimoroni_pga2350.menu.flash.16777216_13631488.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_13631488.build.flash_length=3137536 +pimoroni_pga2350.menu.flash.16777216_13631488.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_13631488.build.fs_start=271572992 +pimoroni_pga2350.menu.flash.16777216_13631488.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_14680064=16MB (Sketch: 2MB, FS: 14MB) +pimoroni_pga2350.menu.flash.16777216_14680064.upload.maximum_size=2088960 +pimoroni_pga2350.menu.flash.16777216_14680064.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_14680064.build.flash_length=2088960 +pimoroni_pga2350.menu.flash.16777216_14680064.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_14680064.build.fs_start=270524416 +pimoroni_pga2350.menu.flash.16777216_14680064.build.fs_end=285204480 +pimoroni_pga2350.menu.flash.16777216_15728640=16MB (Sketch: 1MB, FS: 15MB) +pimoroni_pga2350.menu.flash.16777216_15728640.upload.maximum_size=1040384 +pimoroni_pga2350.menu.flash.16777216_15728640.build.flash_total=16777216 +pimoroni_pga2350.menu.flash.16777216_15728640.build.flash_length=1040384 +pimoroni_pga2350.menu.flash.16777216_15728640.build.eeprom_start=285204480 +pimoroni_pga2350.menu.flash.16777216_15728640.build.fs_start=269475840 +pimoroni_pga2350.menu.flash.16777216_15728640.build.fs_end=285204480 +pimoroni_pga2350.menu.freq.150=150 MHz +pimoroni_pga2350.menu.freq.150.build.f_cpu=150000000L +pimoroni_pga2350.menu.freq.50=50 MHz +pimoroni_pga2350.menu.freq.50.build.f_cpu=50000000L +pimoroni_pga2350.menu.freq.100=100 MHz +pimoroni_pga2350.menu.freq.100.build.f_cpu=100000000L +pimoroni_pga2350.menu.freq.120=120 MHz +pimoroni_pga2350.menu.freq.120.build.f_cpu=120000000L +pimoroni_pga2350.menu.freq.125=125 MHz +pimoroni_pga2350.menu.freq.125.build.f_cpu=125000000L +pimoroni_pga2350.menu.freq.128=128 MHz +pimoroni_pga2350.menu.freq.128.build.f_cpu=128000000L +pimoroni_pga2350.menu.freq.133=133 MHz +pimoroni_pga2350.menu.freq.133.build.f_cpu=133000000L +pimoroni_pga2350.menu.freq.175=175 MHz (Overclock) +pimoroni_pga2350.menu.freq.175.build.f_cpu=175000000L +pimoroni_pga2350.menu.freq.200=200 MHz (Overclock) +pimoroni_pga2350.menu.freq.200.build.f_cpu=200000000L +pimoroni_pga2350.menu.freq.225=225 MHz (Overclock) +pimoroni_pga2350.menu.freq.225.build.f_cpu=225000000L +pimoroni_pga2350.menu.freq.240=240 MHz (Overclock) +pimoroni_pga2350.menu.freq.240.build.f_cpu=240000000L +pimoroni_pga2350.menu.freq.250=250 MHz (Overclock) +pimoroni_pga2350.menu.freq.250.build.f_cpu=250000000L +pimoroni_pga2350.menu.freq.275=275 MHz (Overclock) +pimoroni_pga2350.menu.freq.275.build.f_cpu=275000000L +pimoroni_pga2350.menu.freq.300=300 MHz (Overclock) +pimoroni_pga2350.menu.freq.300.build.f_cpu=300000000L +pimoroni_pga2350.menu.opt.Small=Small (-Os) (standard) +pimoroni_pga2350.menu.opt.Small.build.flags.optimize=-Os +pimoroni_pga2350.menu.opt.Optimize=Optimize (-O) +pimoroni_pga2350.menu.opt.Optimize.build.flags.optimize=-O +pimoroni_pga2350.menu.opt.Optimize2=Optimize More (-O2) +pimoroni_pga2350.menu.opt.Optimize2.build.flags.optimize=-O2 +pimoroni_pga2350.menu.opt.Optimize3=Optimize Even More (-O3) +pimoroni_pga2350.menu.opt.Optimize3.build.flags.optimize=-O3 +pimoroni_pga2350.menu.opt.Fast=Fast (-Ofast) (maybe slower) +pimoroni_pga2350.menu.opt.Fast.build.flags.optimize=-Ofast +pimoroni_pga2350.menu.opt.Debug=Debug (-Og) +pimoroni_pga2350.menu.opt.Debug.build.flags.optimize=-Og +pimoroni_pga2350.menu.rtti.Disabled=Disabled +pimoroni_pga2350.menu.rtti.Disabled.build.flags.rtti=-fno-rtti +pimoroni_pga2350.menu.rtti.Enabled=Enabled +pimoroni_pga2350.menu.rtti.Enabled.build.flags.rtti= +pimoroni_pga2350.menu.stackprotect.Disabled=Disabled +pimoroni_pga2350.menu.stackprotect.Disabled.build.flags.stackprotect= +pimoroni_pga2350.menu.stackprotect.Enabled=Enabled +pimoroni_pga2350.menu.stackprotect.Enabled.build.flags.stackprotect=-fstack-protector +pimoroni_pga2350.menu.exceptions.Disabled=Disabled +pimoroni_pga2350.menu.exceptions.Disabled.build.flags.exceptions=-fno-exceptions +pimoroni_pga2350.menu.exceptions.Disabled.build.flags.libstdcpp=-lstdc++ +pimoroni_pga2350.menu.exceptions.Enabled=Enabled +pimoroni_pga2350.menu.exceptions.Enabled.build.flags.exceptions=-fexceptions +pimoroni_pga2350.menu.exceptions.Enabled.build.flags.libstdcpp=-lstdc++-exc +pimoroni_pga2350.menu.dbgport.Disabled=Disabled +pimoroni_pga2350.menu.dbgport.Disabled.build.debug_port= +pimoroni_pga2350.menu.dbgport.Serial=Serial +pimoroni_pga2350.menu.dbgport.Serial.build.debug_port=-DDEBUG_RP2040_PORT=Serial +pimoroni_pga2350.menu.dbgport.Serial1=Serial1 +pimoroni_pga2350.menu.dbgport.Serial1.build.debug_port=-DDEBUG_RP2040_PORT=Serial1 +pimoroni_pga2350.menu.dbgport.Serial2=Serial2 +pimoroni_pga2350.menu.dbgport.Serial2.build.debug_port=-DDEBUG_RP2040_PORT=Serial2 +pimoroni_pga2350.menu.dbglvl.None=None +pimoroni_pga2350.menu.dbglvl.None.build.debug_level= +pimoroni_pga2350.menu.dbglvl.Core=Core +pimoroni_pga2350.menu.dbglvl.Core.build.debug_level=-DDEBUG_RP2040_CORE +pimoroni_pga2350.menu.dbglvl.SPI=SPI +pimoroni_pga2350.menu.dbglvl.SPI.build.debug_level=-DDEBUG_RP2040_SPI +pimoroni_pga2350.menu.dbglvl.Wire=Wire +pimoroni_pga2350.menu.dbglvl.Wire.build.debug_level=-DDEBUG_RP2040_WIRE +pimoroni_pga2350.menu.dbglvl.Bluetooth=Bluetooth +pimoroni_pga2350.menu.dbglvl.Bluetooth.build.debug_level=-DDEBUG_RP2040_BLUETOOTH +pimoroni_pga2350.menu.dbglvl.All=All +pimoroni_pga2350.menu.dbglvl.All.build.debug_level=-DDEBUG_RP2040_WIRE -DDEBUG_RP2040_SPI -DDEBUG_RP2040_CORE -DDEBUG_RP2040_BLUETOOTH +pimoroni_pga2350.menu.dbglvl.NDEBUG=NDEBUG +pimoroni_pga2350.menu.dbglvl.NDEBUG.build.debug_level=-DNDEBUG +pimoroni_pga2350.menu.usbstack.picosdk=Pico SDK +pimoroni_pga2350.menu.usbstack.picosdk.build.usbstack_flags= +pimoroni_pga2350.menu.usbstack.tinyusb=Adafruit TinyUSB +pimoroni_pga2350.menu.usbstack.tinyusb.build.usbstack_flags=-DUSE_TINYUSB "-I{runtime.platform.path}/libraries/Adafruit_TinyUSB_Arduino/src/arduino" +pimoroni_pga2350.menu.usbstack.tinyusb_host=Adafruit TinyUSB Host (native) +pimoroni_pga2350.menu.usbstack.tinyusb_host.build.usbstack_flags=-DUSE_TINYUSB -DUSE_TINYUSB_HOST "-I{runtime.platform.path}/libraries/Adafruit_TinyUSB_Arduino/src/arduino" +pimoroni_pga2350.menu.usbstack.nousb=No USB +pimoroni_pga2350.menu.usbstack.nousb.build.usbstack_flags="-DNO_USB -DDISABLE_USB_SERIAL -I{runtime.platform.path}/tools/libpico" +pimoroni_pga2350.menu.ipbtstack.ipv4only=IPv4 Only +pimoroni_pga2350.menu.ipbtstack.ipv4only.build.libpicow=libipv4.a +pimoroni_pga2350.menu.ipbtstack.ipv4only.build.libpicowdefs=-DLWIP_IPV6=0 -DLWIP_IPV4=1 +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6=IPv4 + IPv6 +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6.build.libpicow=libipv4-ipv6.a +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6.build.libpicowdefs=-DLWIP_IPV6=1 -DLWIP_IPV4=1 +pimoroni_pga2350.menu.ipbtstack.ipv4btcble=IPv4 + Bluetooth +pimoroni_pga2350.menu.ipbtstack.ipv4btcble.build.libpicow=libipv4-bt.a +pimoroni_pga2350.menu.ipbtstack.ipv4btcble.build.libpicowdefs=-DLWIP_IPV6=0 -DLWIP_IPV4=1 -DENABLE_CLASSIC=1 -DENABLE_BLE=1 +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6btcble=IPv4 + IPv6 + Bluetooth +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6btcble.build.libpicow=libipv4-ipv6-bt.a +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6btcble.build.libpicowdefs=-DLWIP_IPV6=1 -DLWIP_IPV4=1 -DENABLE_CLASSIC=1 -DENABLE_BLE=1 +pimoroni_pga2350.menu.ipbtstack.ipv4onlybig=IPv4 Only - 32K +pimoroni_pga2350.menu.ipbtstack.ipv4onlybig.build.libpicow=libipv4-big.a +pimoroni_pga2350.menu.ipbtstack.ipv4onlybig.build.libpicowdefs=-DLWIP_IPV6=0 -DLWIP_IPV4=1 -D__LWIP_MEMMULT=2 +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6big=IPv4 + IPv6 - 32K +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6big.build.libpicow=libipv4-ipv6-big.a +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6big.build.libpicowdefs=-DLWIP_IPV6=1 -DLWIP_IPV4=1 -D__LWIP_MEMMULT=2 +pimoroni_pga2350.menu.ipbtstack.ipv4btcblebig=IPv4 + Bluetooth - 32K +pimoroni_pga2350.menu.ipbtstack.ipv4btcblebig.build.libpicow=libipv4-bt-big.a +pimoroni_pga2350.menu.ipbtstack.ipv4btcblebig.build.libpicowdefs=-DLWIP_IPV6=0 -DLWIP_IPV4=1 -DENABLE_CLASSIC=1 -DENABLE_BLE=1 -D__LWIP_MEMMULT=2 +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6btcblebig=IPv4 + IPv6 + Bluetooth - 32K +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6btcblebig.build.libpicow=libipv4-ipv6-bt-big.a +pimoroni_pga2350.menu.ipbtstack.ipv4ipv6btcblebig.build.libpicowdefs=-DLWIP_IPV6=1 -DLWIP_IPV4=1 -DENABLE_CLASSIC=1 -DENABLE_BLE=1 -D__LWIP_MEMMULT=2 +pimoroni_pga2350.menu.uploadmethod.default=Default (UF2) +pimoroni_pga2350.menu.uploadmethod.default.build.ram_length=512k +pimoroni_pga2350.menu.uploadmethod.default.build.debugscript=picoprobe_cmsis_dap.tcl +pimoroni_pga2350.menu.uploadmethod.default.upload.maximum_data_size=524288 +pimoroni_pga2350.menu.uploadmethod.default.upload.tool=uf2conv +pimoroni_pga2350.menu.uploadmethod.default.upload.tool.default=uf2conv +pimoroni_pga2350.menu.uploadmethod.default.upload.tool.network=uf2conv-network +pimoroni_pga2350.menu.uploadmethod.picotool=Picotool +pimoroni_pga2350.menu.uploadmethod.picotool.build.ram_length=512k +pimoroni_pga2350.menu.uploadmethod.picotool.build.debugscript=picoprobe.tcl +pimoroni_pga2350.menu.uploadmethod.picotool.build.picodebugflags=-DENABLE_PICOTOOL_USB +pimoroni_pga2350.menu.uploadmethod.picotool.upload.maximum_data_size=524288 +pimoroni_pga2350.menu.uploadmethod.picotool.upload.tool=picotool +pimoroni_pga2350.menu.uploadmethod.picotool.upload.tool.default=picotool +pimoroni_pga2350.menu.uploadmethod.picoprobe_cmsis_dap=Picoprobe/Debugprobe (CMSIS-DAP) +pimoroni_pga2350.menu.uploadmethod.picoprobe_cmsis_dap.build.ram_length=512k +pimoroni_pga2350.menu.uploadmethod.picoprobe_cmsis_dap.build.debugscript=picoprobe_cmsis_dap.tcl +pimoroni_pga2350.menu.uploadmethod.picoprobe_cmsis_dap.upload.maximum_data_size=524288 +pimoroni_pga2350.menu.uploadmethod.picoprobe_cmsis_dap.upload.tool=picoprobe_cmsis_dap +pimoroni_pga2350.menu.uploadmethod.picoprobe_cmsis_dap.upload.tool.default=picoprobe_cmsis_dap + # ----------------------------------- # Pimoroni PicoPlus2 # ----------------------------------- @@ -27369,6 +27697,69 @@ generic_rp2350.build.ldscript=memmap_default.ld generic_rp2350.build.boot2=boot2_generic_03h_4_padded_checksum generic_rp2350.build.usb_manufacturer="Generic" generic_rp2350.build.usb_product="RP2350" +generic_rp2350.menu.flash.2097152_0=2MB (no FS) +generic_rp2350.menu.flash.2097152_0.upload.maximum_size=2088960 +generic_rp2350.menu.flash.2097152_0.build.flash_total=2097152 +generic_rp2350.menu.flash.2097152_0.build.flash_length=2088960 +generic_rp2350.menu.flash.2097152_0.build.eeprom_start=270524416 +generic_rp2350.menu.flash.2097152_0.build.fs_start=270524416 +generic_rp2350.menu.flash.2097152_0.build.fs_end=270524416 +generic_rp2350.menu.flash.2097152_1048576=2MB (Sketch: 1MB, FS: 1MB) +generic_rp2350.menu.flash.2097152_1048576.upload.maximum_size=1040384 +generic_rp2350.menu.flash.2097152_1048576.build.flash_total=2097152 +generic_rp2350.menu.flash.2097152_1048576.build.flash_length=1040384 +generic_rp2350.menu.flash.2097152_1048576.build.eeprom_start=270524416 +generic_rp2350.menu.flash.2097152_1048576.build.fs_start=269475840 +generic_rp2350.menu.flash.2097152_1048576.build.fs_end=270524416 +generic_rp2350.menu.flash.4194304_0=4MB (no FS) +generic_rp2350.menu.flash.4194304_0.upload.maximum_size=4186112 +generic_rp2350.menu.flash.4194304_0.build.flash_total=4194304 +generic_rp2350.menu.flash.4194304_0.build.flash_length=4186112 +generic_rp2350.menu.flash.4194304_0.build.eeprom_start=272621568 +generic_rp2350.menu.flash.4194304_0.build.fs_start=272621568 +generic_rp2350.menu.flash.4194304_0.build.fs_end=272621568 +generic_rp2350.menu.flash.4194304_3145728=4MB (Sketch: 1MB, FS: 3MB) +generic_rp2350.menu.flash.4194304_3145728.upload.maximum_size=1040384 +generic_rp2350.menu.flash.4194304_3145728.build.flash_total=4194304 +generic_rp2350.menu.flash.4194304_3145728.build.flash_length=1040384 +generic_rp2350.menu.flash.4194304_3145728.build.eeprom_start=272621568 +generic_rp2350.menu.flash.4194304_3145728.build.fs_start=269475840 +generic_rp2350.menu.flash.4194304_3145728.build.fs_end=272621568 +generic_rp2350.menu.flash.4194304_2097152=4MB (Sketch: 2MB, FS: 2MB) +generic_rp2350.menu.flash.4194304_2097152.upload.maximum_size=2088960 +generic_rp2350.menu.flash.4194304_2097152.build.flash_total=4194304 +generic_rp2350.menu.flash.4194304_2097152.build.flash_length=2088960 +generic_rp2350.menu.flash.4194304_2097152.build.eeprom_start=272621568 +generic_rp2350.menu.flash.4194304_2097152.build.fs_start=270524416 +generic_rp2350.menu.flash.4194304_2097152.build.fs_end=272621568 +generic_rp2350.menu.flash.8388608_0=8MB (no FS) +generic_rp2350.menu.flash.8388608_0.upload.maximum_size=8380416 +generic_rp2350.menu.flash.8388608_0.build.flash_total=8388608 +generic_rp2350.menu.flash.8388608_0.build.flash_length=8380416 +generic_rp2350.menu.flash.8388608_0.build.eeprom_start=276815872 +generic_rp2350.menu.flash.8388608_0.build.fs_start=276815872 +generic_rp2350.menu.flash.8388608_0.build.fs_end=276815872 +generic_rp2350.menu.flash.8388608_7340032=8MB (Sketch: 1MB, FS: 7MB) +generic_rp2350.menu.flash.8388608_7340032.upload.maximum_size=1040384 +generic_rp2350.menu.flash.8388608_7340032.build.flash_total=8388608 +generic_rp2350.menu.flash.8388608_7340032.build.flash_length=1040384 +generic_rp2350.menu.flash.8388608_7340032.build.eeprom_start=276815872 +generic_rp2350.menu.flash.8388608_7340032.build.fs_start=269475840 +generic_rp2350.menu.flash.8388608_7340032.build.fs_end=276815872 +generic_rp2350.menu.flash.8388608_4194304=8MB (Sketch: 4MB, FS: 4MB) +generic_rp2350.menu.flash.8388608_4194304.upload.maximum_size=4186112 +generic_rp2350.menu.flash.8388608_4194304.build.flash_total=8388608 +generic_rp2350.menu.flash.8388608_4194304.build.flash_length=4186112 +generic_rp2350.menu.flash.8388608_4194304.build.eeprom_start=276815872 +generic_rp2350.menu.flash.8388608_4194304.build.fs_start=272621568 +generic_rp2350.menu.flash.8388608_4194304.build.fs_end=276815872 +generic_rp2350.menu.flash.8388608_2097152=8MB (Sketch: 6MB, FS: 2MB) +generic_rp2350.menu.flash.8388608_2097152.upload.maximum_size=6283264 +generic_rp2350.menu.flash.8388608_2097152.build.flash_total=8388608 +generic_rp2350.menu.flash.8388608_2097152.build.flash_length=6283264 +generic_rp2350.menu.flash.8388608_2097152.build.eeprom_start=276815872 +generic_rp2350.menu.flash.8388608_2097152.build.fs_start=274718720 +generic_rp2350.menu.flash.8388608_2097152.build.fs_end=276815872 generic_rp2350.menu.flash.16777216_0=16MB (no FS) generic_rp2350.menu.flash.16777216_0.upload.maximum_size=16769024 generic_rp2350.menu.flash.16777216_0.build.flash_total=16777216 @@ -27376,132 +27767,6 @@ generic_rp2350.menu.flash.16777216_0.build.flash_length=16769024 generic_rp2350.menu.flash.16777216_0.build.eeprom_start=285204480 generic_rp2350.menu.flash.16777216_0.build.fs_start=285204480 generic_rp2350.menu.flash.16777216_0.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_65536=16MB (Sketch: 16320KB, FS: 64KB) -generic_rp2350.menu.flash.16777216_65536.upload.maximum_size=16703488 -generic_rp2350.menu.flash.16777216_65536.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_65536.build.flash_length=16703488 -generic_rp2350.menu.flash.16777216_65536.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_65536.build.fs_start=285138944 -generic_rp2350.menu.flash.16777216_65536.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_131072=16MB (Sketch: 16256KB, FS: 128KB) -generic_rp2350.menu.flash.16777216_131072.upload.maximum_size=16637952 -generic_rp2350.menu.flash.16777216_131072.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_131072.build.flash_length=16637952 -generic_rp2350.menu.flash.16777216_131072.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_131072.build.fs_start=285073408 -generic_rp2350.menu.flash.16777216_131072.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_262144=16MB (Sketch: 16128KB, FS: 256KB) -generic_rp2350.menu.flash.16777216_262144.upload.maximum_size=16506880 -generic_rp2350.menu.flash.16777216_262144.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_262144.build.flash_length=16506880 -generic_rp2350.menu.flash.16777216_262144.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_262144.build.fs_start=284942336 -generic_rp2350.menu.flash.16777216_262144.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_524288=16MB (Sketch: 15872KB, FS: 512KB) -generic_rp2350.menu.flash.16777216_524288.upload.maximum_size=16244736 -generic_rp2350.menu.flash.16777216_524288.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_524288.build.flash_length=16244736 -generic_rp2350.menu.flash.16777216_524288.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_524288.build.fs_start=284680192 -generic_rp2350.menu.flash.16777216_524288.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_1048576=16MB (Sketch: 15MB, FS: 1MB) -generic_rp2350.menu.flash.16777216_1048576.upload.maximum_size=15720448 -generic_rp2350.menu.flash.16777216_1048576.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_1048576.build.flash_length=15720448 -generic_rp2350.menu.flash.16777216_1048576.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_1048576.build.fs_start=284155904 -generic_rp2350.menu.flash.16777216_1048576.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_2097152=16MB (Sketch: 14MB, FS: 2MB) -generic_rp2350.menu.flash.16777216_2097152.upload.maximum_size=14671872 -generic_rp2350.menu.flash.16777216_2097152.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_2097152.build.flash_length=14671872 -generic_rp2350.menu.flash.16777216_2097152.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_2097152.build.fs_start=283107328 -generic_rp2350.menu.flash.16777216_2097152.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_3145728=16MB (Sketch: 13MB, FS: 3MB) -generic_rp2350.menu.flash.16777216_3145728.upload.maximum_size=13623296 -generic_rp2350.menu.flash.16777216_3145728.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_3145728.build.flash_length=13623296 -generic_rp2350.menu.flash.16777216_3145728.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_3145728.build.fs_start=282058752 -generic_rp2350.menu.flash.16777216_3145728.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_4194304=16MB (Sketch: 12MB, FS: 4MB) -generic_rp2350.menu.flash.16777216_4194304.upload.maximum_size=12574720 -generic_rp2350.menu.flash.16777216_4194304.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_4194304.build.flash_length=12574720 -generic_rp2350.menu.flash.16777216_4194304.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_4194304.build.fs_start=281010176 -generic_rp2350.menu.flash.16777216_4194304.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_5242880=16MB (Sketch: 11MB, FS: 5MB) -generic_rp2350.menu.flash.16777216_5242880.upload.maximum_size=11526144 -generic_rp2350.menu.flash.16777216_5242880.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_5242880.build.flash_length=11526144 -generic_rp2350.menu.flash.16777216_5242880.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_5242880.build.fs_start=279961600 -generic_rp2350.menu.flash.16777216_5242880.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_6291456=16MB (Sketch: 10MB, FS: 6MB) -generic_rp2350.menu.flash.16777216_6291456.upload.maximum_size=10477568 -generic_rp2350.menu.flash.16777216_6291456.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_6291456.build.flash_length=10477568 -generic_rp2350.menu.flash.16777216_6291456.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_6291456.build.fs_start=278913024 -generic_rp2350.menu.flash.16777216_6291456.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_7340032=16MB (Sketch: 9MB, FS: 7MB) -generic_rp2350.menu.flash.16777216_7340032.upload.maximum_size=9428992 -generic_rp2350.menu.flash.16777216_7340032.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_7340032.build.flash_length=9428992 -generic_rp2350.menu.flash.16777216_7340032.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_7340032.build.fs_start=277864448 -generic_rp2350.menu.flash.16777216_7340032.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_8388608=16MB (Sketch: 8MB, FS: 8MB) -generic_rp2350.menu.flash.16777216_8388608.upload.maximum_size=8380416 -generic_rp2350.menu.flash.16777216_8388608.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_8388608.build.flash_length=8380416 -generic_rp2350.menu.flash.16777216_8388608.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_8388608.build.fs_start=276815872 -generic_rp2350.menu.flash.16777216_8388608.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_9437184=16MB (Sketch: 7MB, FS: 9MB) -generic_rp2350.menu.flash.16777216_9437184.upload.maximum_size=7331840 -generic_rp2350.menu.flash.16777216_9437184.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_9437184.build.flash_length=7331840 -generic_rp2350.menu.flash.16777216_9437184.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_9437184.build.fs_start=275767296 -generic_rp2350.menu.flash.16777216_9437184.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_10485760=16MB (Sketch: 6MB, FS: 10MB) -generic_rp2350.menu.flash.16777216_10485760.upload.maximum_size=6283264 -generic_rp2350.menu.flash.16777216_10485760.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_10485760.build.flash_length=6283264 -generic_rp2350.menu.flash.16777216_10485760.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_10485760.build.fs_start=274718720 -generic_rp2350.menu.flash.16777216_10485760.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_11534336=16MB (Sketch: 5MB, FS: 11MB) -generic_rp2350.menu.flash.16777216_11534336.upload.maximum_size=5234688 -generic_rp2350.menu.flash.16777216_11534336.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_11534336.build.flash_length=5234688 -generic_rp2350.menu.flash.16777216_11534336.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_11534336.build.fs_start=273670144 -generic_rp2350.menu.flash.16777216_11534336.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_12582912=16MB (Sketch: 4MB, FS: 12MB) -generic_rp2350.menu.flash.16777216_12582912.upload.maximum_size=4186112 -generic_rp2350.menu.flash.16777216_12582912.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_12582912.build.flash_length=4186112 -generic_rp2350.menu.flash.16777216_12582912.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_12582912.build.fs_start=272621568 -generic_rp2350.menu.flash.16777216_12582912.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_13631488=16MB (Sketch: 3MB, FS: 13MB) -generic_rp2350.menu.flash.16777216_13631488.upload.maximum_size=3137536 -generic_rp2350.menu.flash.16777216_13631488.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_13631488.build.flash_length=3137536 -generic_rp2350.menu.flash.16777216_13631488.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_13631488.build.fs_start=271572992 -generic_rp2350.menu.flash.16777216_13631488.build.fs_end=285204480 -generic_rp2350.menu.flash.16777216_14680064=16MB (Sketch: 2MB, FS: 14MB) -generic_rp2350.menu.flash.16777216_14680064.upload.maximum_size=2088960 -generic_rp2350.menu.flash.16777216_14680064.build.flash_total=16777216 -generic_rp2350.menu.flash.16777216_14680064.build.flash_length=2088960 -generic_rp2350.menu.flash.16777216_14680064.build.eeprom_start=285204480 -generic_rp2350.menu.flash.16777216_14680064.build.fs_start=270524416 -generic_rp2350.menu.flash.16777216_14680064.build.fs_end=285204480 generic_rp2350.menu.flash.16777216_15728640=16MB (Sketch: 1MB, FS: 15MB) generic_rp2350.menu.flash.16777216_15728640.upload.maximum_size=1040384 generic_rp2350.menu.flash.16777216_15728640.build.flash_total=16777216 @@ -27509,6 +27774,41 @@ generic_rp2350.menu.flash.16777216_15728640.build.flash_length=1040384 generic_rp2350.menu.flash.16777216_15728640.build.eeprom_start=285204480 generic_rp2350.menu.flash.16777216_15728640.build.fs_start=269475840 generic_rp2350.menu.flash.16777216_15728640.build.fs_end=285204480 +generic_rp2350.menu.flash.16777216_14680064=16MB (Sketch: 2MB, FS: 14MB) +generic_rp2350.menu.flash.16777216_14680064.upload.maximum_size=2088960 +generic_rp2350.menu.flash.16777216_14680064.build.flash_total=16777216 +generic_rp2350.menu.flash.16777216_14680064.build.flash_length=2088960 +generic_rp2350.menu.flash.16777216_14680064.build.eeprom_start=285204480 +generic_rp2350.menu.flash.16777216_14680064.build.fs_start=270524416 +generic_rp2350.menu.flash.16777216_14680064.build.fs_end=285204480 +generic_rp2350.menu.flash.16777216_12582912=16MB (Sketch: 4MB, FS: 12MB) +generic_rp2350.menu.flash.16777216_12582912.upload.maximum_size=4186112 +generic_rp2350.menu.flash.16777216_12582912.build.flash_total=16777216 +generic_rp2350.menu.flash.16777216_12582912.build.flash_length=4186112 +generic_rp2350.menu.flash.16777216_12582912.build.eeprom_start=285204480 +generic_rp2350.menu.flash.16777216_12582912.build.fs_start=272621568 +generic_rp2350.menu.flash.16777216_12582912.build.fs_end=285204480 +generic_rp2350.menu.flash.16777216_8388608=16MB (Sketch: 8MB, FS: 8MB) +generic_rp2350.menu.flash.16777216_8388608.upload.maximum_size=8380416 +generic_rp2350.menu.flash.16777216_8388608.build.flash_total=16777216 +generic_rp2350.menu.flash.16777216_8388608.build.flash_length=8380416 +generic_rp2350.menu.flash.16777216_8388608.build.eeprom_start=285204480 +generic_rp2350.menu.flash.16777216_8388608.build.fs_start=276815872 +generic_rp2350.menu.flash.16777216_8388608.build.fs_end=285204480 +generic_rp2350.menu.flash.16777216_4194304=16MB (Sketch: 12MB, FS: 4MB) +generic_rp2350.menu.flash.16777216_4194304.upload.maximum_size=12574720 +generic_rp2350.menu.flash.16777216_4194304.build.flash_total=16777216 +generic_rp2350.menu.flash.16777216_4194304.build.flash_length=12574720 +generic_rp2350.menu.flash.16777216_4194304.build.eeprom_start=285204480 +generic_rp2350.menu.flash.16777216_4194304.build.fs_start=281010176 +generic_rp2350.menu.flash.16777216_4194304.build.fs_end=285204480 +generic_rp2350.menu.flash.16777216_2097152=16MB (Sketch: 14MB, FS: 2MB) +generic_rp2350.menu.flash.16777216_2097152.upload.maximum_size=14671872 +generic_rp2350.menu.flash.16777216_2097152.build.flash_total=16777216 +generic_rp2350.menu.flash.16777216_2097152.build.flash_length=14671872 +generic_rp2350.menu.flash.16777216_2097152.build.eeprom_start=285204480 +generic_rp2350.menu.flash.16777216_2097152.build.fs_start=283107328 +generic_rp2350.menu.flash.16777216_2097152.build.fs_end=285204480 generic_rp2350.menu.freq.150=150 MHz generic_rp2350.menu.freq.150.build.f_cpu=150000000L generic_rp2350.menu.freq.50=50 MHz @@ -27537,14 +27837,12 @@ generic_rp2350.menu.freq.275=275 MHz (Overclock) generic_rp2350.menu.freq.275.build.f_cpu=275000000L generic_rp2350.menu.freq.300=300 MHz (Overclock) generic_rp2350.menu.freq.300.build.f_cpu=300000000L -generic_rp2350.menu.psram.0mb=0MByte PSRAM -generic_rp2350.menu.psram.0mb.build.psram_length=0x000000 -generic_rp2350.menu.psram.2mb=2MByte PSRAM -generic_rp2350.menu.psram.2mb.build.psram_length=0x200000 -generic_rp2350.menu.psram.4mb=4MByte PSRAM -generic_rp2350.menu.psram.4mb.build.psram_length=0x400000 -generic_rp2350.menu.psram.8mb=8MByte PSRAM -generic_rp2350.menu.psram.8mb.build.psram_length=0x800000 +generic_rp2350.menu.variantchip.RP2350A=RP2350A +generic_rp2350.menu.variantchip.RP2350A.build.variantdefines=-DPICO_RP2350A=1 +generic_rp2350.menu.variantchip.RP2530B=RP2530B +generic_rp2350.menu.variantchip.RP2530B.build.variantdefines=-DPICO_RP2350B=1 +generic_rp2350.menu.psramcs.GPIOnone=None +generic_rp2350.menu.psramcs.GPIOnone.build.psram_cs= generic_rp2350.menu.psramcs.GPIO0=GPIO 0 generic_rp2350.menu.psramcs.GPIO0.build.psram_cs=-DRP2350_PSRAM_CS=0 generic_rp2350.menu.psramcs.GPIO1=GPIO 1 @@ -27609,6 +27907,46 @@ generic_rp2350.menu.psramcs.GPIO30=GPIO 30 generic_rp2350.menu.psramcs.GPIO30.build.psram_cs=-DRP2350_PSRAM_CS=30 generic_rp2350.menu.psramcs.GPIO31=GPIO 31 generic_rp2350.menu.psramcs.GPIO31.build.psram_cs=-DRP2350_PSRAM_CS=31 +generic_rp2350.menu.psramcs.GPIO32=GPIO 32 +generic_rp2350.menu.psramcs.GPIO32.build.psram_cs=-DRP2350_PSRAM_CS=32 +generic_rp2350.menu.psramcs.GPIO33=GPIO 33 +generic_rp2350.menu.psramcs.GPIO33.build.psram_cs=-DRP2350_PSRAM_CS=33 +generic_rp2350.menu.psramcs.GPIO34=GPIO 34 +generic_rp2350.menu.psramcs.GPIO34.build.psram_cs=-DRP2350_PSRAM_CS=34 +generic_rp2350.menu.psramcs.GPIO35=GPIO 35 +generic_rp2350.menu.psramcs.GPIO35.build.psram_cs=-DRP2350_PSRAM_CS=35 +generic_rp2350.menu.psramcs.GPIO36=GPIO 36 +generic_rp2350.menu.psramcs.GPIO36.build.psram_cs=-DRP2350_PSRAM_CS=36 +generic_rp2350.menu.psramcs.GPIO37=GPIO 37 +generic_rp2350.menu.psramcs.GPIO37.build.psram_cs=-DRP2350_PSRAM_CS=37 +generic_rp2350.menu.psramcs.GPIO38=GPIO 38 +generic_rp2350.menu.psramcs.GPIO38.build.psram_cs=-DRP2350_PSRAM_CS=38 +generic_rp2350.menu.psramcs.GPIO39=GPIO 39 +generic_rp2350.menu.psramcs.GPIO39.build.psram_cs=-DRP2350_PSRAM_CS=39 +generic_rp2350.menu.psramcs.GPIO40=GPIO 40 +generic_rp2350.menu.psramcs.GPIO40.build.psram_cs=-DRP2350_PSRAM_CS=40 +generic_rp2350.menu.psramcs.GPIO41=GPIO 41 +generic_rp2350.menu.psramcs.GPIO41.build.psram_cs=-DRP2350_PSRAM_CS=41 +generic_rp2350.menu.psramcs.GPIO42=GPIO 42 +generic_rp2350.menu.psramcs.GPIO42.build.psram_cs=-DRP2350_PSRAM_CS=42 +generic_rp2350.menu.psramcs.GPIO43=GPIO 43 +generic_rp2350.menu.psramcs.GPIO43.build.psram_cs=-DRP2350_PSRAM_CS=43 +generic_rp2350.menu.psramcs.GPIO44=GPIO 44 +generic_rp2350.menu.psramcs.GPIO44.build.psram_cs=-DRP2350_PSRAM_CS=44 +generic_rp2350.menu.psramcs.GPIO45=GPIO 45 +generic_rp2350.menu.psramcs.GPIO45.build.psram_cs=-DRP2350_PSRAM_CS=45 +generic_rp2350.menu.psramcs.GPIO46=GPIO 46 +generic_rp2350.menu.psramcs.GPIO46.build.psram_cs=-DRP2350_PSRAM_CS=46 +generic_rp2350.menu.psramcs.GPIO47=GPIO 47 +generic_rp2350.menu.psramcs.GPIO47.build.psram_cs=-DRP2350_PSRAM_CS=47 +generic_rp2350.menu.psram.0mb=0MByte PSRAM +generic_rp2350.menu.psram.0mb.build.psram_length=0x000000 +generic_rp2350.menu.psram.2mb=2MByte PSRAM +generic_rp2350.menu.psram.2mb.build.psram_length=0x200000 +generic_rp2350.menu.psram.4mb=4MByte PSRAM +generic_rp2350.menu.psram.4mb.build.psram_length=0x400000 +generic_rp2350.menu.psram.8mb=8MByte PSRAM +generic_rp2350.menu.psram.8mb.build.psram_length=0x800000 generic_rp2350.menu.psramfreq.freq109=109 MHz generic_rp2350.menu.psramfreq.freq109.build.psram_freq=-DRP2350_PSRAM_MAX_SCK_HZ=109000000 generic_rp2350.menu.psramfreq.freq133=133 MHz diff --git a/cores/rp2040/Arduino.h b/cores/rp2040/Arduino.h index 6db94ea7e..8a25ba4df 100644 --- a/cores/rp2040/Arduino.h +++ b/cores/rp2040/Arduino.h @@ -133,8 +133,8 @@ extern const String emptyString; // Template which will evaluate at *compile time* to a single 32b number // with the specified bits set. template -constexpr uint32_t __bitset(const int (&a)[N], size_t i = 0U) { - return i < N ? (1L << a[i]) | __bitset(a, i + 1) : 0; +constexpr uint64_t __bitset(const int (&a)[N], size_t i = 0U) { + return i < N ? (1LL << a[i]) | __bitset(a, i + 1) : 0; } #endif @@ -149,3 +149,12 @@ constexpr uint32_t __bitset(const int (&a)[N], size_t i = 0U) { // PSRAM decorator #define PSRAM __attribute__((section("\".psram\""))) + +// General GPIO/ADC layout info +#ifdef PICO_RP2350B +#define __GPIOCNT 48 +#define __FIRSTANALOGGPIO 40 +#else +#define __GPIOCNT 30 +#define __FIRSTANALOGGPIO 26 +#endif diff --git a/cores/rp2040/PIOProgram.cpp b/cores/rp2040/PIOProgram.cpp index d82de1dbe..42a36f199 100644 --- a/cores/rp2040/PIOProgram.cpp +++ b/cores/rp2040/PIOProgram.cpp @@ -21,6 +21,7 @@ #include #include "PIOProgram.h" #include +#include #if defined(PICO_RP2350) #define PIOS pio0, pio1, pio2 @@ -31,6 +32,8 @@ #endif static std::map __pioMap[PIOCNT]; +static bool __pioAllocated[PIOCNT]; +static bool __pioHighGPIO[PIOCNT]; auto_init_mutex(_pioMutex); PIOProgram::PIOProgram(const pio_program_t *pgm) { @@ -47,16 +50,30 @@ PIOProgram::~PIOProgram() { } // Possibly load into a PIO and allocate a SM -bool PIOProgram::prepare(PIO *pio, int *sm, int *offset) { +bool PIOProgram::prepare(PIO *pio, int *sm, int *offset, int start, int cnt) { CoreMutex m(&_pioMutex); PIO pi[PIOCNT] = { PIOS }; +#if 0 + uint usm; + uint uoff; + auto ret = pio_claim_free_sm_and_add_program_for_gpio_range(_pgm, pio, &usm, &uoff, start, cnt, true); + *sm = usm; + *offset = uoff; + DEBUGV("clain %d\n", ret); + return ret; +#endif + + bool needsHigh = (start + cnt) >= 32; + DEBUGV("PIOProgram %p: Searching for high=%d, pins %d-%d\n", _pgm, needsHigh ? 1 : 0, start, start + cnt - 1); + // If it's already loaded into PIO IRAM, try and allocate in that specific PIO for (int o = 0; o < PIOCNT; o++) { auto p = __pioMap[o].find(_pgm); - if (p != __pioMap[o].end()) { + if ((p != __pioMap[o].end()) && (__pioHighGPIO[o] == needsHigh)) { int idx = pio_claim_unused_sm(pi[o], false); if (idx >= 0) { + DEBUGV("PIOProgram %p: Reusing IMEM ON PIO %p(high=%d) for pins %d-%d\n", _pgm, pi[o], __pioHighGPIO[o] ? 1 : 0, start, start + cnt - 1); _pio = pi[o]; _sm = idx; *pio = pi[o]; @@ -69,19 +86,52 @@ bool PIOProgram::prepare(PIO *pio, int *sm, int *offset) { // Not in any PIO IRAM, so try and add for (int o = 0; o < PIOCNT; o++) { - if (pio_can_add_program(pi[o], _pgm)) { - int idx = pio_claim_unused_sm(pi[o], false); - if (idx >= 0) { - int off = pio_add_program(pi[o], _pgm); - __pioMap[o].insert({_pgm, off}); - _pio = pi[o]; - _sm = idx; - *pio = pi[o]; - *sm = idx; - *offset = off; - return true; + if (__pioAllocated[o] && (__pioHighGPIO[o] == needsHigh)) { + DEBUGV("PIOProgram: Checking PIO %p\n", pi[o]); + if (pio_can_add_program(pi[o], _pgm)) { + int idx = pio_claim_unused_sm(pi[o], false); + if (idx >= 0) { + DEBUGV("PIOProgram %p: Adding IMEM ON PIO %p(high=%d) for pins %d-%d\n", _pgm, pi[o], __pioHighGPIO[o] ? 1 : 0, start, start + cnt - 1); + int off = pio_add_program(pi[o], _pgm); + __pioMap[o].insert({_pgm, off}); + _pio = pi[o]; + _sm = idx; + *pio = pi[o]; + *sm = idx; + *offset = off; + return true; + } else { + DEBUGV("PIOProgram: can't claim unused SM\n"); + } + } else { + DEBUGV("PIOProgram: can't add program\n"); } + } else { + DEBUGV("PIOProgram: Skipping PIO %p, wrong allocated/needhi\n", pi[o]); + } + } + + // No existing PIOs can meet, is there an unallocated one we can allocate? + PIO p; + uint idx; + uint off; + auto rc = pio_claim_free_sm_and_add_program_for_gpio_range(_pgm, &p, &idx, &off, start, cnt, true); + if (rc) { + int o = 0; + while (p != pi[o]) { + o++; } + assert(!__pioAllocated[o]); + __pioAllocated[o] = true; + __pioHighGPIO[o] = needsHigh; + DEBUGV("PIOProgram %p: Allocating new PIO %p(high=%d) for pins %d-%d\n", _pgm, pi[o], __pioHighGPIO[o] ? 1 : 0, start, start + cnt - 1); + __pioMap[o].insert({_pgm, off}); + _pio = pi[o]; + _sm = idx; + *pio = pi[o]; + *sm = idx; + *offset = off; + return true; } // Nope, no room either for SMs or INSNs diff --git a/cores/rp2040/PIOProgram.h b/cores/rp2040/PIOProgram.h index 602f170b9..ee452ef60 100644 --- a/cores/rp2040/PIOProgram.h +++ b/cores/rp2040/PIOProgram.h @@ -28,7 +28,7 @@ class PIOProgram { PIOProgram(const pio_program_t *pgm); ~PIOProgram(); // Possibly load into a PIO and allocate a SM - bool prepare(PIO *pio, int *sm, int *offset); + bool prepare(PIO *pio, int *sm, int *offset, int gpio_start = 0, int gpio_cnt = 1); private: const pio_program_t *_pgm; diff --git a/cores/rp2040/SerialPIO.cpp b/cores/rp2040/SerialPIO.cpp index 8ff270c91..6860eba20 100644 --- a/cores/rp2040/SerialPIO.cpp +++ b/cores/rp2040/SerialPIO.cpp @@ -33,6 +33,7 @@ static std::map _rxMap; // Duplicate a program and replace the first insn with a "set x, repl" static pio_program_t *pio_make_uart_prog(int repl, const pio_program_t *pg) { pio_program_t *p = new pio_program_t; + memcpy(p, pg, sizeof(*p)); p->length = pg->length; p->origin = pg->origin; uint16_t *insn = (uint16_t *)malloc(p->length * 2); @@ -193,7 +194,7 @@ void SerialPIO::begin(unsigned long baud, uint16_t config) { _txBits = _bits + _stop + (_parity != UART_PARITY_NONE ? 1 : 0) + 1/*start bit*/; _txPgm = _getTxProgram(_txBits); int off; - if (!_txPgm->prepare(&_txPIO, &_txSM, &off)) { + if (!_txPgm->prepare(&_txPIO, &_txSM, &off, _tx, 1)) { DEBUGCORE("ERROR: Unable to allocate PIO TX UART, out of PIO resources\n"); // ERROR, no free slots return; @@ -221,7 +222,7 @@ void SerialPIO::begin(unsigned long baud, uint16_t config) { _rxBits = 2 * (_bits + _stop + (_parity != UART_PARITY_NONE ? 1 : 0) + 1) - 1; _rxPgm = _getRxProgram(_rxBits); int off; - if (!_rxPgm->prepare(&_rxPIO, &_rxSM, &off)) { + if (!_rxPgm->prepare(&_rxPIO, &_rxSM, &off, _rx, 1)) { DEBUGCORE("ERROR: Unable to allocate PIO RX UART, out of PIO resources\n"); return; } diff --git a/cores/rp2040/SerialUART.cpp b/cores/rp2040/SerialUART.cpp index 4ebba4b74..cf85a0d8b 100644 --- a/cores/rp2040/SerialUART.cpp +++ b/cores/rp2040/SerialUART.cpp @@ -32,10 +32,16 @@ extern void serialEvent1() __attribute__((weak)); extern void serialEvent2() __attribute__((weak)); bool SerialUART::setRX(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({1, 13, 17, 29}) /* UART0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({1, 13, 17, 29, 33, 45}) /* UART0 */, + __bitset({5, 9, 21, 25, 37, 41}) /* UART1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({1, 13, 17, 29}) /* UART0 */, __bitset({5, 9, 21, 25}) /* UART1 */ }; - if ((!_running) && ((1 << pin) & valid[uart_get_index(_uart)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[uart_get_index(_uart)])) { _rx = pin; return true; } @@ -53,10 +59,16 @@ bool SerialUART::setRX(pin_size_t pin) { } bool SerialUART::setTX(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({0, 12, 16, 28}) /* UART0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({0, 12, 16, 28, 32, 44}) /* UART0 */, + __bitset({4, 8, 20, 24, 36, 40}) /* UART1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({0, 12, 16, 28}) /* UART0 */, __bitset({4, 8, 20, 24}) /* UART1 */ }; - if ((!_running) && ((1 << pin) & valid[uart_get_index(_uart)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[uart_get_index(_uart)])) { _tx = pin; return true; } @@ -74,10 +86,16 @@ bool SerialUART::setTX(pin_size_t pin) { } bool SerialUART::setRTS(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({3, 15, 19}) /* UART0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({3, 15, 19, 31, 35, 47}) /* UART0 */, + __bitset({7, 11, 23, 27, 39, 43}) /* UART1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({3, 15, 19}) /* UART0 */, __bitset({7, 11, 23, 27}) /* UART1 */ }; - if ((!_running) && ((pin == UART_PIN_NOT_DEFINED) || ((1 << pin) & valid[uart_get_index(_uart)]))) { +#endif + if ((!_running) && ((pin == UART_PIN_NOT_DEFINED) || ((1LL << pin) & valid[uart_get_index(_uart)]))) { _rts = pin; return true; } @@ -95,10 +113,16 @@ bool SerialUART::setRTS(pin_size_t pin) { } bool SerialUART::setCTS(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({2, 14, 18}) /* UART0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({2, 14, 18, 30, 34, 46}) /* UART0 */, + __bitset({6, 10, 22, 26, 38, 42}) /* UART1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({2, 14, 18}) /* UART0 */, __bitset({6, 10, 22, 26}) /* UART1 */ }; - if ((!_running) && ((pin == UART_PIN_NOT_DEFINED) || ((1 << pin) & valid[uart_get_index(_uart)]))) { +#endif + if ((!_running) && ((pin == UART_PIN_NOT_DEFINED) || ((1LL << pin) & valid[uart_get_index(_uart)]))) { _cts = pin; return true; } diff --git a/cores/rp2040/Tone.cpp b/cores/rp2040/Tone.cpp index a6355892b..a7888dbcd 100644 --- a/cores/rp2040/Tone.cpp +++ b/cores/rp2040/Tone.cpp @@ -56,7 +56,7 @@ int64_t _stopTonePIO(alarm_id_t id, void *user_data) { } void tone(uint8_t pin, unsigned int frequency, unsigned long duration) { - if (pin > 29) { + if (pin >= __GPIOCNT) { DEBUGCORE("ERROR: Illegal pin in tone (%d)\n", pin); return; } @@ -81,7 +81,7 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) { newTone = new Tone(); newTone->pin = pin; pinMode(pin, OUTPUT); - if (!_tone2Pgm.prepare(&newTone->pio, &newTone->sm, &newTone->off)) { + if (!_tone2Pgm.prepare(&newTone->pio, &newTone->sm, &newTone->off, pin, 1)) { DEBUGCORE("ERROR: tone unable to start, out of PIO resources\n"); // ERROR, no free slots delete newTone; @@ -118,7 +118,7 @@ void tone(uint8_t pin, unsigned int frequency, unsigned long duration) { void noTone(uint8_t pin) { CoreMutex m(&_toneMutex); - if ((pin > 29) || !m) { + if ((pin > __GPIOCNT) || !m) { DEBUGCORE("ERROR: Illegal pin in tone (%d)\n", pin); return; } diff --git a/cores/rp2040/pio_uart.pio b/cores/rp2040/pio_uart.pio index 9a7a24b58..629126c21 100644 --- a/cores/rp2040/pio_uart.pio +++ b/cores/rp2040/pio_uart.pio @@ -44,8 +44,8 @@ wait_bit: static inline void pio_tx_program_init(PIO pio, uint sm, uint offset, uint pin_tx) { // Tell PIO to initially drive output-high on the selected pin, then map PIO // onto that pin with the IO muxes. - pio_sm_set_pins_with_mask(pio, sm, 1u << pin_tx, 1u << pin_tx); - pio_sm_set_pindirs_with_mask(pio, sm, 1u << pin_tx, 1u << pin_tx); + pio_sm_set_set_pins(pio, sm, pin_tx, 1); + pio_sm_set_consecutive_pindirs(pio, sm, pin_tx, 1, true); pio_gpio_init(pio, pin_tx); pio_sm_config c = pio_tx_program_get_default_config(offset); diff --git a/cores/rp2040/pio_uart.pio.h b/cores/rp2040/pio_uart.pio.h index 394c1724b..6ab4c7268 100644 --- a/cores/rp2040/pio_uart.pio.h +++ b/cores/rp2040/pio_uart.pio.h @@ -48,8 +48,8 @@ static inline pio_sm_config pio_tx_program_get_default_config(uint offset) { static inline void pio_tx_program_init(PIO pio, uint sm, uint offset, uint pin_tx) { // Tell PIO to initially drive output-high on the selected pin, then map PIO // onto that pin with the IO muxes. - pio_sm_set_pins_with_mask(pio, sm, 1u << pin_tx, 1u << pin_tx); - pio_sm_set_pindirs_with_mask(pio, sm, 1u << pin_tx, 1u << pin_tx); + pio_sm_set_set_pins(pio, sm, pin_tx, 1); + pio_sm_set_consecutive_pindirs(pio, sm, pin_tx, 1, true); pio_gpio_init(pio, pin_tx); pio_sm_config c = pio_tx_program_get_default_config(offset); // OUT shifts to right, no autopull diff --git a/cores/rp2040/psram.cpp b/cores/rp2040/psram.cpp index e542cd3b7..aab0a51f4 100644 --- a/cores/rp2040/psram.cpp +++ b/cores/rp2040/psram.cpp @@ -332,6 +332,9 @@ static bool __psram_heap_init() { return true; } + if (!__psram_heap_size) { + return false; + } _mem_heap = NULL; _mem_psram_pool = NULL; _mem_heap = tlsf_create_with_pool((void *)&__psram_heap_start__, __psram_heap_size, 16 * 1024 * 1024); diff --git a/cores/rp2040/wiring_analog.cpp b/cores/rp2040/wiring_analog.cpp index 0fba463c2..a4f5f6976 100644 --- a/cores/rp2040/wiring_analog.cpp +++ b/cores/rp2040/wiring_analog.cpp @@ -30,7 +30,7 @@ void __clearADCPin(pin_size_t p); static uint32_t analogScale = 255; static uint32_t analogFreq = 1000; -static uint32_t pwmInitted = 0; +static uint64_t pwmInitted = 0; static bool scaleInitted = false; static bool adcInitted = false; static uint16_t analogWritePseudoScale = 1; @@ -79,7 +79,7 @@ extern "C" void analogWriteResolution(int res) { extern "C" void analogWrite(pin_size_t pin, int val) { CoreMutex m(&_dacMutex); - if ((pin > 29) || !m) { + if ((pin >= __GPIOCNT) || !m) { DEBUGCORE("ERROR: Illegal analogWrite pin (%d)\n", pin); return; } @@ -101,12 +101,12 @@ extern "C" void analogWrite(pin_size_t pin, int val) { } scaleInitted = true; } - if (!(pwmInitted & (1 << pwm_gpio_to_slice_num(pin)))) { + if (!(pwmInitted & (1LL << pwm_gpio_to_slice_num(pin)))) { pwm_config c = pwm_get_default_config(); pwm_config_set_clkdiv(&c, clock_get_hz(clk_sys) / ((float)analogScale * analogFreq)); pwm_config_set_wrap(&c, analogScale - 1); pwm_init(pwm_gpio_to_slice_num(pin), &c, true); - pwmInitted |= 1 << pwm_gpio_to_slice_num(pin); + pwmInitted |= 1LL << pwm_gpio_to_slice_num(pin); } val <<= analogWritePseudoScale; @@ -125,17 +125,17 @@ extern "C" void analogWrite(pin_size_t pin, int val) { auto_init_mutex(_adcMutex); static uint8_t _readBits = 10; static uint8_t _lastADCMux = 0; -static uint32_t _adcGPIOInit = 0; +static uint64_t _adcGPIOInit = 0; void __clearADCPin(pin_size_t p) { - _adcGPIOInit &= ~(1 << p); + _adcGPIOInit &= ~(1LL << p); } extern "C" int analogRead(pin_size_t pin) { CoreMutex m(&_adcMutex); - pin_size_t maxPin = max(A0, A3); - pin_size_t minPin = min(A0, A3); + pin_size_t maxPin = __GPIOCNT; + pin_size_t minPin = __FIRSTANALOGGPIO; if ((pin < minPin) || (pin > maxPin) || !m) { DEBUGCORE("ERROR: Illegal analogRead pin (%d)\n", pin); @@ -145,9 +145,9 @@ extern "C" int analogRead(pin_size_t pin) { adc_init(); adcInitted = true; } - if (!(_adcGPIOInit & (1 << pin))) { + if (!(_adcGPIOInit & (1LL << pin))) { adc_gpio_init(pin); - _adcGPIOInit |= 1 << pin; + _adcGPIOInit |= 1LL << pin; } if (_lastADCMux != pin) { adc_select_input(pin - minPin); @@ -169,7 +169,7 @@ extern "C" float analogReadTemp(float vref) { _lastADCMux = 0; adc_set_temp_sensor_enabled(true); delay(1); // Allow things to settle. Without this, readings can be erratic - adc_select_input(4); // Temperature sensor + adc_select_input(__GPIOCNT - __FIRSTANALOGGPIO); // Temperature sensor int v = adc_read(); adc_set_temp_sensor_enabled(false); float t = 27.0f - ((v * vref / 4096.0f) - 0.706f) / 0.001721f; // From the datasheet diff --git a/cores/rp2040/wiring_digital.cpp b/cores/rp2040/wiring_digital.cpp index 277f70189..a5b300e8b 100644 --- a/cores/rp2040/wiring_digital.cpp +++ b/cores/rp2040/wiring_digital.cpp @@ -23,10 +23,15 @@ extern void __clearADCPin(pin_size_t p); -static PinMode _pm[30]; +static PinMode _pm[__GPIOCNT]; extern "C" void pinMode(pin_size_t ulPin, PinMode ulMode) __attribute__((weak, alias("__pinMode"))); extern "C" void __pinMode(pin_size_t ulPin, PinMode ulMode) { + if (ulPin >= __GPIOCNT) { + DEBUGCORE("ERROR: Illegal pin in pinMode (%d)\n", ulPin); + return; + } + switch (ulMode) { case INPUT: gpio_init(ulPin); @@ -72,20 +77,16 @@ extern "C" void __pinMode(pin_size_t ulPin, PinMode ulMode) { return; } - if (ulPin > 29) { - DEBUGCORE("ERROR: Illegal pin in pinMode (%d)\n", ulPin); - return; - } _pm[ulPin] = ulMode; - if ((ulPin >= std::min(A0, A3)) && (ulPin <= std::max(A0, A3))) { + if (ulPin >= __FIRSTANALOGGPIO) { __clearADCPin(ulPin); } } extern "C" void digitalWrite(pin_size_t ulPin, PinStatus ulVal) __attribute__((weak, alias("__digitalWrite"))); extern "C" void __digitalWrite(pin_size_t ulPin, PinStatus ulVal) { - if (ulPin > 29) { + if (ulPin >= __GPIOCNT) { DEBUGCORE("ERROR: Illegal pin in pinMode (%d)\n", ulPin); return; } @@ -109,7 +110,7 @@ extern "C" void __digitalWrite(pin_size_t ulPin, PinStatus ulVal) { extern "C" PinStatus digitalRead(pin_size_t ulPin) __attribute__((weak, alias("__digitalRead"))); extern "C" PinStatus __digitalRead(pin_size_t ulPin) { - if (ulPin > 29) { + if (ulPin >= __GPIOCNT) { DEBUGCORE("ERROR: Illegal pin in digitalRead (%d)\n", ulPin); return LOW; } diff --git a/cores/rp2040/wiring_pulse.cpp b/cores/rp2040/wiring_pulse.cpp index ee1e2405a..610f3712f 100644 --- a/cores/rp2040/wiring_pulse.cpp +++ b/cores/rp2040/wiring_pulse.cpp @@ -26,7 +26,7 @@ extern "C" unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeo uint64_t start = time_us_64(); uint64_t abort = start + timeout; - if (pin > 29) { + if (pin >= __GPIOCNT) { DEBUGCORE("ERROR: Illegal pin in pulseIn (%d)\n", pin); return 0; } diff --git a/cores/rp2040/wiring_shift.cpp b/cores/rp2040/wiring_shift.cpp index 16ba7c754..cccdfcf28 100644 --- a/cores/rp2040/wiring_shift.cpp +++ b/cores/rp2040/wiring_shift.cpp @@ -24,11 +24,11 @@ extern "C" uint8_t shiftIn(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOrder) { uint8_t value = 0; uint8_t i; - if (dataPin > 29) { + if (dataPin >= __GPIOCNT) { DEBUGCORE("ERROR: Illegal dataPin in shiftIn (%d)\n", dataPin); return 0; } - if (clockPin > 29) { + if (clockPin >= __GPIOCNT) { DEBUGCORE("ERROR: Illegal clockPin in shiftIn (%d)\n", clockPin); return 0; } @@ -46,11 +46,11 @@ extern "C" uint8_t shiftIn(pin_size_t dataPin, pin_size_t clockPin, BitOrder bit extern "C" void shiftOut(pin_size_t dataPin, pin_size_t clockPin, BitOrder bitOrder, uint8_t val) { uint8_t i; - if (dataPin > 29) { + if (dataPin >= __GPIOCNT) { DEBUGCORE("ERROR: Illegal dataPin in shiftOut (%d)\n", dataPin); return; } - if (clockPin > 29) { + if (clockPin >= __GPIOCNT) { DEBUGCORE("ERROR: Illegal clockPin in shiftOut (%d)\n", clockPin); return; } diff --git a/docs/contrib.rst b/docs/contrib.rst index 8c8f7a757..4eb4a5d29 100644 --- a/docs/contrib.rst +++ b/docs/contrib.rst @@ -89,6 +89,43 @@ code that only runs on this core, use the following define. ~~~ your changes ~~~ #endif +Identifying RP2040, RP2530A, or RP2350B +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To check if a board is an original RP2040 + +.. code:: cpp + + #if defined(PICO_RP2040) + ...OG Pico code... + #endif + +For RP2350(A or B): + +.. code:: cpp + + #if defined(PICO_RP2350) + ...Pico 2 code... + #endif + +For only RP2350A variants (using the compile options, not the onboard ID register): + +.. code:: cpp + + #if defined(PICO_RP2350) && !defined(PICO_RP2350B) + ...RP2350A only code... + #endif + +For only RP2350B variants (again, at compile time as identified by the selected board +and not the chip ID register): + +.. code:: cpp + + #if defined(PICO_RP2350B) + ...48-GPIO version code here + #endif + + Library Architectures ~~~~~~~~~~~~~~~~~~~~~ @@ -98,3 +135,4 @@ not know your new code is compatible here. Add ``rp2040`` to ``architectures`` (in ``library.properties``) and ``"rp2040"`` to ``platforms[]`` (in ``library.json``) to let the tools know. +Note that even the RP2350 is identified as ``rp2040`` for this purpose. diff --git a/include/rp2350/pico_base/pico/config_autogen.h b/include/rp2350/pico_base/pico/config_autogen.h index 1985dea28..e69f1ace6 100644 --- a/include/rp2350/pico_base/pico/config_autogen.h +++ b/include/rp2350/pico_base/pico/config_autogen.h @@ -4,7 +4,7 @@ // based on PICO_CONFIG_HEADER_FILES: -#include "../../pico-sdk/src/boards/include/boards/pico2.h" +#include "../../pico-sdk/src/boards/include/boards/solderparty_rp2350_stamp_xl.h" #include "../../pico-sdk/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h" // based on PICO_RP2350_ARM_S_CONFIG_HEADER_FILES: diff --git a/lib/core_inc.txt b/lib/core_inc.txt index 527381640..c656c5b48 100644 --- a/lib/core_inc.txt +++ b/lib/core_inc.txt @@ -2,6 +2,7 @@ -iwithprefixbefore/pico-sdk/lib/tinyusb/src -iwithprefixbefore/pico-sdk/src/boards/include +-iwithprefixbefore/pico-sdk/src/common/hardware_claim/include -iwithprefixbefore/pico-sdk/src/common/pico_base/include -iwithprefixbefore/pico-sdk/src/common/pico_base_headers/include -iwithprefixbefore/pico-sdk/src/common/pico_binary_info/include @@ -19,7 +20,6 @@ -iwithprefixbefore/pico-sdk/src/rp2_common/hardware_adc/include -iwithprefixbefore/pico-sdk/src/rp2_common/hardware_base/include -iwithprefixbefore/pico-sdk/src/rp2_common/hardware_boot_lock/include --iwithprefixbefore/pico-sdk/src/rp2_common/hardware_claim/include -iwithprefixbefore/pico-sdk/src/rp2_common/hardware_clocks/include -iwithprefixbefore/pico-sdk/src/rp2_common/hardware_divider/include -iwithprefixbefore/pico-sdk/src/rp2_common/hardware_dma/include diff --git a/lib/rp2040/libipv4-big.a b/lib/rp2040/libipv4-big.a index 4da294deca98b6e6a7e553b1144fd9ca8506e3f0..7058fabe65de0fa6f65e159e8f43f36590ac799c 100644 GIT binary patch delta 3026 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 diff --git a/lib/rp2040/libipv4-bt-big.a b/lib/rp2040/libipv4-bt-big.a index d793366a0dbaf9d1299e7acd85311ebbf135ffce..ee05065a3d24035ac39988a8bd1a5f1983b03ddc 100644 GIT binary patch delta 5441 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 delta 5441 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 diff --git a/lib/rp2040/libipv4-ipv6-big.a b/lib/rp2040/libipv4-ipv6-big.a index 504533bdacf464e03f85353fedbb623c42f8951b..9d0b3428388ffcbad7645533e80d00d584772aed 100644 GIT binary patch delta 2865 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 KsEQgc&-@>|cj&7C delta 5474 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 XatsG6S-6y1A0bvBbNq|zd#C;nw3YP@ diff --git a/lib/rp2040/libipv4-ipv6-bt.a b/lib/rp2040/libipv4-ipv6-bt.a index 76f7dca35d27e3fe88c7be4110b61ef856635fa4..c628c4342db25ec53f3c8bdee31835da95a283ba 100644 GIT binary patch delta 5415 zcmZvgc~}%z62L!Dj&Kh!O!qM8Faslp97BZQ2@);|kr@Q&dP z?z_!5r`$zr%W;cOw^&Dn&PG2|eTPy854Tu+`6mIP;D;v`@lO*nq)nqhA8P63ObFI` zG0O5s2_Y7PUKG5lx7@h{6K$yJkRpUKhJS5|))cg+qGg4aHH3d{V`oS7u%)cqHk}R} z*;i(uAbirMAeD$T-IB`Sc%tp}tArd%36vSfyq>DCbf>2#b|fG@Olc);1EYo(c&Cl5@_B{Y9kiN9TwH5gCeb=}#tP;pie7 zPHuG>m_rCkAq7WHyY%yRnB#!$qb_fn_hS5sTQ8}aO0@LjGb#AILXr_q2)3htTe69l zX65HWCj>@aCFWv46k@Y5~n zIzAMf&4#yp*2EIyBaar{y!+^Jg~A zNXMcwhl2YnJh!bOI}O{S%6p^Nvws~SSf)Nqv1g^wOsGlm=ox{-v?(WDsbh09IH;J# zyM@n9`Ke<1W}$l4GB268UOzBlSa~3ls5ePb{X8Z2&M6^;xq+ae!F$jHbbGZY>1;dWIW??I&C&x-Vr zwR1wi_S={|v2QR?q`pGLP-~RK>GkR%5qPiqH{jsr-+-M)5ul-NmpWct!Ncd(SC*4% z#5Fyn^!c9eZ}s6CbdSE~Gl%a!sQ;p=;;7F$DVIs)91W+=`b_$p0Rm5R;wWcuCw+-!w{ z?r{H1b`(ZRIG2$L{%-7u!Vo5x#RdNN9Eo?>uwjG$#vwu^w!suQ#so}GBc!P(NDk`! zfLErnTkU6NijN8d-r6DDdi#Tb5?`W%Z&fKB*cc&D=|~Bj{#TL2#J#}wB!NWl?3u<6 zkwo$MOgTH=AotOIL%|_s(7_jp48DP~nu9`o2*E>9YfsP)cA7(4*q5|(K?Q+C1_yoh zeozFTO~#H1O>;A0scrC^o?KkYTqOk#KEb>GOEhsxI}{-!PK00&x&lM~ohBmh)`v{- z;mmZ?p0sh`NC*rZ2@U>+h~c`R8?~11gkV#V2ee-*L?jfn-}2#Mnb5DaHmivY8(wS} zH{!AZ)9`&_*nl6A!FydT3k%@)!o;gFteiZGIM#O$ge`fW^SUJ^kTNP3KaJKbw8GJf zKfd5F-qu6d48*E|=kd7x{afBskY zPo}y|tKTV~33<&6il%WI*u7hw3!Imk0Syw@sFxCjpe-Y+Y8D5!^m@_|w=3%AT9O8w zs<q zO7I!TjP7CC;2xGULMr1MTNMp-Wln*Pvjp|MIWLh+c4wl0y{&RfV}w@UO~`$guMqrA zz#%{PBDoNi3I4QkqBa*MYV*dq$IPTF@Tb9Qb6#r`aTr&`fJ;6MxD>QL;>_#N`>b)F z?F(qFgnhP!r5_M+{1HKQx^SpbC@P6t1(LX;E2A95{#pdD-p2JkEufJk_!I75=1gsfwCYJFhjF0B5aqbh5hrh1z#H6lB+~ zEr=mju+H_)wI@h2nZ!WbleNJ=2}Ag0avl6KS?V!KAd@NW59=rEIWR_hqb9a~gJl*6 zS`;CuNnPA9&VD)5vL_3b$z^*#5^OF5A8C1%MnEX2pId$}fDq;cV8^QR(_CvajoEw9 zQ2b8$9@292(E9?&`^&GBhm(2SKzgP8iZ|yA238NtHDrXsDoGv{*ST?CYr-FU;-*z( z@EfE_ZPC*(zc-3%_yY-0OV#6jr<9MgxcMMfz zz{|UXzS$VA8$3vD;#|HxVMr|%=8|4nrD+gtoOQcO20US=+C44R`BFldjZA2)4TO0o zsxPu1pU^Sn$5v9{`%U#hSI#=F`r+~FM!wjviw%}FVcc6D4nqc?B-Vs*!xk5qcTvs7 G8UF|QfBGH( delta 5508 zcmZvgd0bW17RNt;C^BE*a?fGvaxWl*4EF|zV1k5*WWvQ5ViXh+P(YBWat>~34&;kd z_O$equcw9zrOOGGLX8v&URL%jC3}WLB`Wwb`}FqN_pHM?e%>GZ559M;-(G9&X&vrt z|Iy+O8LK}r`)2j{h;UtGco?TBPhwzXwb^$sTk_=T)(Z>+cOIL~dRp>#YM8l$1N}Rk zJI%T?@Jg)tZwdjd?k3Bd(g0VL`??GAzj$4-r=}j3hIOfN|!Vv504P(F!7JX=) zUNr_7_*P}Jpj`koiL4$Qhe=ZK>Rp=xjRYKaw#`&ZC6@c!o@!a5c<4LQDp)6hs}Rx0Yop~=p5jtpF`QDjF5D%8ZVN3n7o%JRGA zPMcziN&wfaG%U=%pFi@#?WjA+B2Q<#Y&l7U{o-9l~c)Ua+?Xxku#9A$EUF{ezx+W$AdS3tu7wx9ON>Dx7+(OprNq!FyQ) zRF89Q#PX%?t7eT8ZCzoat*X_-q@&}=0;=GIze;r)3E5mKxI3h>xh^DsusDzb<^pp) z1x?m;ljIo>_MvbCgmEoDDOm{F%k~IC=r}6l(!rkkRgiHkPhw&CeYY?0)LuIf#lmIQ z{ZTCH(xTpd(S1XijJ)0LetxNptk!#MU1%a<99`ou&g0<}VW!l3lUZ72Q*HYCJi@UE zGzjl+JiJ!PymK==Ro)W9!khJ;O(}vNA1G&+r8PkFInP=#!NGBSfGloGs5)F+T$(NU z?UbCnGF|<%qtqW(r#xZ9D`s%}A1FsShcLAze3YfG6!#M^%U!5br@{IHb*Wt2u|)lu zm^E1=VGGAss&Na`^FYpUo%)z)=v|;@VE0P(Jsl=W2+P@LX;b;MT*0GVT_Cr9=ZJcn zzr>mW!=QRwlxZ2>s;XsSqMLVqIa<(bu&K#AV;vH*F&X&XO7p4kqUg9aM@STxb2K{= z(S}A5lB!LG8@n{iqyey8ex^Frv}yj@tHGMyYd zTs>3rTyQG6B&f?D!>$$C0>X0QvG&=PmFL`3D;~`n@^<@_cvAT{M2Vuc*g~sFYoyDxu6Zz zIbr78=Zs{S^=4p?(s#dbtkuFAPMC^Gg(Ofvycc47?NJcS9rd`g@k&9||O0DjNn4mHC;A@zIFCTH%)?Rc2vs ztKaJ}!Zp2xZyrbb{oZsHWoi^E_+ZG-;b$bYIQ@N-oT88nI%-)kxANaDE-$q? z7pF561u$^bBlLznk`^VYbZ1cLKspi{(no7TEqss=9md$ZI~00%hlN~2O6{0torQQZ zD2dvp`?uI3Q4$8a>!KE&Pj^K(elhBp@=MUyiWw6x25u(lFN*IO)%j|fK1e>7N3*_0 zBs)`r7--w3Py5)UtmjC!tkG-k(`1B`5kW>I8B@S(Zd7L>&flM;XN`{zM8Ts2QwujB z<#UF{nCP{78DT4;-9k~HKlet%_GmI<$e0F(?a!S33+)wFAq-c#uQ~|kZ=YTw?#cGz zKo$ISe7Zvh8V(+aVnE>(yEaKi+OuQp!jaH+c;@EVAD1AZWlMY<+bEWeU+zO!;>!Kd zgs%U>NpTi6Na$2e+u~dkkeD^=$d33S?uJlDJ;yhw#uNAB;KcnI$CsfU4f}7!@#V{r zP%Y2z;x*5hh@RscHe;^pS;$o-d?qGS7!%FH^!W*vVQ5D`qYJkrtTiIxJ)4=ChnYlY zp%K$@bjC3MM2l3}jE06pSK;%6+_U^wLetSiw``eBr}L~EVpRMWlCjG$3%U$R$t>E@ zR?xpZsr+>rIrt#S_^gb)5HSY!6kY%-D|d+52~67;6^ z*_|@ymUubRXxlR9j0$H>&(R&!)i%f2)%H9YbD^s(<%Zg%pr@Y!#_o$L(0wuWBAQS*CV0o zH+AXLTae7Kc3~m$v-Hy4NcdOC*t<9bdKYI7KboBbN3(MyJCM>mZSC@$tz=}HGVi!>=&ID$8{sLhy>0wQG{#vo59yHFsFPuVRcgmK05wDuRM=T&srq{6$dL4`QK16T+bJqBl)dDgW!dq6w6^HN_ zqRW8y$>M=#B-Bp0K|4xD{wi}53Eyi%@R{-s@x;=Q{v0Wf7rqwAy7D%8jZ2Eel2P*g@g;}F zvhoqY!N*HNAK_dykv~V5!k?oRuA@ll+phbia&!%nK`RXdGb^jibCFP+;`3GaRwJQt z*Unk?=I2Q0&hk-K#|k$fjgp16G1b2Wq7A6@)Ivv{30GEGXs}lDsE$W_;+O!I^p+#jE z*7-Fdp_Av{tWyCJs$Mbe|1_?z7=V0)^dZ-P~viX8s!9vz$U6Vy^J@h@vV6 z0S7crZ;x5bGVrL;9q5a3uculbv~5hB2+t~GU(2A7mq6v8#Ad(Br8;*RO>pW) z?2l6!1X!_m+%Qj#rEwk13NEY&s~Y0gFi-BICSi-7$~Gr_)O!RMv++|4FI0{skO zwVruEdG(G&*jXfaL<)IHy&hEvi)S$@wI*v$3uny?KseSSw6#x&M}p3#hqfMJMHv54 z62m;_NUg;h|0_2^x6|<6MrwsfKuN%m{W61K$ACeX zNl)2?!tbr|A-NpVI=6d%d~BfxxfDgcA0k8@j_=sTA+4bv%^Ed$fhy(zR-Cqwp0ZHY z2eKamTa0Bq0l+z3;3uRsV1eT8Lju`=8R=yL*(k3|E=8RdiyqSV8rFb!s8;&0_ z!to=cQ4);@UnMof%C6A~Cn_^EJRY4^Y4o{r&B5IqM!dk93&SVj}Of) zD239BFs%t(3LKatUA<2g6mmOvO){Nhx6?;h+}v*Zhp?zprm@%>l32HhD!K?Xr6RGT zf*M8#oXIBe{+3w(E{{-a^IN&*!Lbw?3pZ-avu8Q!`;$V)QOFGeXL8d!^hCoisY}kE%Xzt- zyyv0zyW;af@h>U7S$(9sUv;PO^7}}MGVi3^W|Pi`aB8%~8y^RYs=a}5Z~TQ~43=E$68G^8BKRgyKGys)4RS{vu>43Y6<1WZ^S|Z#m zPbhfP!kKcB(oR`mX-U^EnG0X7sEP59Rg)*k%zjJeZHaQbHssKwJvFFGvdx4Wr{vWvQcqCBbe;<~ zh-XF5kQAn24eY)qFC2n!|Cc~bkGwJn!mL7ZU$A*BRf@ED3kHJ2(fUhy5)7%LfCo2c z)=PrJlS2=W!);|@wALw2#za^r*t&)RIJef0`MQZtx*J@pRRZm<`1vPe*%b37sYo9eh=l*7a#^8z-xgjv(5laA&( zHjQT%0Y4RAC(zSa!0)-^4*QLeQM)`XJ}0=KM*?YIuwrBZ-Z9IvmD3MxE}RG+jx+w6{`WOwx&@;qZTVFF{Rqr*l%Xun_cT4o9z3|cmBTP zz0T&Zb)ES0J*p1L5`}EH*Soi7bOrq{mG`8v`iLhw$-p}C-v#@7lglY_|wCrzUQJYQ6o^)9Xt?8^j*?@hrtNB zzTo`n1aeComphEm9TbvsoIs-FD`kyq2Tz8;;K|SuMpIs07Rkbl-$I9$5=c<(6~7Ty zQctA-qh7X$oOs|H!X3_FnE;V*e^PCP#a-cZZS=G1{N4}YCGpgxoMOef@DrVyLB1+t zq+K~7hY}hz!o+_gPK?uxSUU_XSap#%rf3ibVFdfsNG*B+F#2hYet}Y!g*(4QPG$)t zs<9N`iQIcZliD~T2F>(FEp!sdC5N|rILft#0+J&0q%QjPjHjXM&!V$m)1dyX1``~+ z8vWB$3IQtKc!`_@)l7S3OdmCawKc+uwwP7a6@S3QY|s-0QE4F9nap@aYNOM{u%MsL ztfWFNDX-O$2wO@Rw~+|B)sj7^WfsmP5ayHstBx}#%@mL@+7jvGVJ1#ubT&Qo3^B_> zw2uniMZ?Sm3c2M-Um0bB)YcVwv3VzXZ+kO-Sc zV|AHN3mmb=1?6gx(!PUp6WfUA`HEfzhb?=mbQxF9pR_RxL<9NHf* zC8=F6NW0}Rt{aF?II0F9V6l~%YfT8hP9s#ya{7JawL+qY)55~(AB|&V*!e6;_6mG4 zyDWsr!0uA^;$33HD=7oIb+YLc9Z=*#?%pT)BMhd*{VW6no84`BJUs6=8B^2iA zEH%Nzkw?NNGQmiQrH3|(N8$^xWCq5v$Pc0E8hB{51Oy-}N~l-}*i#h8JoB8EFc&2P zie_6b(^lhES_nEa0l7qpZyfySg}!W<-r= z#uk4(f?DLw>A2zYwsRWo0{HfD{*ILG!Q+Dg{^UBdQax*%0auT4E2#@tK-2V}^4oI( zQZb~(e`EpI1lulg^Zj}_0Ts|V#4QhikW?ri4z!L^m68%|(WpNfm)c_dqd-U&1zg=4 ztt2+w9eQ{eYSVIcE4jdG#x_8G6A07$KU8jg1}aK_2Fl|RB7-P>G9iYAOph&}b|krf z+UsrSW|1BwQ1dCS~Jnb+U6FN}Z6c3ri7jNF(4dCN3+*v}d? z+sdk~+ipKQo9fz%F@jBkEDI5nN#U) z&^xcGFGo>8n&g|c;fk}A#;ZOI;m>={IPz4GAD~7sN2K44B6hQYF{QT-P%knGhi|9< lok9WSjdDILV?BAJ2zW){GbcJ@8@cAtvGT;r{XAo)<3C?RZV>nV74#Fsy5>75a+fC!BNO8i~4T1s$@0qQL- z1A0m-?wELJigwvuHp1>3DJ2&meoKCn3x3|gk1KxMAirsZwwspN8^hi`?&ma=6jzyf zSoyX4w+WQkN;m_=KX(71g_3y%$grjQm_EWqdE&AF<$8_D6yrR z1vq}hE2n`HvWzhq-rDz6Bx9rZLaT~gJLH`ns1Unz0(iIWQIRo;K3$axv2Rew?>=p= zl#sQJc;NG37A27$fjoFcYCh6YLNb3oRWordC0JvC%Z-}ZJSAjDVr`m}*C`>+UPpbG zIags%_+^K0^k%9d&V8wVNnt9IT;w-#rivWC;CE?`ifs4Sc1}`}b#t|s6d(I}K=xYg zt}m#D}i{Me={rbt%M=(57=$riJ7wzN=fH>{!b*-T?o3=p|+6iKbzrK6e~-CO#1- z^u0lpv^4SpjQvqxHiaQPTzB(drtB(q79e+y|MgYmVnkHx7V(hU?7y~^);#MCGQh(U z?nE*rxRW3~trkSQ zmZBu-X%>ouOHa7ztOJ5^L)=9NiHwl!Bex~s6$b&Y0u0{rZN6+jiv*9rtB$)P%OLh_ z;4S4o>q|ueqAG*V&XJ1-Bk+-W-VN$nO_Th#9U*v=X1M4fOG0cK0q$oRZro>UZcgLx zeM)O8!bBdr8~J^cSxNbGe$^5dgk%cQpRi!Xc|lsBG8t(_Mal$P+EE_a4=HIsx(Hl4 z%2zfFe<#3!EObHHCOeVF4spqFWicvLV=PRDa|LL%g2_%Ku6EW#MV*-IB9-?UJf(%3 zkvo(Xp(RQ?BKIpr?TW$FRxuA|?LZq8f(?)~(1Vg7rV6d3nDGU}0cHiyZi#tP(KRs+ zM%SS6R4&;ubkv~&$NoEpG2;~KS6)Fxar^>S(5)k6Ydb?44vT_R`xvi!$#vu$PmJ?m z%59ns&q%`~OicG_se=fBOV82)$eybep!hj@H=Ojtl9o|MBpuAc(~9#4!5FK!kP#!O z4HNgiFCR3i&Pfq#qi8j5DZr>wvD=Z~;fF6%4@#Ei_lU1y#ZGaRW9RXAkv_N=xfwWR z9Biu+<(nbb0ltJyZ#x015#=+W4LbTzD!i@}JlnyM2WneI`S2Z9d9ddfQ64-@$on(=n)tm^YA4c@YB3EK^e`z1-k*i$K}?@0 zPpDikZKy+OV0t`U{iFx0|Ne_vAu$Ob;^x7Pm%~F8xEhCrAl>%)7}eb%oHPEQN(;WC z@d`a!{376`<}{Q7iJ?Y$JR>DSH!a3=)M#TNtA*w$Vu|v*2V%ywl%rxY-g4luTm9xMGmeU2JRLP1DA`3f#$MdpuWO5 zGgc0VO$7-2*?1*G2KK*I;1(MEXsJ`dgJx&&WD5&EJ`ub;kOhOS!7svC;5HE48Nh-; zS5qe^1Jb3(U~0=@70rdFE+1BLs?^j)gOTNbbI0_CDhO!(!*q~$mf)-IYMv3vn)Z!1 z_gh);Fx~u8&ww*a&8{>T@eJ8u&ZM3Md{t%MMt>Yg@_3uMGDx-<>lf*y(z1EU4!KvV3({#&nm8mAva<7|JXeL-QX>yXIWQLU!S;eUw z>wvEenj3i@nwMMG+gL@$)X*0uClH_@J9MiXEt!T(0v3lJ-QiU5aP!a5jFJBX3pLXh delta 3069 zcmZveYfKbZ6vwmjSRMHF!kzgPaRIpkh1)oUO0BWE{ zTM(siTSGObqOH*aDmgxig%q`FrNsznrD7Gt7(lVorZv#snVma3OZ_k(<~RTIzvrBL z@7!BoU!kfO9^cg-G0`@A6n^+AV$V)meSe4Z-FVj0lMv;6XQ3oOrPWFx?i?~ggGDu@ z7eO?B(GzThrYP0Hy`F+)v<)A4U}E>=HmS%nfjn;HafjR{5C3~g)6c6tFKHx?ig3;d z8^7{AGtc1>frleBEW{6Z&S{~<(&S~>Q*&AkHK)CbwGyq=uV!Iplh>n*J4by|gPg7`%m<&V)k-ie(YLcw84~))_nMms zqH)ClLg4wtw{L+2NS|2nvT0IvN{_;LjlDpr_~pE2Axm=?YKGW$&Djp8s}a0U_~lJh znpCySK-PiZKiaMC)FgAUmW88Z+APP~5nEscOQf!dO2}*(@QZ%4J2cyM zQ3e`FX2<}#MBVySi3mEVsnuQMq`~4^xin~Q(d}1Dp#B)CGVi*sLrqO=;A4cWcAbhY z4NUSe!tRHOWF^x)qi%y{wTz(6UVBJE!JKjIUsNv!hCfn2L#bIqJT7ri%&`h{F$jnv5 z=Rna2vrX!hO=#|(z)=PQM*|H$j`VDf{Wf16bh|+&J;7w{T?o4G*tOAEtTLi9_>#PA z#45cW26yEvJ2Se>a6>s5^kx{k`e+|o&a(!%`!4%~Q4L=z13Tg!YR#Zh7pO|g)GW0!dgaB~day}VIkMflicCJA;T>z0S zRN;zVgBM)NLtAK@ofe1l$5})ajvr}|Nrn}rs8CJQ!+Gbpb+Dj}AgNuVUuYSZ4E8Ft zQ5M3tHK;>=!-qSVb-3sbHxs7RqG%^i>|;KJ+ow>r6Or{D3~A?3KmEtxrMYCAuDF7l zn&& zrR1BbkL-s}s<^o>aWGiJU6zUE7DD)WH(COymfI*}VMu(d7cGOaQ=GF=B)4o#CiZV! zAH;jZ-9~PQJTCc$@Qe{g+J~>dZCC_?85b+xcDp3rPa&?l4uEym_J5nr~3j7WC_;w)%9o`W-GdP;~73#uIR1UW;|IkeE6E<1~No-eA*`=ldf zwVNx0sZV@-m;uObMB7h^*!hs3Ljz(dX_?F$AyI9qmFH5_=(U#Q7^)#BJE>x>CC}Aa zlWuu@Pu2*dYhtYFauwozpd`V{a0(3zjhWUVKbZ*5E$gk@+ZDtBY4KrynJ5wS$z2t; a&)sp(*z7R&eppi({VtAk_hnexTmJ#oEZutm diff --git a/lib/rp2040/libpico.a b/lib/rp2040/libpico.a index c40c40946b963f661234d2d3332a193c32e0c760..859f26084baa8b03960da8b53a4da37aad810289 100644 GIT binary patch delta 1546 zcmY+DZAep59L90GFI$`U?&Z3BXCTuW-ab?tnPplKg$r$hg=qDmqJl_gAB>8H1qg*@yyiwV-y$?POcYUTDDB&hPSUk++TO3##$f^9e0y`Rw4uUVs*%WYF|u6G2rCHVHQ5nxEEbC&1b!v(bq~P}O3#|3B+jLpBkbub98) z=`3ga%v&TKF+DS%D#an0D^bGeT61}qzw>SGo* zTN+(hw0c>N2zR2Ex6g@aQIlDOyCLgl{FsUqREPhF^&06Lb(U_iCcW4P{+2wwn#+Jp+kT;E7 z!hG(hooJ#K2^JP};m4SuoMDzfNud_~iY;^d8m#>F(^!IHd~JNamyoDMZD@d>w4j~( zeLe*>)HTMpb!bjwXM?S&b~e|ezOrNKAseKJ>|TnPtlX=OrxZ2wB}Q9dw2V zv=SwiD+CpF5$ly;fv^Mial%bnD}XXVP{?4Es#>n=$o~*fLpc36Pk|!{!?Hkj`8rNX cP_$UsvU_&hXk}fBaHgF!j4s?J^=_{D3y@LR`v3p{ delta 1534 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 delta 15069 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 z

T~eb=-Id9qv!ky+O?Z&A{RZaI!jY1cHHoPAA8Qr|;tiahkVRf|9gt1mEF#@{%3 z=$e+SoRfJAf?YD=I@%X9@j6U1WoJOXhu-Cc>-Z#Uo_r1lb+i@hXQY0VqD$p@vYvxA z&9J82fOWfUc>`^@ogprHk*r(D8gf(fTDsYa z7JU#Svu|n<%WuLs2u5`z+K4sUSPZ-DNsf&a{dgeyB&^Cw`O{7G_X1+;8L?@%5POkg zyWK(~yWwz9meCWbgc(5E#-HiY=vP;n-+&rlj+Pcje`qx=r)qiJ z`ctLR_KHuXjhKz!NB<$hjG<=qMz^D%xU-Ad=_iQIQyZUvZXP1e`8vV zmJ_GA=9^!;>S*WlBGYYDSl`_JP_$_=Dx`OF_w7{8vbM;5yt8RR$1c6}OZNj6AIusS z?;ZEMK914RPJlHn1?w7V)wXBci#BezC)_GUHb0Bu@BcVEk+OBug2aTYF1cc zjeE6*={BZdXlUG}Tr)v={~LCfUf4J8_*Z6-G2+oJy*DaaH7v6Sdv8=MnbFYmW4-f} z&00p!9hZB1gja8R>ss$upO`_$c(zW7f2ZOrW>oX&i=K_&8dfc4@Qd;LV=EdOn^e=K wcYY`SYQG9oLXr}r4~j|nFu|;6q|`AZ;SF2WAeZiGmGHxS)1-%$CDd;4e^EwZCIA2c diff --git a/lib/rp2350/libipv4-ipv6.a b/lib/rp2350/libipv4-ipv6.a index 222315ab3838b4c98ec08bbbed2e69af9b9bd1b3..2ae4f5be2b693609ce2b9eb3e4fe06438cd8e7e7 100644 GIT binary patch delta 15031 zcmche349bq_Q$Jdx+nKBnNBj3OhOW_2q7dSghTFx$PthLLQq(v8x<4~5EKv@SVTaP z4Fo6_f*{8V3J8nP$_l~?E~p?VBD;!!914gAbv4}o->Z2OlKr^u`T6I=>u04$*RTE868FS%Q6ux_i@1ML zeE+KB&-ukqs1iz6EE4hmnfU&#hVH!aqK*^^;r=D57%SYrB*%QCg!>re#@9+b_4bN? zDg&y8Cm_R53r|3%p!~1O*{6l)yK>?2(cu>)q4!LYFsOfB8Pi%M{4eCg`NEg*qgN!_ z$N#)UWQoN8r3~mK66=cZ?+yQR-P@*}_{ZY=rOJP!Zb*OOB^f#V-xD7-SZMxtvU-Z} z{)giGPa9IZq=~;E^9PHhe=feCcUqYtl4{Eiw@CUAB{?ob{H(P3N+h@O(Sc?64GY<4A*i;Y+iv|-ZG(hIFFE8?WC!b`_w~}+ zRaT$F`qkP7x%^{iFKf$Z`paz1mD-m<@iQi!)~!jWjiC6N=nh21Tg$H+*0z9!{H(EC z9X(HQFtYeF-D7>eFes@{z(>u={bi7A4*OWyS=62)8w4Zum2!{MG(5yww)*Ti*U-UVHYA-)L7J%)4z|5at4}`g_cKO>-T!p@9H?JRb#CU zk9y%}%$v+wW;M_o-l$sx!LmXknEFvL4A=uh}u`PZ>kW<|f(tHy_} zup-0hx+7r0z-89HB4=PKxe}HY{-uz2moqRG6^}=5D0B9-P7Zc%s2!%qg86bCi{H^X zqL!nY;qkG~A8H(7;j@T^7dVS*{4%Ti^ji^Gmu5R}EvnJ|ojA!0YE?UzIvq6^6nuxt zZQGr3R^@8vZv$gl+3V~2lvyusao)P((djS?t(FEFNLW1b<-C|a{&jY9k8^zOx-#qJ z{#zkPj9O-0{J3t9oG$J2T3Jwzp0hvW*vD$|jdN|y7|OBhk98f(tU)*ae$)pXF}LPH z+lhbkqYK)yB4YxZUv8}#-6(UmvEGV{sWT&woRb;TlQzvnIqG?A1jmzO#@2+R(m@W^ z_C_&(sAINZzFyaYylH_mVr}XW)1)mgH|ym1m?m8VYfo){={sV=JOK-Q-B$4@F)Mlm zEXpT3&DA`;j%9EU*W0OeEbWH7?r9&esD8GrbxqC)Sa7MtTYZkWq$^-??!Z{adDn{C zJ3Mwf&3tfpz=v8HIjwSAwx~GtL1S&cHEyK&lje&oI$ABVjKcoaIa!f~?k@3#+QFMY z-MC3s*i!ThZ)@F#HpwqQxm#)5!tBEBUsZLEO@Yr_0)NfURp;MX)u+3oFs5ix;a|`y zz7TC}Xe;^+&FU1^$(eId566VX{FWMW$V%AOdt6r_edPt>|E6yN!|Na*Dp`%5!_HTHQ$<9SYDWTXV8VW zgH~S()=ve8=af{}FOA%^u8aOraLd-szCVO{&xosv3Uwd+wx#Wy#HB%$8b;JU7Nn zZI+c;aDLC&JI~)`e0OM+np$3h5Qflnnr4fy4Iz@ep+Y>U39&@xJZ4_eGOWz8<}wXD zFwWd>>)LD=oScv0VA!dV;|LC#8M6ZjtAP1cNcaLWie~SI3E^2* zn+aN`ygJ?-qs^8hCqT=WvnH5bwJGugzjl6t*-9HK(5Uv;;^5wKA z%_8kvc@TZ)1|#RoP`Q-6ufcmA3NMp)`aWpXKpPBIi_=1~zJR5Z?TAd8WH#{4MIbmm zLZd?@6~Z)QbqKntM9opOIRde*sih=-&u#3~hO%H>)8n2-o7)U@eHQ+wAtL>5Xw;=` zEL8XywufN(8G%F6B8*bCYz~2 z8PrAPkMfU`&D&f}$f+jF4pjXhe?Wy+B9nb)rnXu3@|i7wDWu&iU-g*{gGy8n_sUOw zX1i``7#M_Y8xE&aQqs6b@eb)mOI!xAO<~KXf#1UQA=IFx+2}yCKjZ2v@126+x#^XLAqQ4+>0q#Gw|x=w+9t83D1bfB(}y9%Uhs@b?;HgcgaL(&drg(He) zkW`3y7gBd9^cY<4hx#kXttnN&ddQjT1-?MVV{-CTv%Rl%6nbh0eP1Rudy;A(`gth( z+ONTJIn+gDI)n>nUympxmbQ}ZWTFuEJwzcKg&c;Y(pd__!H$mYS|9sLt)EE6QWi8) zeZSE*4pqgr$Aw+C{f*g7txOffwiF8D68gCSQ9*2LPC-Oq)DVaYVp}^3A{CMZF^jP* zcPFJIlsu@pkeW%`PonMaX2G=dDF*E#9p3S;{Cs$JgxGwv^arBUk2G5PkD~ApDYW$G zqA&~Mq{eFLZ-=%CqLzLpbx8;R($7E(weiHz}*coDgR46l>dfM>ywGHQK_<# z1vL}W)ro6tDfK|-d1(}-xGU^!AkHMznY4$!5JPz$1=~on-v(3RFyYgd$B@4dwh3gX z{n@0&@nRhLFNSR)By~6x3!BpnjDyo|8>`OnL?P}NkD59b=(o<0%|M5Xog%Flb)Y5m zK#26GHq*+_nxH$iGUm0SF#dp{Hb8`N5!v3L;T#~f5Up~A44-Z$`$i+B%1Q^-$!yy~ z*#3-Gdmy%Fp&UlxLsBL~IfKGUNbpK1acCuGKy2#_+nX?4K}|Izb|V!0rLBdsT8pJi zj{f{{E&)`SX;Yd}oI$u$>=0qB#-Y+5CtZ13WefSDcPu!$DpNk|~z`%rT)BzB|h{*3AMmAW{z$1*6gk*InYB8)Xy zJI~dQ?Aw6n!)gxG;WZT!Mc4hqt?81}iq(p**<)$Nj|ka^c51~hhT|fLx;OqFg;l}A zhd66)j*r4$d(?k#wAqeeE^oqX8-y~2g*(n4kGh*w&cWPNQtwZs$PdHqAS7xcHo5y7 zkx467=?ka!bWrIlQ|UVg&o3c9mA{`*`Wr;$FBHpEhp7BvGZ*65kU;*@QPT)wqZ6Kk zLN)|{Mg>NApmu!CVmZFMy%bD7{5nEZe0MkI_|$@|8{l9SU(FsLX|^kP1-fLJEa65QSpMt&lp_3TYf_9wS#u*%TBe zLnxxdSV;~15jB9WRmR41L>&|8{FTFRHl*7)d_$vkY)IF@OVC$BqNZZKcFa_lMc-h$ ziebcxp?*3WDur*tvJDbTdyb0pU1;w>;%Kj-8vkx#4Z~%kCea<*9T1i5nn?uKXMfc6g{T?ai^32H zoM{tKw@Q`i97Emw9!A|za;CjtJPMD?CeN9PMf8C|h3}20@MocBIwY7LHR;bzSCp1) zsBPy3)Ko&$w(|-KYav23J&1g?Gv>;<&zVUXO=-`+qHjUR-o2`ry#`KR+DxwKov19D zX5o}h(ElR;`kdKN`+nhUGg*s~^=6wMEl;+YZPwTBmO}`m<s`X`iZ4mk@Jchx+BC;(t5w`L+T}~dscV|4*(2Mg8n+v5 zQq9JmlvKNhT{$BHccHdnw}-U}>+WieK%3%mJkd4ett)qvG5!BYv*wfBK zO`9iaJfu^Lag?MQgN%Xnh?zw}dC^sNH+)#~!Bh56jjLx>mYc^l+qN*7b-QNDgI;^E zeD7do37BdGAV_;Yio|>**QNHxnP3fQ9B*dF*$I zp?G4yvCxdqaKqnSqz%-IinU_BxI|y6^`*yWzQyYzM(d}?kh$M7x$AJS%h5r*OYhK4 zp4@Mbm5)l(2uYI#q50@C@Zw1oYm6?0 z$=V<)(tT)*Rzja!Z7jm!|CHmfWi8V~-H6|vW*-~8Oivq(^59?D$7;*;UyafFQ~N9& zO0@xKjMl@^4*=U(rPb-&&%gmnmL^E%hxs9GO=uuS1=Ujs}2P(T0bZ?q4BIW4i zX3JK(?m(S?9?5#zm_XTGs~oDw)K$|4%VWz;t93UlXau5;j#|eIRnApMdNviJKpoT7 zv0Rhyy=Z1@?XBxCn&~0FH2WcuX&8>VhURE)7|q%tLz-szgh81S_Aj6qF5PZ;?Q4Ci zh)Re3W4!UO8xi(be3?27&@*-2Fdg=HCZ~|UX4G@ow^2v+jC!etuNfV)GRY|zKJ8Sa zH?)*+W%x51g*Z~>3$K_-t~C26DxzgI5!vM@ubB5@8`9Rx9_!46;Ao7ImEveGhp#hl zv;Wa%w-&84)3r1s!l9vOk3Aw&MfX@r3RJ^kkI;+^N3>C#Esw9qCelt`UT@wJktl4s zmSVUGd#(N(%tcOF)zz*y>=NmI+A-aDMxSAyX`7=BIk5N7@9fzfDFUaPGE*W`9eP}7 z*@1nk^6kh9=i+)5DT{TPGTR832Ny)TWrLJ>Q(n{caCss%UYF%N&2G*VYRrG-V4<9_ zQLAT#?=maxSU_ucn@wX20uI6y*<6m6=TN2fm)TpiM47e6?60NE>|Q~Ma`_(9#A~Wc zWIwpaoR2p^TJNAlYsx!juwCmWXYIq%ERk#Xna!OvgBan((-^jGlyj|f`^*YGl}5DP zjTa?g@_4+=07LPifvz61_m)c!nDv}wCY6?R=o8q4rh`^p^&SHB7>ylZ?_TNX~k)Im8 z%oUr7=E@ESR0%JXch;g!*E!p1D$A)}n5fKfG zi3p&C^^wG;cq_&FGps*P#DMdO`FPr6eLWEaZeng_`%czzrK)=0KCbwP4WBSSWBXaw z&ojRzVjvxFM~DrWZHNe@6R{KCcCtQ*h(Lxg?`QjPzwQ&GxMCbv_*kFDoXPfitS@9P zBVwRcL}cn!)?Z_NClLehX6|PmV*XVT=l^pye964PtRkZ0%dB5#I->mphcT0h7$}XI z&GtMZ+IMApcV>UCA3^jXWfQ3YKEs^He1Z8g^G)X4#IATN!1`xI1aN|RhV9?7{ynpr z?KZrpAb$twqe2)N5UEK-Aj#~I#%#>>8C;*o_O{H9T;GfJV&(w0-$O*d53qe0bEK25 zf6Qbi8Ne0Hmxy#uiD%RpX@|Yc&`OG3BIw&S0upw-}k2#WvfhG`BFd^3Gas5JOCEHgLlkkqn$A-6<`-q5a zKl2C?j-N8mv;7<9Pt2=K9S^zGKA7nwqJ10@fv2&(5!07L1w`I~n22vESRcp^_b~5c z`%oet#h+k(D%VeEKFjtcMEEUdZsvN6xzkUd*v*CmL^Sw_h)B<{{T#E3h(LcL;={ND zZ(K-^CSt}W)5G>AMEEslcHsIh%$|xk|97&XggKb`01+KLOhiDBvwb3S8gmBow?qVl z-=+y0WHsxr5)t5L=Id`Q>B&2GQVX0 zz;xk-3iaEHNcaDH*f56aV?M`}%vH=y%z${^oV$Ngk@Dm@X z@%fuNh-M}dyW$-;Gn-k+9L=1n7PaXBHarHQ2~62Igz=D zxsth=h^=)m^9b`CGYB6)sUBabE2a^#(Y0cBWtK1>2Yuu)l?`)=*m%}3w=>^ko?u>N z>hz%%l1RjCvzYCfJ(zbfOPP-_CxqeqENb{H8L*(}>q6o>YyCM>YQ7@^dRx5BCw9V) z$h^XIXs~0g#4wYY>em{uw_&|2u^S%cm_vv?@$EmcFMX{8_D3R!1B7^B^40R z3L*ksLqw4Df|@e*8W9=XMnvj&5^*ZuA>y3BPsEz}kcc%zzoei?v(Jes{$EJYB0W!f zLm{e&jfMD;n1RK4jS5*18zcwMc*K^t?1-)K1VluJ5{T`ENFjE@)kDPPn?Xb-a)`)4 z8zN@jk=R>^uEah<^duq^^zAHVVjxjRDu&4YUz;<0YOx}YuW79z4*H=8#SuqD9DRw1 zV<{1F>?0x$dVx-H(3g1>$Mf_$0C9vMc@)PzM8vV4h&cX4L>%-rJ;gDRh!>RNQ|sf4 zX1wN`LJ4^QANPp}q@4BnL)^;JX!_B!it5)q&}18Dyl=?L^IuK${dfK`G~A5IBC z;PlF!#>*vk#ggdHh7uxXGK%%FM9gRk>rWFgvvStw6EVZ(tgj+srf;&olZY7~X8kA; zC!mV;ABZLLg{`N4%_r3w|B77G{}p#nk0%LrqhD zbs61{mzT-eYsa@j6`lX=lC7_p(MB%R0;x6knsW82kSMv68jZbTHZaDcCLOkft!-N)ZFWmYp!FWqz5Ac(?lp(Ej52s(N>uB7 z1y0Q+qi@2$&m@d08{UNft61)x<>=HS zey@7yJCECHKh^Ua{=X3DXQb)2j-B;<6BY;#KHuF_t5dgivUkFU(0~P5!H=~ECG2qr zEUMGFV-h-)1}y$OeVFh_{aO~cHSWiR4iNzhf^%Dk?1_s**kX;2NDQsXf$Cz>fW+fp z1R5yI{5IaJHJz&YtsCOKT5}SS6_54KNbju1wOYBY5evP&`M;#78OK{kS9?z#4h+0& zV$zYCpATagkF|Av(x%8j7x=#e9_yKvN&9QoftvB?9Z5e94EU(vo{md?FS*7-Cul^= atUq-g}ZmoBSW)xUsST delta 15207 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 ObAu)`Vs}!_djAJXD6Jp> diff --git a/lib/rp2350/libipv4.a b/lib/rp2350/libipv4.a index 619c9b5e2a936d560aeffdb7755d198761482103..2edefbb28dfa400928b3d5f3db77900815e42c47 100644 GIT binary patch delta 15020 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 delta 15067 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 agARdz<|zD&=j;O^FZ11f-{8cEcK-)9JJ>z| diff --git a/lib/rp2350/libpico.a b/lib/rp2350/libpico.a index de7ea94b008c65e0e220916091577d8b025576a2..61a334c56899db5605c40140e88d73f14375a552 100644 GIT binary patch delta 57426 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

PhvyYM%Y6*Lbw17(P5bw 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 Lb4S1&S&0t-kEu)oU&)nnLYgQnF}5q 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 K?E-A7+`~VWM3qYb diff --git a/libraries/I2S/src/I2S.cpp b/libraries/I2S/src/I2S.cpp index b394a1f38..d262606f2 100644 --- a/libraries/I2S/src/I2S.cpp +++ b/libraries/I2S/src/I2S.cpp @@ -66,23 +66,22 @@ I2S::~I2S() { } bool I2S::setBCLK(pin_size_t pin) { - if (_running || (pin > 28)) { + if (_running || (pin > __GPIOCNT - 1)) { return false; } _pinBCLK = pin; return true; } - bool I2S::setMCLK(pin_size_t pin) { - if (_running || (pin > 28)) { + if (_running || (pin >= __GPIOCNT)) { return false; } _pinMCLK = pin; return true; } bool I2S::setDATA(pin_size_t pin) { - if (_running || (pin > 29)) { + if (_running || (pin >= __GPIOCNT)) { return false; } _pinDOUT = pin; @@ -198,7 +197,7 @@ void I2S::onReceive(void(*fn)(void)) { void I2S::MCLKbegin() { int off = 0; _i2sMCLK = new PIOProgram(&pio_i2s_mclk_program); - _i2sMCLK->prepare(&_pioMCLK, &_smMCLK, &off); // not sure how to use the same PIO + _i2sMCLK->prepare(&_pioMCLK, &_smMCLK, &off, _pinMCLK, 1); // not sure how to use the same PIO pio_i2s_MCLK_program_init(_pioMCLK, _smMCLK, off, _pinMCLK); int mClk = _multMCLK * _freq * 2.0 /* edges per clock */; pio_sm_set_clkdiv_int_frac(_pioMCLK, _smMCLK, clock_get_hz(clk_sys) / mClk, 0); @@ -215,7 +214,9 @@ bool I2S::begin() { } else { _i2s = new PIOProgram(_isOutput ? (_isTDM ? &pio_tdm_out_swap_program : (_isLSBJ ? &pio_lsbj_out_swap_program : &pio_i2s_out_swap_program)) : &pio_i2s_in_swap_program); } - if (!_i2s->prepare(&_pio, &_sm, &off)) { + int minpin = std::min((int)_pinDOUT, (int)_pinBCLK); + int maxpin = std::max((int)_pinDOUT, (int)_pinBCLK + 1); + if (!_i2s->prepare(&_pio, &_sm, &off, minpin, maxpin - minpin + 1)) { _running = false; delete _i2s; _i2s = nullptr; diff --git a/libraries/I2S/src/pio_i2s.pio b/libraries/I2S/src/pio_i2s.pio index 896b8ffc6..328c745ed 100644 --- a/libraries/I2S/src/pio_i2s.pio +++ b/libraries/I2S/src/pio_i2s.pio @@ -220,9 +220,13 @@ static inline void pio_i2s_out_program_init(PIO pio, uint sm, uint offset, uint pio_sm_init(pio, sm, offset, &sm_config); - uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); - pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); - pio_sm_set_pins(pio, sm, 0); // clear pins + //uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); + //pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); + //pio_sm_set_pins(pio, sm, 0); // clear pins + pio_sm_set_consecutive_pindirs(pio, sm, data_pin, 1, true); + pio_sm_set_consecutive_pindirs(pio, sm, clock_pin_base, 2, true); + pio_sm_set_set_pins(pio, sm, data_pin, 1); + pio_sm_set_set_pins(pio, sm, clock_pin_base, 2); pio_sm_exec(pio, sm, pio_encode_set(pio_y, bits - 2)); } @@ -241,9 +245,13 @@ static inline void pio_tdm_out_program_init(PIO pio, uint sm, uint offset, uint pio_sm_init(pio, sm, offset, &sm_config); - uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); - pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); - pio_sm_set_pins(pio, sm, 0); // clear pins + //uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); + //pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); + //pio_sm_set_pins(pio, sm, 0); // clear pins + pio_sm_set_consecutive_pindirs(pio, sm, data_pin, 1, true); + pio_sm_set_consecutive_pindirs(pio, sm, clock_pin_base, 2, true); + pio_sm_set_set_pins(pio, sm, data_pin, 1); + pio_sm_set_set_pins(pio, sm, clock_pin_base, 2); // Can't set constant > 31, so push and pop/mov pio_sm_put_blocking(pio, sm, bits * channels - 2); @@ -268,9 +276,13 @@ static inline void pio_lsbj_out_program_init(PIO pio, uint sm, uint offset, uint pio_sm_init(pio, sm, offset, &sm_config); - uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); - pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); - pio_sm_set_pins(pio, sm, 0); // clear pins + //uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); + //pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); + //pio_sm_set_pins(pio, sm, 0); // clear pins + pio_sm_set_consecutive_pindirs(pio, sm, data_pin, 1, true); + pio_sm_set_consecutive_pindirs(pio, sm, clock_pin_base, 2, true); + pio_sm_set_set_pins(pio, sm, data_pin, 1); + pio_sm_set_set_pins(pio, sm, clock_pin_base, 2); pio_sm_exec(pio, sm, pio_encode_set(pio_y, bits - 2)); } @@ -289,9 +301,12 @@ static inline void pio_i2s_in_program_init(PIO pio, uint sm, uint offset, uint d pio_sm_init(pio, sm, offset, &sm_config); - uint pin_mask = 3u << clock_pin_base; - pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); - pio_sm_set_pins(pio, sm, 0); // clear pins + //uint pin_mask = 3u << clock_pin_base; + //pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); + //pio_sm_set_pins(pio, sm, 0); // clear pins + pio_sm_set_consecutive_pindirs(pio, sm, data_pin, 1, false); + pio_sm_set_consecutive_pindirs(pio, sm, clock_pin_base, 2, true); + pio_sm_set_set_pins(pio, sm, clock_pin_base, 2); pio_sm_exec(pio, sm, pio_encode_set(pio_y, bits - 2)); diff --git a/libraries/I2S/src/pio_i2s.pio.h b/libraries/I2S/src/pio_i2s.pio.h index b6e91d45c..ebcbfe3f3 100644 --- a/libraries/I2S/src/pio_i2s.pio.h +++ b/libraries/I2S/src/pio_i2s.pio.h @@ -369,9 +369,13 @@ static inline void pio_i2s_out_program_init(PIO pio, uint sm, uint offset, uint sm_config_set_out_shift(&sm_config, false, true, (bits <= 16) ? 2 * bits : bits); sm_config_set_fifo_join(&sm_config, PIO_FIFO_JOIN_TX); pio_sm_init(pio, sm, offset, &sm_config); - uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); - pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); - pio_sm_set_pins(pio, sm, 0); // clear pins + //uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); + //pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); + //pio_sm_set_pins(pio, sm, 0); // clear pins + pio_sm_set_consecutive_pindirs(pio, sm, data_pin, 1, true); + pio_sm_set_consecutive_pindirs(pio, sm, clock_pin_base, 2, true); + pio_sm_set_set_pins(pio, sm, data_pin, 1); + pio_sm_set_set_pins(pio, sm, clock_pin_base, 2); pio_sm_exec(pio, sm, pio_encode_set(pio_y, bits - 2)); } static inline void pio_tdm_out_program_init(PIO pio, uint sm, uint offset, uint data_pin, uint clock_pin_base, uint bits, bool swap, uint channels) { @@ -384,9 +388,13 @@ static inline void pio_tdm_out_program_init(PIO pio, uint sm, uint offset, uint sm_config_set_out_shift(&sm_config, false, true, 32); sm_config_set_fifo_join(&sm_config, PIO_FIFO_JOIN_TX); pio_sm_init(pio, sm, offset, &sm_config); - uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); - pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); - pio_sm_set_pins(pio, sm, 0); // clear pins + //uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); + //pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); + //pio_sm_set_pins(pio, sm, 0); // clear pins + pio_sm_set_consecutive_pindirs(pio, sm, data_pin, 1, true); + pio_sm_set_consecutive_pindirs(pio, sm, clock_pin_base, 2, true); + pio_sm_set_set_pins(pio, sm, data_pin, 1); + pio_sm_set_set_pins(pio, sm, clock_pin_base, 2); // Can't set constant > 31, so push and pop/mov pio_sm_put_blocking(pio, sm, bits * channels - 2); pio_sm_exec(pio, sm, pio_encode_pull(false, false)); @@ -404,9 +412,13 @@ static inline void pio_lsbj_out_program_init(PIO pio, uint sm, uint offset, uint sm_config_set_out_shift(&sm_config, false, true, (bits <= 16) ? 2 * bits : bits); sm_config_set_fifo_join(&sm_config, PIO_FIFO_JOIN_TX); pio_sm_init(pio, sm, offset, &sm_config); - uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); - pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); - pio_sm_set_pins(pio, sm, 0); // clear pins + //uint pin_mask = (1u << data_pin) | (3u << clock_pin_base); + //pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); + //pio_sm_set_pins(pio, sm, 0); // clear pins + pio_sm_set_consecutive_pindirs(pio, sm, data_pin, 1, true); + pio_sm_set_consecutive_pindirs(pio, sm, clock_pin_base, 2, true); + pio_sm_set_set_pins(pio, sm, data_pin, 1); + pio_sm_set_set_pins(pio, sm, clock_pin_base, 2); pio_sm_exec(pio, sm, pio_encode_set(pio_y, bits - 2)); } static inline void pio_i2s_in_program_init(PIO pio, uint sm, uint offset, uint data_pin, uint clock_pin_base, uint bits, bool swap) { @@ -419,9 +431,12 @@ static inline void pio_i2s_in_program_init(PIO pio, uint sm, uint offset, uint d sm_config_set_in_shift(&sm_config, false, true, (bits <= 16) ? 2 * bits : bits); sm_config_set_fifo_join(&sm_config, PIO_FIFO_JOIN_RX); pio_sm_init(pio, sm, offset, &sm_config); - uint pin_mask = 3u << clock_pin_base; - pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); - pio_sm_set_pins(pio, sm, 0); // clear pins + //uint pin_mask = 3u << clock_pin_base; + //pio_sm_set_pindirs_with_mask(pio, sm, pin_mask, pin_mask); + //pio_sm_set_pins(pio, sm, 0); // clear pins + pio_sm_set_consecutive_pindirs(pio, sm, data_pin, 1, false); + pio_sm_set_consecutive_pindirs(pio, sm, clock_pin_base, 2, true); + pio_sm_set_set_pins(pio, sm, clock_pin_base, 2); pio_sm_exec(pio, sm, pio_encode_set(pio_y, bits - 2)); pio_sm_exec(pio, sm, pio_encode_in(pio_pins, bits)); // Shift in 1st L data pio_sm_exec(pio, sm, pio_encode_in(pio_pins, bits - 1)); // Shift in 1st R data modulo one bit, avoiding bit shift from #2037 diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index 6d100210e..c5dc5af33 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -329,10 +329,16 @@ void SPIClassRP2040::abortAsync() { bool SPIClassRP2040::setRX(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({0, 4, 16, 20}) /* SPI0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({0, 4, 16, 20, 32, 26}) /* SPI0 */, + __bitset({8, 12, 24, 28, 40, 44}) /* SPI1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({0, 4, 16, 20}) /* SPI0 */, __bitset({8, 12, 24, 28}) /* SPI1 */ }; - if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[spi_get_index(_spi)])) { _RX = pin; return true; } @@ -350,10 +356,16 @@ bool SPIClassRP2040::setRX(pin_size_t pin) { } bool SPIClassRP2040::setCS(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({1, 5, 17, 21}) /* SPI0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({1, 5, 17, 21, 33, 37}) /* SPI0 */, + __bitset({9, 13, 25, 29, 41, 45}) /* SPI1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({1, 5, 17, 21}) /* SPI0 */, __bitset({9, 13, 25, 29}) /* SPI1 */ }; - if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[spi_get_index(_spi)])) { _CS = pin; return true; } @@ -371,10 +383,16 @@ bool SPIClassRP2040::setCS(pin_size_t pin) { } bool SPIClassRP2040::setSCK(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({2, 6, 18, 22}) /* SPI0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({2, 6, 18, 22, 34, 38}) /* SPI0 */, + __bitset({10, 14, 26, 30, 42, 46}) /* SPI1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({2, 6, 18, 22}) /* SPI0 */, __bitset({10, 14, 26}) /* SPI1 */ }; - if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[spi_get_index(_spi)])) { _SCK = pin; return true; } @@ -392,10 +410,16 @@ bool SPIClassRP2040::setSCK(pin_size_t pin) { } bool SPIClassRP2040::setTX(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({3, 7, 19, 23}) /* SPI0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({3, 7, 19, 23, 35, 39}) /* SPI0 */, + __bitset({11, 15, 27, 31, 43, 47}) /* SPI1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({3, 7, 19, 23}) /* SPI0 */, __bitset({11, 15, 27}) /* SPI1 */ }; - if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[spi_get_index(_spi)])) { _TX = pin; return true; } diff --git a/libraries/SPISlave/src/SPISlave.cpp b/libraries/SPISlave/src/SPISlave.cpp index 3c01d4f86..35e15ecd2 100644 --- a/libraries/SPISlave/src/SPISlave.cpp +++ b/libraries/SPISlave/src/SPISlave.cpp @@ -79,10 +79,16 @@ inline spi_cpha_t SPISlaveClass::cpha(SPISettings _spis) { } bool SPISlaveClass::setRX(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({0, 4, 16, 20}) /* SPI0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({0, 4, 16, 20, 32, 26}) /* SPI0 */, + __bitset({8, 12, 24, 28, 40, 44}) /* SPI1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({0, 4, 16, 20}) /* SPI0 */, __bitset({8, 12, 24, 28}) /* SPI1 */ }; - if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[spi_get_index(_spi)])) { _RX = pin; return true; } @@ -100,10 +106,16 @@ bool SPISlaveClass::setRX(pin_size_t pin) { } bool SPISlaveClass::setCS(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({1, 5, 17, 21}) /* SPI0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({1, 5, 17, 21, 33, 37}) /* SPI0 */, + __bitset({9, 13, 25, 29, 41, 45}) /* SPI1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({1, 5, 17, 21}) /* SPI0 */, __bitset({9, 13, 25, 29}) /* SPI1 */ }; - if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[spi_get_index(_spi)])) { _CS = pin; return true; } @@ -121,10 +133,16 @@ bool SPISlaveClass::setCS(pin_size_t pin) { } bool SPISlaveClass::setSCK(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({2, 6, 18, 22}) /* SPI0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({2, 6, 18, 22, 34, 38}) /* SPI0 */, + __bitset({10, 14, 26, 30, 42, 46}) /* SPI1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({2, 6, 18, 22}) /* SPI0 */, __bitset({10, 14, 26}) /* SPI1 */ }; - if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[spi_get_index(_spi)])) { _SCK = pin; return true; } @@ -142,10 +160,16 @@ bool SPISlaveClass::setSCK(pin_size_t pin) { } bool SPISlaveClass::setTX(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({3, 7, 19, 23}) /* SPI0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({3, 7, 19, 23, 35, 39}) /* SPI0 */, + __bitset({11, 15, 27, 31, 43, 47}) /* SPI1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({3, 7, 19, 23}) /* SPI0 */, __bitset({11, 15, 27}) /* SPI1 */ }; - if ((!_running) && ((1 << pin) & valid[spi_get_index(_spi)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[spi_get_index(_spi)])) { _TX = pin; return true; } diff --git a/libraries/Servo/src/Servo.cpp b/libraries/Servo/src/Servo.cpp index 7c9844e91..bd6122f24 100644 --- a/libraries/Servo/src/Servo.cpp +++ b/libraries/Servo/src/Servo.cpp @@ -85,7 +85,7 @@ int Servo::attach(pin_size_t pin, int minUs, int maxUs, int value) { digitalWrite(pin, LOW); pinMode(pin, OUTPUT); _pin = pin; - if (!_servoPgm.prepare(&_pio, &_smIdx, &_pgmOffset)) { + if (!_servoPgm.prepare(&_pio, &_smIdx, &_pgmOffset, pin, 1)) { // ERROR, no free slots return -1; } diff --git a/libraries/Wire/src/Wire.cpp b/libraries/Wire/src/Wire.cpp index 1dd91c797..5e0bb2257 100644 --- a/libraries/Wire/src/Wire.cpp +++ b/libraries/Wire/src/Wire.cpp @@ -49,10 +49,16 @@ TwoWire::TwoWire(i2c_inst_t *i2c, pin_size_t sda, pin_size_t scl) { } bool TwoWire::setSDA(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({0, 4, 8, 12, 16, 20, 24, 28}) /* I2C0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44}) /* I2C0 */, + __bitset({2, 6, 10, 14, 18, 22, 26, 30, 34, 38, 42, 46}) /* I2C1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({0, 4, 8, 12, 16, 20, 24, 28}) /* I2C0 */, __bitset({2, 6, 10, 14, 18, 22, 26}) /* I2C1 */ }; - if ((!_running) && ((1 << pin) & valid[i2c_hw_index(_i2c)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[i2c_hw_index(_i2c)])) { _sda = pin; return true; } @@ -70,10 +76,16 @@ bool TwoWire::setSDA(pin_size_t pin) { } bool TwoWire::setSCL(pin_size_t pin) { - constexpr uint32_t valid[2] = { __bitset({1, 5, 9, 13, 17, 21, 25, 29}) /* I2C0 */, +#ifdef RP2350B + constexpr uint64_t valid[2] = { __bitset({1, 5, 9, 13, 17, 21, 25, 29, 33, 37, 41, 45}) /* I2C0 */, + __bitset({3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47}) /* I2C1 */ + }; +#else + constexpr uint64_t valid[2] = { __bitset({1, 5, 9, 13, 17, 21, 25, 29}) /* I2C0 */, __bitset({3, 7, 11, 15, 19, 23, 27}) /* I2C1 */ }; - if ((!_running) && ((1 << pin) & valid[i2c_hw_index(_i2c)])) { +#endif + if ((!_running) && ((1LL << pin) & valid[i2c_hw_index(_i2c)])) { _scl = pin; return true; } diff --git a/package/package_pico_index.template.json b/package/package_pico_index.template.json index c30f2cbc0..2fde83e6b 100644 --- a/package/package_pico_index.template.json +++ b/package/package_pico_index.template.json @@ -215,6 +215,9 @@ { "name": "Pimoroni PGA2040" }, + { + "name": "Pimoroni PGA2350" + }, { "name": "Pimoroni PicoPlus2" }, diff --git a/platform.txt b/platform.txt index 23de07b9a..fa1047d9d 100644 --- a/platform.txt +++ b/platform.txt @@ -50,7 +50,7 @@ compiler.warning_flags.all=-Wall -Wextra -Werror=return-type -Wno-ignored-qualif compiler.netdefines={build.libpicowdefs} -DLWIP_IGMP=1 -DLWIP_CHECKSUM_CTRL_PER_NETIF=1 compiler.psramdefines={build.psram_cs} {build.psram_freq} -compiler.defines={build.led} {build.usbstack_flags} {build.usbpid} {build.usbvid} {build.usbpwr} {compiler.psramdefines} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}' {compiler.netdefines} -DARDUINO_VARIANT="{build.variant}" -DPICO_FLASH_SIZE_BYTES={build.flash_total} "@{runtime.platform.path}/lib/{build.chip}/platform_def.txt" +compiler.defines={build.led} {build.usbstack_flags} {build.usbpid} {build.usbvid} {build.usbpwr} {compiler.psramdefines} '-DUSB_MANUFACTURER={build.usb_manufacturer}' '-DUSB_PRODUCT={build.usb_product}' {compiler.netdefines} {build.variantdefines} -DARDUINO_VARIANT="{build.variant}" -DPICO_FLASH_SIZE_BYTES={build.flash_total} "@{runtime.platform.path}/lib/{build.chip}/platform_def.txt" compiler.includes="-iprefix{runtime.platform.path}/" "@{runtime.platform.path}/lib/{build.chip}/platform_inc.txt" "@{runtime.platform.path}/lib/core_inc.txt" "-I{runtime.platform.path}/include" compiler.flags={build.toolchainopts} -ffunction-sections -fdata-sections {build.flags.exceptions} {build.flags.stackprotect} {build.picodebugflags} compiler.wrap="@{runtime.platform.path}/lib/{build.chip}/platform_wrap.txt" "@{runtime.platform.path}/lib/core_wrap.txt" @@ -110,6 +110,7 @@ build.libpicowdefs=-DLWIP_IPV6=0 -DLWIP_IPV4=1 build.wificc=-DWIFICC=CYW43_COUNTRY_WORLDWIDE build.debugscript=picoprobe_cmsis_dap.tcl build.picodebugflags= +build.variantdefines= # Allow Pico boards do be auto-discovered by the IDE #discovery.rp2040.pattern={runtime.tools.pqt-python3.path}/python3 -I "{runtime.platform.path}/tools/pluggable_discovery.py" diff --git a/tools/json/pimoroni_pga2350.json b/tools/json/pimoroni_pga2350.json new file mode 100644 index 000000000..a45942479 --- /dev/null +++ b/tools/json/pimoroni_pga2350.json @@ -0,0 +1,56 @@ +{ + "build": { + "arduino": { + "earlephilhower": { + "boot2_source": "boot2_w25q080_4_padded_checksum.S", + "usb_vid": "0x2E8A", + "usb_pid": "0x1018" + } + }, + "core": "earlephilhower", + "cpu": "cortex-m33", + "extra_flags": "-DARDUINO_PIMORONI_PGA2350 -DARDUINO_ARCH_RP2040 -DUSBD_MAX_POWER_MA=250 ", + "f_cpu": "150000000L", + "hwids": [ + [ + "0x2E8A", + "0x00C0" + ], + [ + "0x2E8A", + "0x1018" + ] + ], + "mcu": "rp2350", + "variant": "pimoroni_pga2350" + }, + "debug": { + "jlink_device": "RP2350_0", + "openocd_target": "rp2350.cfg", + "svd_path": "rp2350.svd" + }, + "frameworks": [ + "arduino" + ], + "name": "PGA2350", + "upload": { + "maximum_ram_size": 524288, + "maximum_size": 16777216, + "require_upload_port": true, + "native_usb": true, + "use_1200bps_touch": true, + "wait_for_upload_port": false, + "protocol": "picotool", + "protocols": [ + "blackmagic", + "cmsis-dap", + "jlink", + "raspberrypi-swd", + "picotool", + "picoprobe" + ], + "psram_length": 8388608 + }, + "url": "https://www.raspberrypi.org/products/raspberry-pi-pico/", + "vendor": "Pimoroni" +} \ No newline at end of file diff --git a/tools/libpico/CMakeLists.txt b/tools/libpico/CMakeLists.txt index 435640070..2032c5b7a 100644 --- a/tools/libpico/CMakeLists.txt +++ b/tools/libpico/CMakeLists.txt @@ -9,7 +9,7 @@ if (${cpu} MATCHES "rp2040") set(PICO_PLATFORM rp2040) set(PICO_CYW43_SUPPORTED 1) elseif(${cpu} MATCHES "rp2350") - set(PICO_BOARD pico2) + set(PICO_BOARD solderparty_rp2350_stamp_xl) # Pico2 sets to RP2350A which disables all code for RP2350B set(PICO_PLATFORM rp2350) set(PICO_CYW43_SUPPORTED 0) else() @@ -31,7 +31,7 @@ add_library(common-${cpu} INTERFACE) if (${cpu} MATCHES "rp2040") set(xcd PICO_RP2040_B0_SUPPORTED=1 PICO_RP2040_B1_SUPPORTED=1 PICO_RP2040_B2_SUPPORTED=1 PICO_CYW43_ARCH_THREADSAFE_BACKGROUND=1 CYW43_WARN=// PICO_XOSC_STARTUP_DELAY_MULTIPLIER=64 PICO_FLOAT_SUPPORT_ROM_V1=1 PICO_DOUBLE_SUPPORT_ROM_V1=1 PICO_RP2040=1 PICO_PLATFORM=rp2040 PICO_CYW43_SUPPORTED=1) elseif(${cpu} MATCHES "rp2350") - set(xcd CFG_TUSB_DEBUG=0 CFG_TUSB_MCU=OPT_MCU_RP2040 CFG_TUSB_OS=OPT_OS_PICO LIB_BOOT_STAGE2_HEADERS=1 LIB_PICO_ATOMIC=1 LIB_PICO_BIT_OPS=1 LIB_PICO_BIT_OPS_PICO=1 LIB_PICO_CLIB_INTERFACE=1 LIB_PICO_CRT0=1 LIB_PICO_CXX_OPTIONS=1 LIB_PICO_DIVIDER=1 LIB_PICO_DIVIDER_COMPILER=1 LIB_PICO_DOUBLE=1 LIB_PICO_DOUBLE_PICO=1 LIB_PICO_FIX_RP2040_USB_DEVICE_ENUMERATION=1 LIB_PICO_FLOAT=1 LIB_PICO_FLOAT_PICO=1 LIB_PICO_FLOAT_PICO_VFP=1 LIB_PICO_INT64_OPS=1 LIB_PICO_INT64_OPS_COMPILER=1 LIB_PICO_MEM_OPS=1 LIB_PICO_MEM_OPS_COMPILER=1 LIB_PICO_NEWLIB_INTERFACE=1 LIB_PICO_PLATFORM=1 LIB_PICO_PLATFORM_COMPILER=1 LIB_PICO_PLATFORM_PANIC=1 LIB_PICO_PLATFORM_SECTIONS=1 LIB_PICO_RUNTIME=1 LIB_PICO_RUNTIME_INIT=1 LIB_PICO_STANDARD_BINARY_INFO=1 LIB_PICO_STANDARD_LINK=1 LIB_PICO_SYNC=1 LIB_PICO_SYNC_CRITICAL_SECTION=1 LIB_PICO_SYNC_MUTEX=1 LIB_PICO_SYNC_SEM=1 LIB_PICO_TIME=1 LIB_PICO_TIME_ADAPTER=1 LIB_PICO_UNIQUE_ID=1 LIB_PICO_UTIL=1 LIB_TINYUSB_BOARD=1 LIB_TINYUSB_DEVICE=1 PICO_32BIT=1 PICO_BOARD=\"pico2\" PICO_BUILD=1 PICO_COPY_TO_RAM=0 PICO_CXX_ENABLE_EXCEPTIONS=0 PICO_NO_FLASH=0 PICO_NO_HARDWARE=0 PICO_ON_DEVICE=1 PICO_RP2040_USB_DEVICE_ENUMERATION_FIX=1 PICO_RP2040_USB_DEVICE_UFRAME_FIX=1 PICO_RP2350=1 PICO_USE_BLOCKED_RAM=0 PICO_PLATFORM=rp2350) + set(xcd CFG_TUSB_DEBUG=0 CFG_TUSB_MCU=OPT_MCU_RP2040 CFG_TUSB_OS=OPT_OS_PICO LIB_BOOT_STAGE2_HEADERS=1 LIB_PICO_ATOMIC=1 LIB_PICO_BIT_OPS=1 LIB_PICO_BIT_OPS_PICO=1 LIB_PICO_CLIB_INTERFACE=1 LIB_PICO_CRT0=1 LIB_PICO_CXX_OPTIONS=1 LIB_PICO_DIVIDER=1 LIB_PICO_DIVIDER_COMPILER=1 LIB_PICO_DOUBLE=1 LIB_PICO_DOUBLE_PICO=1 LIB_PICO_FIX_RP2040_USB_DEVICE_ENUMERATION=1 LIB_PICO_FLOAT=1 LIB_PICO_FLOAT_PICO=1 LIB_PICO_FLOAT_PICO_VFP=1 LIB_PICO_INT64_OPS=1 LIB_PICO_INT64_OPS_COMPILER=1 LIB_PICO_MEM_OPS=1 LIB_PICO_MEM_OPS_COMPILER=1 LIB_PICO_NEWLIB_INTERFACE=1 LIB_PICO_PLATFORM=1 LIB_PICO_PLATFORM_COMPILER=1 LIB_PICO_PLATFORM_PANIC=1 LIB_PICO_PLATFORM_SECTIONS=1 LIB_PICO_RUNTIME=1 LIB_PICO_RUNTIME_INIT=1 LIB_PICO_STANDARD_BINARY_INFO=1 LIB_PICO_STANDARD_LINK=1 LIB_PICO_SYNC=1 LIB_PICO_SYNC_CRITICAL_SECTION=1 LIB_PICO_SYNC_MUTEX=1 LIB_PICO_SYNC_SEM=1 LIB_PICO_TIME=1 LIB_PICO_TIME_ADAPTER=1 LIB_PICO_UNIQUE_ID=1 LIB_PICO_UTIL=1 LIB_TINYUSB_BOARD=1 LIB_TINYUSB_DEVICE=1 PICO_32BIT=1 PICO_BOARD=\"solderparty_rp2350_stamp_xl\" PICO_BUILD=1 PICO_COPY_TO_RAM=0 PICO_CXX_ENABLE_EXCEPTIONS=0 PICO_NO_FLASH=0 PICO_NO_HARDWARE=0 PICO_ON_DEVICE=1 PICO_RP2040_USB_DEVICE_ENUMERATION_FIX=1 PICO_RP2040_USB_DEVICE_UFRAME_FIX=1 PICO_RP2350=1 PICO_USE_BLOCKED_RAM=0 PICO_PLATFORM=rp2350) endif() # Use a longer XOSC startup time, to accommodate Adafruit and other boards that may need it. diff --git a/tools/makeboards.py b/tools/makeboards.py index 3cde36d4f..d8010ac3b 100755 --- a/tools/makeboards.py +++ b/tools/makeboards.py @@ -54,7 +54,9 @@ def BuildPSRAM(name): print("%s.menu.psram.%dmb.build.psram_length=0x%d00000" % (name, s, s)) def BuildPSRAMCS(name): - for s in range(0, 32): + print("%s.menu.psramcs.GPIOnone=None" % (name)) + print("%s.menu.psramcs.GPIOnone.build.psram_cs=" % (name)) + for s in range(0, 48): print("%s.menu.psramcs.GPIO%d=GPIO %d" % (name, s, s)) print("%s.menu.psramcs.GPIO%d.build.psram_cs=-DRP2350_PSRAM_CS=%d" % (name, s, s)) @@ -63,6 +65,11 @@ def BuildPSRAMFreq(name): print("%s.menu.psramfreq.freq%d=%d MHz" % (name, s, s)) print("%s.menu.psramfreq.freq%d.build.psram_freq=-DRP2350_PSRAM_MAX_SCK_HZ=%d" % (name, s, s * 1000000)) +def BuildRP2350Variant(name): + for l in [ ("RP2350A", "-DPICO_RP2350A=1"), ("RP2530B", "-DPICO_RP2350B=1") ]: + print("%s.menu.variantchip.%s=%s" % (name, l[0], l[0])) + print("%s.menu.variantchip.%s.build.variantdefines=%s" % (name, l[0], l[1])) + def BuildOptimize(name): for l in [ ("Small", "Small", "-Os", " (standard)"), ("Optimize", "Optimize", "-O", ""), ("Optimize2", "Optimize More", "-O2", ""), ("Optimize3", "Optimize Even More", "-O3", ""), ("Fast", "Fast", "-Ofast", " (maybe slower)"), ("Debug", "Debug", "-Og", "") ]: @@ -252,9 +259,10 @@ def WriteWarning(): def BuildGlobalMenuList(): print("menu.BoardModel=Model") + print("menu.variantchip=Chip Variant") print("menu.flash=Flash Size") - print("menu.psram=PSRAM Size") print("menu.psramcs=PSRAM CS") + print("menu.psram=PSRAM Size") print("menu.psramfreq=PSRAM Speed") print("menu.freq=CPU Speed") print("menu.opt=Optimize") @@ -285,7 +293,7 @@ def MakeBoard(name, chip, vendor_name, product_name, vid, pid, pwr, boarddefine, else: raise Exception("Unknown board type " + str(chip)); BuildHeader(name, chip, tup, opts, vendor_name, product_name, vid, pid, pwr, boarddefine, name, flashsizemb * 1024 * 1024, psramsize, boot2, extra) - if (name == "generic") or (name == "vccgnd_yd_rp2040"): + if (name == "generic") or (name == "generic_rp2350") or (name == "vccgnd_yd_rp2040"): BuildFlashMenu(name, chip, 2*1024*1024, [0, 1*1024*1024]) BuildFlashMenu(name, chip, 4*1024*1024, [0, 3*1024*1024, 2*1024*1024]) BuildFlashMenu(name, chip, 8*1024*1024, [0, 7*1024*1024, 4*1024*1024, 2*1024*1024]) @@ -302,8 +310,9 @@ def MakeBoard(name, chip, vendor_name, product_name, vid, pid, pwr, boarddefine, if chip == "rp2350": BuildFreq(name, 150) if name == "generic_rp2350": - BuildPSRAM(name) + BuildRP2350Variant(name) BuildPSRAMCS(name) + BuildPSRAM(name) BuildPSRAMFreq(name) else: BuildFreq(name, 133) @@ -543,6 +552,7 @@ def MakeBoardJSON(name, chip, vendor_name, product_name, vid, pid, pwr, boarddef # Pimoroni MakeBoard("pimoroni_pga2040", "rp2040", "Pimoroni", "PGA2040", "0x2e8a", "0x1008", 250, "PIMORONI_PGA2040", 8, 0, "boot2_w25q64jv_4_padded_checksum") +MakeBoard("pimoroni_pga2350", "rp2350", "Pimoroni", "PGA2350", "0x2e8a", "0x1018", 250, "PIMORONI_PGA2350", 16, 8, "boot2_w25q080_4_padded_checksum") MakeBoard("pimoroni_pico_plus_2", "rp2350", "Pimoroni", "PicoPlus2", "0x2e8a", "0x100a", 500, "PIMORONI_PICO_PLUS_2", 16, 8, "boot2_generic_03h_4_padded_checksum") MakeBoard("pimoroni_plasma2040", "rp2040", "Pimoroni", "Plasma2040", "0x2e8a", "0x100a", 500, "PIMORONI_PLASMA2040", 2, 0, "boot2_w25q080_2_padded_checksum") MakeBoard("pimoroni_tiny2040", "rp2040", "Pimoroni", "Tiny2040", "0x2e8a", "0x100a", 500, "PIMORONI_TINY2040", 2, 0, "boot2_w25q64jv_4_padded_checksum") diff --git a/variants/amken_revelop_es/pins_arduino.h b/variants/amken_revelop_es/pins_arduino.h index 060a3805d..c55bbdfdb 100644 --- a/variants/amken_revelop_es/pins_arduino.h +++ b/variants/amken_revelop_es/pins_arduino.h @@ -15,7 +15,7 @@ //Accelerometer #define PIN_LIS_CS (1u) -#define PIN_LIS_INTERRUPT1 (23u) +//#define PIN_LIS_INTERRUPT1 (23u) #define PIN_LIS_INTERRUPT1 (25u) //MAX31865 diff --git a/variants/breadstick_raspberry/pins_arduino.h b/variants/breadstick_raspberry/pins_arduino.h index b6e91f4e9..d70c7f39e 100644 --- a/variants/breadstick_raspberry/pins_arduino.h +++ b/variants/breadstick_raspberry/pins_arduino.h @@ -6,7 +6,6 @@ // Pin definitions taken from: // https://github.com/Breadstick-Innovations/Raspberry-Breadstick - // Serial #define PIN_SERIAL1_TX (20u) #define PIN_SERIAL1_RX (21u) diff --git a/variants/generic/common.h b/variants/generic/common.h index 5890c5eab..8227962b3 100644 --- a/variants/generic/common.h +++ b/variants/generic/common.h @@ -164,6 +164,8 @@ static const uint8_t D29 = __PIN_D29; static const uint8_t D29 = (29u); #endif +#if !defined(PICO_RP2350B) + #ifdef __PIN_A0 static const uint8_t A0 = __PIN_A0; #else @@ -188,6 +190,150 @@ static const uint8_t A3 = __PIN_A3; static const uint8_t A3 = (29u); #endif +#elif defined(PICO_RP2350B) + +#ifdef __PIN_D30 +static const uint8_t D30 = __PIN_D30; +#else +static const uint8_t D30 = (30u); +#endif +#ifdef __PIN_D31 +static const uint8_t D31 = __PIN_D31; +#else +static const uint8_t D31 = (31u); +#endif +#ifdef __PIN_D32 +static const uint8_t D32 = __PIN_D32; +#else +static const uint8_t D32 = (32u); +#endif +#ifdef __PIN_D33 +static const uint8_t D33 = __PIN_D33; +#else +static const uint8_t D33 = (33u); +#endif +#ifdef __PIN_D34 +static const uint8_t D34 = __PIN_D34; +#else +static const uint8_t D34 = (34u); +#endif +#ifdef __PIN_D35 +static const uint8_t D35 = __PIN_D35; +#else +static const uint8_t D35 = (35u); +#endif +#ifdef __PIN_D36 +static const uint8_t D36 = __PIN_D36; +#else +static const uint8_t D36 = (36u); +#endif +#ifdef __PIN_D37 +static const uint8_t D37 = __PIN_D37; +#else +static const uint8_t D37 = (37u); +#endif +#ifdef __PIN_D38 +static const uint8_t D38 = __PIN_D38; +#else +static const uint8_t D38 = (38u); +#endif +#ifdef __PIN_D39 +static const uint8_t D39 = __PIN_D39; +#else +static const uint8_t D39 = (39u); +#endif +#ifdef __PIN_D40 +static const uint8_t D40 = __PIN_D40; +#else +static const uint8_t D40 = (40u); +#endif +#ifdef __PIN_D41 +static const uint8_t D41 = __PIN_D41; +#else +static const uint8_t D41 = (41u); +#endif +#ifdef __PIN_D42 +static const uint8_t D42 = __PIN_D42; +#else +static const uint8_t D42 = (42u); +#endif +#ifdef __PIN_D43 +static const uint8_t D43 = __PIN_D43; +#else +static const uint8_t D43 = (43u); +#endif +#ifdef __PIN_D44 +static const uint8_t D44 = __PIN_D44; +#else +static const uint8_t D44 = (44u); +#endif +#ifdef __PIN_D45 +static const uint8_t D45 = __PIN_D45; +#else +static const uint8_t D45 = (45u); +#endif +#ifdef __PIN_D46 +static const uint8_t D46 = __PIN_D46; +#else +static const uint8_t D46 = (46u); +#endif +#ifdef __PIN_D47 +static const uint8_t D47 = __PIN_D47; +#else +static const uint8_t D47 = (47u); +#endif + +#ifdef __PIN_A0 +static const uint8_t A0 = __PIN_A0; +#else +static const uint8_t A0 = (40u); +#endif + +#ifdef __PIN_A1 +static const uint8_t A1 = __PIN_A1; +#else +static const uint8_t A1 = (41u); +#endif + +#ifdef __PIN_A2 +static const uint8_t A2 = __PIN_A2; +#else +static const uint8_t A2 = (42u); +#endif + +#ifdef __PIN_A3 +static const uint8_t A3 = __PIN_A3; +#else +static const uint8_t A3 = (43u); +#endif + +#ifdef __PIN_A4 +static const uint8_t A4 = __PIN_A4; +#else +static const uint8_t A4 = (44u); +#endif + +#ifdef __PIN_A5 +static const uint8_t A5 = __PIN_A5; +#else +static const uint8_t A5 = (45u); +#endif + +#ifdef __PIN_A6 +static const uint8_t A6 = __PIN_A6; +#else +static const uint8_t A6 = (46u); +#endif + +#ifdef __PIN_A7 +static const uint8_t A7 = __PIN_A7; +#else +static const uint8_t A7 = (47u); +#endif + +#endif + + static const uint8_t SS = PIN_SPI0_SS; static const uint8_t MOSI = PIN_SPI0_MOSI; static const uint8_t MISO = PIN_SPI0_MISO; diff --git a/variants/pimoroni_pga2350/pins_arduino.h b/variants/pimoroni_pga2350/pins_arduino.h new file mode 100644 index 000000000..5f9deb7fa --- /dev/null +++ b/variants/pimoroni_pga2350/pins_arduino.h @@ -0,0 +1,8 @@ +#pragma once + +// Enables external PSRAM +#define RP2350_PSRAM_CS 47 +#define PICO_RP2350B 1 + +// This is a bare board with no real predefined pins, so use generic +#include "../generic/pins_arduino.h"