From 754bdf16bfb5f4b596eacee14d877c5eac0a8baa Mon Sep 17 00:00:00 2001 From: Richard Hulme Date: Tue, 30 Dec 2025 19:44:42 +0100 Subject: [PATCH] Allow 'host' platform to simulate either RP2040 or RP2350 The 'host' platform only really partially simulates an RP2040 environment, with no way to specify a particular board either, so attempting to build a host version of a existing code that uses an RP2350 or relies on values defined in a board file is either difficult or impossible. Instead of setting PICO_PLATFORM to just 'host', it can now be set to 'host-rp2040' or 'host-rp2350' and PICO_BOARD can be set to any board configuration that is compatible with the given chip type. Platform definitions for the given chip will be fetched, meaning defines such as 'NUM_IRQS' will be set correctly. Fixes #2778 --- cmake/pico_pre_load_platform.cmake | 17 ++++--- .../{host.cmake => host-rp2040.cmake} | 0 .../preload/platforms/host-rp2350-arm-s.cmake | 0 .../preload/platforms/host-rp2350-riscv.cmake | 0 src/CMakeLists.txt | 8 +--- src/cmake/no_hardware.cmake | 41 ++++++++++++++++- src/host-rp2040.cmake | 19 ++++++++ src/host-rp2350-arm-s.cmake | 20 +++++++++ src/host.cmake | 45 ------------------- src/host/pico_platform/CMakeLists.txt | 9 +++- .../include/hardware/platform_defs.h | 34 -------------- 11 files changed, 101 insertions(+), 92 deletions(-) rename cmake/preload/platforms/{host.cmake => host-rp2040.cmake} (100%) create mode 100644 cmake/preload/platforms/host-rp2350-arm-s.cmake create mode 100644 cmake/preload/platforms/host-rp2350-riscv.cmake create mode 100644 src/host-rp2040.cmake create mode 100644 src/host-rp2350-arm-s.cmake delete mode 100644 src/host.cmake delete mode 100644 src/host/pico_platform/include/hardware/platform_defs.h diff --git a/cmake/pico_pre_load_platform.cmake b/cmake/pico_pre_load_platform.cmake index 936e2f99c..440645d11 100644 --- a/cmake/pico_pre_load_platform.cmake +++ b/cmake/pico_pre_load_platform.cmake @@ -11,6 +11,11 @@ if (DEFINED ENV{PICO_PLATFORM} AND NOT PICO_PLATFORM) set(PICO_PLATFORM $ENV{PICO_PLATFORM}) message("Initializing PICO_PLATFORM from environment ('${PICO_PLATFORM}')") endif() + +if (${PICO_PLATFORM} STREQUAL "host") + set(PICO_PLATFORM "host-rp2040") +endif() + set(PICO_SAVED_PLATFORM "${PICO_PLATFORM}") # If PICO_PLATFORM is specified but not PICO_BOARD, we'll make a stab at defaulting @@ -88,11 +93,12 @@ endif() if (NOT COMMAND pico_expand_pico_platform) function(pico_expand_pico_platform FUNC DO_MESSAGE) - if (${FUNC} STREQUAL "rp2350") + if (${FUNC} MATCHES "rp2350$") + string(REGEX REPLACE "rp2350$" "${PICO_DEFAULT_RP2350_PLATFORM}" NEW_PLATFORM ${${FUNC}}) if (DO_MESSAGE) - message("Auto-converting non-specific PICO_PLATFORM='rp2350' to '${PICO_DEFAULT_RP2350_PLATFORM}'") + message("Auto-converting non-specific PICO_PLATFORM='${${FUNC}}' to '${NEW_PLATFORM}'") endif() - set(${FUNC} "${PICO_DEFAULT_RP2350_PLATFORM}" PARENT_SCOPE) + set(${FUNC} "${NEW_PLATFORM}" PARENT_SCOPE) endif() endfunction() endif() @@ -105,8 +111,9 @@ else() pico_expand_pico_platform(PICO_PLATFORM 1) pico_message("Defaulting platform (PICO_PLATFORM) to '${PICO_PLATFORM}' based on PICO_BOARD setting.") else() - string(REGEX REPLACE "-.*" "" PICO_PLATFORM_PREFIX ${PICO_PLATFORM}) - string(REGEX REPLACE "-.*" "" PICO_SAVED_PLATFORM_PREFIX ${PICO_SAVED_PLATFORM}) + string(REGEX REPLACE "((host-)?(rp[0-9]+))(-.*)?" "\\3" PICO_PLATFORM_PREFIX ${PICO_PLATFORM}) + string(REGEX REPLACE "((host-)?(rp[0-9]+))(-.*)?" "\\3" PICO_SAVED_PLATFORM_PREFIX ${PICO_SAVED_PLATFORM}) + if (PICO_PLATFORM_PREFIX STREQUAL PICO_SAVED_PLATFORM_PREFIX) # the PICO_PLATFORM specified based on the board is compatible based on the one we were # already using, so use that diff --git a/cmake/preload/platforms/host.cmake b/cmake/preload/platforms/host-rp2040.cmake similarity index 100% rename from cmake/preload/platforms/host.cmake rename to cmake/preload/platforms/host-rp2040.cmake diff --git a/cmake/preload/platforms/host-rp2350-arm-s.cmake b/cmake/preload/platforms/host-rp2350-arm-s.cmake new file mode 100644 index 000000000..e69de29bb diff --git a/cmake/preload/platforms/host-rp2350-riscv.cmake b/cmake/preload/platforms/host-rp2350-riscv.cmake new file mode 100644 index 000000000..e69de29bb diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 65b1d8c5f..792e9ed06 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -121,9 +121,7 @@ macro(pico_simple_hardware_headers_target NAME) target_include_directories(hardware_${NAME}_headers SYSTEM INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include) target_link_libraries(hardware_${NAME}_headers INTERFACE pico_base_headers) - if (NOT PICO_NO_HARDWARE) - target_link_libraries(hardware_${NAME}_headers INTERFACE hardware_structs hardware_claim_headers) - endif() + target_link_libraries(hardware_${NAME}_headers INTERFACE hardware_structs hardware_claim_headers) endif() endmacro() @@ -141,9 +139,7 @@ macro(pico_simple_hardware_headers_only_target NAME) # a headers only target should still have an explicit _headers library for consistency target_include_directories(hardware_${NAME}_headers SYSTEM INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include) target_link_libraries(hardware_${NAME}_headers INTERFACE pico_base_headers) - if (NOT PICO_NO_HARDWARE) - target_link_libraries(hardware_${NAME}_headers INTERFACE hardware_structs) - endif() + target_link_libraries(hardware_${NAME}_headers INTERFACE hardware_structs) add_library(hardware_${NAME} INTERFACE) target_link_libraries(hardware_${NAME} INTERFACE hardware_${NAME}_headers) diff --git a/src/cmake/no_hardware.cmake b/src/cmake/no_hardware.cmake index 95a034be0..674ccb9e4 100644 --- a/src/cmake/no_hardware.cmake +++ b/src/cmake/no_hardware.cmake @@ -23,4 +23,43 @@ function(pico_add_extra_outputs TARGET) endfunction() set(PICO_NO_HARDWARE "1" CACHE INTERNAL "") -set(PICO_ON_DEVICE "0" CACHE INTERNAL "") \ No newline at end of file +set(PICO_ON_DEVICE "0" CACHE INTERNAL "") + +# RP2040/RP2350 specific From standard build variants +pico_add_subdirectory(${RP2_VARIANT_DIR}/hardware_regs) +pico_add_subdirectory(${RP2_VARIANT_DIR}/hardware_structs) + +# common +pico_add_subdirectory(${COMMON_DIR}/boot_picobin_headers) +pico_add_subdirectory(${COMMON_DIR}/boot_picoboot_headers) +pico_add_subdirectory(${COMMON_DIR}/boot_uf2_headers) +pico_add_subdirectory(${COMMON_DIR}/hardware_claim) +pico_add_subdirectory(${COMMON_DIR}/pico_base_headers) +pico_add_subdirectory(${COMMON_DIR}/pico_usb_reset_interface_headers) +pico_add_subdirectory(${COMMON_DIR}/pico_bit_ops_headers) +pico_add_subdirectory(${COMMON_DIR}/pico_binary_info) +pico_add_subdirectory(${COMMON_DIR}/pico_divider_headers) +pico_add_subdirectory(${COMMON_DIR}/pico_sync) +pico_add_subdirectory(${COMMON_DIR}/pico_time) +pico_add_subdirectory(${COMMON_DIR}/pico_util) +pico_add_subdirectory(${COMMON_DIR}/pico_stdlib_headers) + +# host-specific +pico_add_subdirectory(${HOST_DIR}/hardware_divider) +pico_add_subdirectory(${HOST_DIR}/hardware_gpio) +pico_add_subdirectory(${HOST_DIR}/hardware_irq) +pico_add_subdirectory(${HOST_DIR}/hardware_sync) +pico_add_subdirectory(${HOST_DIR}/hardware_timer) +pico_add_subdirectory(${HOST_DIR}/hardware_uart) +pico_add_subdirectory(${HOST_DIR}/pico_bit_ops) +pico_add_subdirectory(${HOST_DIR}/pico_divider) +pico_add_subdirectory(${HOST_DIR}/pico_multicore) +pico_add_subdirectory(${HOST_DIR}/pico_platform) +pico_add_subdirectory(${HOST_DIR}/pico_rand) +pico_add_subdirectory(${HOST_DIR}/pico_runtime) +pico_add_subdirectory(${HOST_DIR}/pico_printf) +pico_add_subdirectory(${HOST_DIR}/pico_status_led) +pico_add_subdirectory(${HOST_DIR}/pico_stdio) +pico_add_subdirectory(${HOST_DIR}/pico_stdlib) +pico_add_subdirectory(${HOST_DIR}/pico_time_adapter) +pico_add_subdirectory(${HOST_DIR}/pico_unique_id) diff --git a/src/host-rp2040.cmake b/src/host-rp2040.cmake new file mode 100644 index 000000000..21bb1a96d --- /dev/null +++ b/src/host-rp2040.cmake @@ -0,0 +1,19 @@ +set(CMAKE_DIR cmake) +set(COMMON_DIR common) +set(HOST_DIR host) + +# include everything needed to build against rp2040 + +set(PICO_RP2040 "1" CACHE INTERNAL "") +set(PICO_RP2350 "0" CACHE INTERNAL "") +set(PICO_RISCV "0" CACHE INTERNAL "") +set(PICO_ARM "0" CACHE INTERNAL "") +set(RP2_VARIANT_DIR ${CMAKE_CURRENT_LIST_DIR}/rp2040) +set(PICO_CMSIS_DEVICE "RP2040" CACHE INTERNAL "") +set(PICO_DEFAULT_FLASH_SIZE_BYTES "2 * 1024 * 1024") + +include (${CMAKE_DIR}/no_hardware.cmake) + +unset(CMAKE_DIR) +unset(COMMON_DIR) +unset(HOST_DIR) \ No newline at end of file diff --git a/src/host-rp2350-arm-s.cmake b/src/host-rp2350-arm-s.cmake new file mode 100644 index 000000000..d624cadfa --- /dev/null +++ b/src/host-rp2350-arm-s.cmake @@ -0,0 +1,20 @@ +set(CMAKE_DIR cmake) +set(COMMON_DIR common) +set(HOST_DIR host) + +# include everything needed to build against rp2350 + +set(PICO_RP2040 "0" CACHE INTERNAL "") +set(PICO_RP2350 "1" CACHE INTERNAL "") +set(PICO_RISCV "0" CACHE INTERNAL "") +set(PICO_ARM "0" CACHE INTERNAL "") +set(RP2_VARIANT_DIR ${CMAKE_CURRENT_LIST_DIR}/rp2350) +set(PICO_PIO_VERSION "1" CACHE INTERNAL "") +set(PICO_CMSIS_DEVICE "RP2350" CACHE INTERNAL "") +set(PICO_DEFAULT_FLASH_SIZE_BYTES "4 * 1024 * 1024") + +include (${CMAKE_DIR}/no_hardware.cmake) + +unset(CMAKE_DIR) +unset(COMMON_DIR) +unset(HOST_DIR) \ No newline at end of file diff --git a/src/host.cmake b/src/host.cmake deleted file mode 100644 index 731469d32..000000000 --- a/src/host.cmake +++ /dev/null @@ -1,45 +0,0 @@ -set(CMAKE_DIR cmake) -set(COMMON_DIR common) -set(HOST_DIR host) - -include (${CMAKE_DIR}/no_hardware.cmake) - - -# common - pico_add_subdirectory(${COMMON_DIR}/boot_picobin_headers) - pico_add_subdirectory(${COMMON_DIR}/boot_picoboot_headers) - pico_add_subdirectory(${COMMON_DIR}/boot_uf2_headers) - pico_add_subdirectory(${COMMON_DIR}/hardware_claim) - pico_add_subdirectory(${COMMON_DIR}/pico_base_headers) - pico_add_subdirectory(${COMMON_DIR}/pico_usb_reset_interface_headers) - pico_add_subdirectory(${COMMON_DIR}/pico_bit_ops_headers) - pico_add_subdirectory(${COMMON_DIR}/pico_binary_info) - pico_add_subdirectory(${COMMON_DIR}/pico_divider_headers) - pico_add_subdirectory(${COMMON_DIR}/pico_sync) - pico_add_subdirectory(${COMMON_DIR}/pico_time) - pico_add_subdirectory(${COMMON_DIR}/pico_util) - pico_add_subdirectory(${COMMON_DIR}/pico_stdlib_headers) - -# host-specific - pico_add_subdirectory(${HOST_DIR}/hardware_divider) - pico_add_subdirectory(${HOST_DIR}/hardware_gpio) - pico_add_subdirectory(${HOST_DIR}/hardware_irq) - pico_add_subdirectory(${HOST_DIR}/hardware_sync) - pico_add_subdirectory(${HOST_DIR}/hardware_timer) - pico_add_subdirectory(${HOST_DIR}/hardware_uart) - pico_add_subdirectory(${HOST_DIR}/pico_bit_ops) - pico_add_subdirectory(${HOST_DIR}/pico_divider) - pico_add_subdirectory(${HOST_DIR}/pico_multicore) - pico_add_subdirectory(${HOST_DIR}/pico_platform) - pico_add_subdirectory(${HOST_DIR}/pico_rand) - pico_add_subdirectory(${HOST_DIR}/pico_runtime) - pico_add_subdirectory(${HOST_DIR}/pico_printf) - pico_add_subdirectory(${HOST_DIR}/pico_status_led) - pico_add_subdirectory(${HOST_DIR}/pico_stdio) - pico_add_subdirectory(${HOST_DIR}/pico_stdlib) - pico_add_subdirectory(${HOST_DIR}/pico_time_adapter) - pico_add_subdirectory(${HOST_DIR}/pico_unique_id) - -unset(CMAKE_DIR) -unset(COMMON_DIR) -unset(HOST_DIR) \ No newline at end of file diff --git a/src/host/pico_platform/CMakeLists.txt b/src/host/pico_platform/CMakeLists.txt index 87178696f..167af6516 100644 --- a/src/host/pico_platform/CMakeLists.txt +++ b/src/host/pico_platform/CMakeLists.txt @@ -2,13 +2,20 @@ if (NOT TARGET pico_platform_headers) add_library(pico_platform_headers INTERFACE) - target_compile_definitions(pico_platform_headers INTERFACE PICO_NO_HARDWARE=1 PICO_ON_DEVICE=0 PICO_BUILD=1 ) + if (DEFINED PICO_RP2040 AND ${PICO_RP2040}) + target_compile_definitions(pico_platform_headers INTERFACE PICO_RP2040=1) + endif() + + if (DEFINED PICO_RP2350 AND ${PICO_RP2350}) + target_compile_definitions(pico_platform_headers INTERFACE PICO_RP2350=1) + endif() + target_include_directories(pico_platform_headers SYSTEM INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include) endif() diff --git a/src/host/pico_platform/include/hardware/platform_defs.h b/src/host/pico_platform/include/hardware/platform_defs.h deleted file mode 100644 index c1a6f5f44..000000000 --- a/src/host/pico_platform/include/hardware/platform_defs.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _HARDWARE_PLATFORM_DEFS_H -#define _HARDWARE_PLATFORM_DEFS_H - -#define NUM_CORES 2u - -#define NUM_DMA_CHANNELS 12u - -#define NUM_GENERIC_TIMERS 1u -#define NUM_ALARMS 4u - -#define NUM_IRQS 32u -#define NUM_USER_IRQS 6u -#define FIRST_USER_IRQ (NUM_IRQS - NUM_USER_IRQS) -#define VTABLE_FIRST_IRQ 16 - -#define NUM_SPIN_LOCKS 32u - -#define XOSC_HZ 12000000u - -#define NUM_SPIN_LOCKS 32u - -#define NUM_BANK0_GPIOS 30 - -#ifndef _u -#define _u(x) x ## u -#endif - -#endif