# SPDX-License-Identifier: Apache-2.0 include(ExternalProject) if(CONFIG_HAS_RPI_PICO) zephyr_library() set(rp2_common_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/rp2_common) set(rp2040_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/rp2040) set(common_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/common) set(boot_stage_dir ${rp2_common_dir}/boot_stage2) # The Second Stage Bootloader is only linked to the app that resides # at 0x100. Therefore, only if the app's offset is 0x100, the second # stage bootloader should be compiled. if(CONFIG_RP2_REQUIRES_SECOND_STAGE_BOOT) foreach(flash W25Q080 GENERIC_03H IS25LP080 W25X10CL AT25SF128A) if(CONFIG_RP2_FLASH_${flash}) set(flash_type ${flash}) break() endif() endforeach() set(rp2_bootloader_prefix ${CMAKE_BINARY_DIR}/bootloader) set(rp2_bootloader_asm ${rp2_bootloader_prefix}/boot_stage2.S) ExternalProject_Add( second_stage_bootloader SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/bootloader BINARY_DIR ${rp2_bootloader_prefix} CMAKE_ARGS -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER} -DCMAKE_ASM_COMPILER=${CMAKE_ASM_COMPILER} -DZEPHYR_HAL_RPI_PICO_MODULE_DIR=${ZEPHYR_HAL_RPI_PICO_MODULE_DIR} -DZEPHYR_BASE=${ZEPHYR_BASE} -DFLASH_TYPE=${flash_type} -DPYTHON_EXECUTABLE=${Python3_EXECUTABLE} -DCONFIG_LEGACY_INCLUDE_PATH=$ -DRP2_BOOTLOADER_BYPRODUCT=${rp2_bootloader_asm} INSTALL_COMMAND "" # No installation needed BUILD_BYPRODUCTS ${rp2_bootloader_asm} BUILD_ALWAYS TRUE ) add_dependencies(${ZEPHYR_CURRENT_LIBRARY} second_stage_bootloader) zephyr_library_sources(${rp2_bootloader_asm}) endif() # Pico sources and headers necessary for every build. # These contain definitions and implementation used mostly for # initializing the SoC, and therefore are always required. zephyr_library_sources( ${rp2_common_dir}/hardware_clocks/clocks.c ${rp2_common_dir}/hardware_pll/pll.c ${rp2_common_dir}/hardware_xosc/xosc.c ${rp2_common_dir}/hardware_watchdog/watchdog.c ${rp2_common_dir}/pico_platform/platform.c ${rp2_common_dir}/pico_bootrom/bootrom.c ) zephyr_include_directories( ${rp2_common_dir}/hardware_base/include ${rp2_common_dir}/hardware_clocks/include ${rp2_common_dir}/hardware_watchdog/include ${rp2_common_dir}/hardware_xosc/include ${rp2_common_dir}/hardware_pll/include ${rp2_common_dir}/hardware_irq/include ${rp2_common_dir}/hardware_sync/include ${rp2_common_dir}/hardware_timer/include ${rp2_common_dir}/hardware_resets/include ${rp2_common_dir}/pico_bootrom/include ${rp2040_dir}/hardware_regs/include ${rp2040_dir}/hardware_structs/include ${common_dir}/pico_base/include ${rp2_common_dir}/pico_platform/include ${CMAKE_CURRENT_LIST_DIR} ) zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_GPIO ${rp2_common_dir}/hardware_gpio/gpio.c) zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_GPIO ${rp2_common_dir}/hardware_gpio/include) zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_UART ${rp2_common_dir}/hardware_uart/uart.c) zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_UART ${rp2_common_dir}/hardware_uart/include) zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_FLASH ${rp2_common_dir}/hardware_flash/flash.c) zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_FLASH ${rp2_common_dir}/hardware_flash/include) # Some flash driver functions must be executed from the RAM. # Originally pico-sdk places them in the RW data section, so this # implementation does the same. zephyr_linker_sources_ifdef(CONFIG_PICOSDK_USE_FLASH RWDATA timecritical.ld) # A function in flash.c adds 1 to a function pointer, causing a warning set_source_files_properties( ${rp2_common_dir}/hardware_flash/flash.c PROPERTIES COMPILE_FLAGS $ ) endif()