From 46d325065f69fb25dfcee3b3e444f3042ffc865e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 5 Mar 2026 14:31:08 -1000 Subject: [PATCH] Filter out placeholder pin values (e.g. 99) during board generation --- esphome/components/rp2040/boards.py | 226 +----------------- esphome/components/rp2040/generate_boards.py | 11 +- .../components/test_rp2040_generate_boards.py | 37 +++ 3 files changed, 58 insertions(+), 216 deletions(-) diff --git a/esphome/components/rp2040/boards.py b/esphome/components/rp2040/boards.py index 4121b17197..c99934567a 100644 --- a/esphome/components/rp2040/boards.py +++ b/esphome/components/rp2040/boards.py @@ -15,9 +15,7 @@ RP2040_BOARD_PINS = { "MOSI": 23, "RX": 1, "SCK": 22, - "SCL": 31, "SCL1": 3, - "SDA": 31, "SDA1": 2, "SS": 21, "TX": 0, @@ -59,7 +57,6 @@ RP2040_BOARD_PINS = { "SDA": 16, "SDA1": 5, "SS": 13, - "TX": 30, }, "adafruit_feather": { "LED": 13, @@ -81,9 +78,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 14, "SCL": 3, - "SCL1": 31, "SDA": 2, - "SDA1": 31, "SS": 13, "TX": 0, }, @@ -94,9 +89,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 14, "SCL": 3, - "SCL1": 31, "SDA": 2, - "SDA1": 31, "SS": 13, "TX": 0, }, @@ -107,9 +100,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 14, "SCL": 3, - "SCL1": 31, "SDA": 2, - "SDA1": 31, "SS": 13, "TX": 0, }, @@ -120,9 +111,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 14, "SCL": 3, - "SCL1": 31, "SDA": 2, - "SDA1": 31, "SS": 13, "TX": 0, }, @@ -133,9 +122,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 14, "SCL": 3, - "SCL1": 31, "SDA": 2, - "SDA1": 31, "SS": 13, "TX": 0, }, @@ -172,9 +159,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 14, "SCL": 3, - "SCL1": 31, "SDA": 2, - "SDA1": 31, "SS": 13, "TX": 0, }, @@ -185,9 +170,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 14, "SCL": 3, - "SCL1": 31, "SDA": 2, - "SDA1": 31, "SS": 13, "TX": 0, }, @@ -198,9 +181,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 14, "SCL": 3, - "SCL1": 31, "SDA": 2, - "SDA1": 31, "SS": 13, "TX": 0, }, @@ -208,14 +189,10 @@ RP2040_BOARD_PINS = { "LED": 28, "MISO": 20, "MOSI": 19, - "RX": 31, "SCK": 18, "SCL": 17, - "SCL1": 31, "SDA": 16, - "SDA1": 31, "SS": 24, - "TX": 31, }, "adafruit_fruitjam": { "LED": 29, @@ -224,9 +201,7 @@ RP2040_BOARD_PINS = { "RX": 9, "SCK": 34, "SCL": 21, - "SCL1": 99, "SDA": 20, - "SDA1": 99, "SS": 39, "TX": 8, }, @@ -240,11 +215,9 @@ RP2040_BOARD_PINS = { "SCL1": 3, "SDA": 24, "SDA1": 2, - "SS": 31, "TX": 0, }, "adafruit_kb2040": { - "LED": 31, "MISO": 20, "MOSI": 19, "RX": 1, @@ -253,22 +226,9 @@ RP2040_BOARD_PINS = { "SCL1": 3, "SDA": 12, "SDA1": 2, - "SS": 31, "TX": 0, }, - "adafruit_macropad2040": { - "LED": 13, - "MISO": 31, - "MOSI": 31, - "RX": 31, - "SCK": 31, - "SCL": 21, - "SCL1": 31, - "SDA": 20, - "SDA1": 31, - "SS": 31, - "TX": 31, - }, + "adafruit_macropad2040": {"LED": 13, "SCL": 21, "SDA": 20}, "adafruit_metro": { "LED": 13, "MISO": 20, @@ -289,14 +249,11 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 30, "SCL": 21, - "SCL1": 99, "SDA": 20, - "SDA1": 99, "SS": 29, "TX": 0, }, "adafruit_qtpy": { - "LED": 31, "MISO": 4, "MOSI": 3, "RX": 29, @@ -305,7 +262,6 @@ RP2040_BOARD_PINS = { "SCL1": 23, "SDA": 24, "SDA1": 22, - "SS": 31, "TX": 28, }, "adafruit_stemmafriend": { @@ -321,19 +277,7 @@ RP2040_BOARD_PINS = { "SS": 1, "TX": 26, }, - "adafruit_trinkeyrp2040qt": { - "LED": 31, - "MISO": 31, - "MOSI": 31, - "RX": 17, - "SCK": 31, - "SCL": 17, - "SCL1": 31, - "SDA": 16, - "SDA1": 31, - "SS": 31, - "TX": 16, - }, + "adafruit_trinkeyrp2040qt": {"RX": 17, "SCL": 17, "SDA": 16, "TX": 16}, "akana_r1": { "LED": 25, "MISO": 16, @@ -347,58 +291,10 @@ RP2040_BOARD_PINS = { "SS": 17, "TX": 0, }, - "amken_bunny": { - "LED": 24, - "MISO": 31, - "MOSI": 31, - "RX": 1, - "SCK": 31, - "SCL": 31, - "SCL1": 31, - "SDA": 31, - "SDA1": 31, - "SS": 31, - "TX": 0, - }, - "amken_revelop": { - "LED": 24, - "MISO": 31, - "MOSI": 31, - "RX": 1, - "SCK": 31, - "SCL": 29, - "SCL1": 31, - "SDA": 28, - "SDA1": 31, - "SS": 31, - "TX": 0, - }, - "amken_revelop_es": { - "LED": 5, - "MISO": 0, - "MOSI": 3, - "RX": 31, - "SCK": 2, - "SCL": 31, - "SCL1": 31, - "SDA": 31, - "SDA1": 31, - "SS": 1, - "TX": 20, - }, - "amken_revelop_plus": { - "LED": 24, - "MISO": 31, - "MOSI": 31, - "RX": 1, - "SCK": 31, - "SCL": 29, - "SCL1": 31, - "SDA": 28, - "SDA1": 31, - "SS": 31, - "TX": 0, - }, + "amken_bunny": {"LED": 24, "RX": 1, "TX": 0}, + "amken_revelop": {"LED": 24, "RX": 1, "SCL": 29, "SDA": 28, "TX": 0}, + "amken_revelop_es": {"LED": 5, "MISO": 0, "MOSI": 3, "SCK": 2, "SS": 1, "TX": 20}, + "amken_revelop_plus": {"LED": 24, "RX": 1, "SCL": 29, "SDA": 28, "TX": 0}, "artronshop_rp2_nano": { "LED": 13, "MISO": 4, @@ -412,17 +308,7 @@ RP2040_BOARD_PINS = { "SS": 5, "TX": 0, }, - "bigtreetech_SKR_Pico": { - "LED": 13, - "MISO": 99, - "MOSI": 99, - "RX": 1, - "SCK": 99, - "SCL1": 99, - "SDA1": 99, - "SS": 99, - "TX": 0, - }, + "bigtreetech_SKR_Pico": {"LED": 13, "RX": 1, "TX": 0}, "breadstick_raspberry": { "RX": 21, "SCL": 13, @@ -464,9 +350,7 @@ RP2040_BOARD_PINS = { "RX": 17, "SCK": 22, "SCL": 1, - "SCL1": 31, "SDA": 0, - "SDA1": 31, "SS": 21, "TX": 16, }, @@ -477,9 +361,7 @@ RP2040_BOARD_PINS = { "RX": 17, "SCK": 22, "SCL": 1, - "SCL1": 31, "SDA": 0, - "SDA1": 31, "SS": 21, "TX": 16, }, @@ -503,9 +385,7 @@ RP2040_BOARD_PINS = { "RX": 17, "SCK": 22, "SCL": 1, - "SCL1": 31, "SDA": 0, - "SDA1": 31, "SS": 21, "TX": 16, }, @@ -516,9 +396,7 @@ RP2040_BOARD_PINS = { "RX": 17, "SCK": 22, "SCL": 1, - "SCL1": 31, "SDA": 0, - "SDA1": 31, "SS": 21, "TX": 16, }, @@ -529,9 +407,7 @@ RP2040_BOARD_PINS = { "RX": 17, "SCK": 22, "SCL": 1, - "SCL1": 31, "SDA": 0, - "SDA1": 31, "SS": 21, "TX": 16, }, @@ -542,9 +418,7 @@ RP2040_BOARD_PINS = { "RX": 17, "SCK": 22, "SCL": 1, - "SCL1": 31, "SDA": 0, - "SDA1": 31, "SS": 21, "TX": 16, }, @@ -555,9 +429,7 @@ RP2040_BOARD_PINS = { "RX": 17, "SCK": 22, "SCL": 1, - "SCL1": 31, "SDA": 0, - "SDA1": 31, "SS": 21, "TX": 16, }, @@ -568,9 +440,7 @@ RP2040_BOARD_PINS = { "RX": 17, "SCK": 22, "SCL": 1, - "SCL1": 31, "SDA": 0, - "SDA1": 31, "SS": 21, "TX": 16, }, @@ -607,9 +477,7 @@ RP2040_BOARD_PINS = { "RX": 17, "SCK": 22, "SCL": 1, - "SCL1": 31, "SDA": 0, - "SDA1": 31, "SS": 21, "TX": 16, }, @@ -620,9 +488,7 @@ RP2040_BOARD_PINS = { "RX": 17, "SCK": 22, "SCL": 1, - "SCL1": 31, "SDA": 0, - "SDA1": 31, "SS": 21, "TX": 16, }, @@ -654,15 +520,11 @@ RP2040_BOARD_PINS = { }, "cytron_maker_pi_rp2040": { "LED": 3, - "MISO": 31, - "MOSI": 31, "RX": 1, - "SCK": 31, "SCL": 17, "SCL1": 3, "SDA": 16, "SDA1": 2, - "SS": 31, "TX": 0, }, "cytron_maker_uno_rp2040": { @@ -743,19 +605,7 @@ RP2040_BOARD_PINS = { "SS": 1, "TX": 28, }, - "electroniccats_huntercat_nfc": { - "LED": 8, - "MISO": 31, - "MOSI": 31, - "RX": 1, - "SCK": 31, - "SCL": 5, - "SCL1": 31, - "SDA": 4, - "SDA1": 31, - "SS": 31, - "TX": 0, - }, + "electroniccats_huntercat_nfc": {"LED": 8, "RX": 1, "SCL": 5, "SDA": 4, "TX": 0}, "evn_alpha": { "LED": 25, "MISO": 0, @@ -851,9 +701,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 22, "SCL": 5, - "SCL1": 31, "SDA": 4, - "SDA1": 31, "SS": 21, "TX": 0, }, @@ -912,7 +760,6 @@ RP2040_BOARD_PINS = { "mksthr36": { "MISO": 16, "MOSI": 19, - "RX": 31, "SCK": 18, "SCL": 23, "SDA": 22, @@ -922,7 +769,6 @@ RP2040_BOARD_PINS = { "mksthr42": { "MISO": 16, "MOSI": 19, - "RX": 31, "SCK": 18, "SCL": 23, "SDA": 22, @@ -1057,19 +903,7 @@ RP2040_BOARD_PINS = { "SS": 33, "TX": 0, }, - "pimoroni_plasma2040": { - "LED": 16, - "MISO": 31, - "MOSI": 31, - "RX": 31, - "SCK": 31, - "SCL": 21, - "SCL1": 31, - "SDA": 20, - "SDA1": 31, - "SS": 31, - "TX": 31, - }, + "pimoroni_plasma2040": {"LED": 16, "SCL": 21, "SDA": 20}, "pimoroni_plasma2350": { "LED": 16, "MISO": 31, @@ -1096,19 +930,7 @@ RP2040_BOARD_PINS = { "SS": 25, "TX": 31, }, - "pimoroni_servo2040": { - "LED": 18, - "MISO": 31, - "MOSI": 31, - "RX": 31, - "SCK": 31, - "SCL": 21, - "SCL1": 31, - "SDA": 20, - "SDA1": 31, - "SS": 31, - "TX": 31, - }, + "pimoroni_servo2040": {"LED": 18, "SCL": 21, "SDA": 20}, "pimoroni_tiny2040": { "LED": 19, "MISO": 4, @@ -1211,7 +1033,6 @@ RP2040_BOARD_PINS = { "TX": 0, }, "sea_picro": { - "LED": 31, "MISO": 20, "MOSI": 23, "RX": 1, @@ -1242,10 +1063,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 2, "SCL": 7, - "SCL1": 31, "SDA": 6, - "SDA1": 31, - "SS": 31, "TX": 0, }, "seeed_xiao_rp2350": { @@ -1267,9 +1085,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 10, "SCL": 17, - "SCL1": 31, "SDA": 16, - "SDA1": 31, "SS": 21, "TX": 0, }, @@ -1357,9 +1173,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 22, "SCL": 5, - "SCL1": 31, "SDA": 4, - "SDA1": 31, "SS": 21, "TX": 0, }, @@ -1370,9 +1184,7 @@ RP2040_BOARD_PINS = { "RX": 1, "SCK": 22, "SCL": 17, - "SCL1": 31, "SDA": 16, - "SDA1": 31, "SS": 21, "TX": 0, }, @@ -1399,7 +1211,6 @@ RP2040_BOARD_PINS = { "SCL1": 7, "SDA": 16, "SDA1": 6, - "SS": 31, "TX": 0, }, "sparkfun_thingplusrp2350": { @@ -1428,19 +1239,7 @@ RP2040_BOARD_PINS = { "SS": 17, "TX": 12, }, - "sparkfun_xrp_controller_beta": { - "LED": 64, - "MISO": 31, - "MOSI": 31, - "RX": 31, - "SCK": 31, - "SCL": 19, - "SCL1": 31, - "SDA": 18, - "SDA1": 31, - "SS": 31, - "TX": 31, - }, + "sparkfun_xrp_controller_beta": {"LED": 64, "SCL": 19, "SDA": 18}, "upesy_rp2040_devkit": { "LED": 25, "MISO": 16, @@ -1766,7 +1565,6 @@ BOARDS = { "name": "Adafruit Fruit Jam RP2350", "mcu": "rp2350", "max_pin": 47, - "max_virtual_pin": 99, }, "adafruit_itsybitsy": { "name": "Adafruit ItsyBitsy RP2040", @@ -1792,7 +1590,6 @@ BOARDS = { "name": "Adafruit Metro RP2350", "mcu": "rp2350", "max_pin": 47, - "max_virtual_pin": 99, }, "adafruit_qtpy": { "name": "Adafruit QT Py RP2040", @@ -1848,7 +1645,6 @@ BOARDS = { "name": "BIGTREETECH SKR-Pico", "mcu": "rp2040", "max_pin": 29, - "max_virtual_pin": 99, }, "breadstick_raspberry": { "name": "Breadstick Raspberry", diff --git a/esphome/components/rp2040/generate_boards.py b/esphome/components/rp2040/generate_boards.py index 8aaab119ac..f4d7add7f0 100644 --- a/esphome/components/rp2040/generate_boards.py +++ b/esphome/components/rp2040/generate_boards.py @@ -90,7 +90,16 @@ def load_boards(arduino_pico_path: Path) -> tuple[dict, dict]: pins = variant_pins_cache[variant] if pins: - board_pins[board_name] = dict(pins) + max_pin = boards[board_name]["max_pin"] + cyw43_max = CYW43_GPIO_OFFSET + CYW43_GPIO_COUNT - 1 + # Filter out placeholder values (e.g. 99 = "not connected") + filtered = { + name: value + for name, value in pins.items() + if value <= max_pin or CYW43_GPIO_OFFSET <= value <= cyw43_max + } + if filtered: + board_pins[board_name] = filtered # Compute max_virtual_pin per board from pin maps for board_name, pins in board_pins.items(): diff --git a/tests/unit_tests/components/test_rp2040_generate_boards.py b/tests/unit_tests/components/test_rp2040_generate_boards.py index 375f2dea26..2e40ed08ba 100644 --- a/tests/unit_tests/components/test_rp2040_generate_boards.py +++ b/tests/unit_tests/components/test_rp2040_generate_boards.py @@ -234,3 +234,40 @@ def test_unknown_mcu_gets_default_max_pin(arduino_pico: Path) -> None: _add_board(arduino_pico, "future", mcu="rp2450", pins_header=PICO_PINS_HEADER) _, boards = load_boards(arduino_pico) assert boards["future"]["max_pin"] == 29 + + +def test_placeholder_pins_filtered_out(arduino_pico: Path) -> None: + """Pins with placeholder values like 99 should be filtered out.""" + header = textwrap.dedent("""\ + #pragma once + #define PIN_LED (25u) + #define PIN_WIRE0_SDA (4u) + #define PIN_WIRE0_SCL (5u) + #define PIN_WIRE1_SDA (99u) + #define PIN_WIRE1_SCL (99u) + """) + _add_board(arduino_pico, "placeholder", pins_header=header) + + board_pins, boards = load_boards(arduino_pico) + + assert "SDA1" not in board_pins["placeholder"] + assert "SCL1" not in board_pins["placeholder"] + assert board_pins["placeholder"]["LED"] == 25 + assert "max_virtual_pin" not in boards["placeholder"] + + +def test_placeholder_pins_not_treated_as_virtual(arduino_pico: Path) -> None: + """Pin 99 should not cause max_virtual_pin to be set.""" + header = textwrap.dedent("""\ + #pragma once + #define PIN_LED (64u) + #define PIN_WIRE0_SDA (4u) + #define PIN_WIRE0_SCL (5u) + #define PIN_SPI0_MISO (99u) + """) + _add_board(arduino_pico, "badpin", pins_header=header) + + board_pins, boards = load_boards(arduino_pico) + + assert "MISO" not in board_pins["badpin"] + assert boards["badpin"]["max_virtual_pin"] == 64