1# SPDX-License-Identifier: Apache-2.0
2
3include(ExternalProject)
4
5if(CONFIG_HAS_RPI_PICO)
6  zephyr_library()
7  zephyr_library_compile_options(-std=gnu11)
8
9  set(rp2_common_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/rp2_common)
10  set(rp2xxx_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/${CONFIG_SOC_SERIES})
11  set(common_dir ${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}/src/common)
12  set(boot_stage_dir ${rp2xxx_dir}/boot_stage2)
13
14  # The Second Stage Bootloader is only linked to the app that resides
15  # at 0x100. Therefore, only if the app's offset is 0x100, the second
16  # stage bootloader should be compiled.
17  if(CONFIG_RP2_REQUIRES_SECOND_STAGE_BOOT)
18    foreach(flash W25Q080 GENERIC_03H IS25LP080 W25X10CL AT25SF128A)
19      if(CONFIG_RP2_FLASH_${flash})
20        set(flash_type ${flash})
21        break()
22      endif()
23    endforeach()
24
25    set(rp2_bootloader_prefix ${CMAKE_BINARY_DIR}/bootloader)
26    set(rp2_bootloader_asm ${rp2_bootloader_prefix}/boot_stage2.S)
27
28    ExternalProject_Add(
29      second_stage_bootloader
30      SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/bootloader
31      BINARY_DIR ${rp2_bootloader_prefix}
32      CMAKE_ARGS
33        -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
34        -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
35        -DCMAKE_ASM_COMPILER=${CMAKE_ASM_COMPILER}
36        -DZEPHYR_HAL_RPI_PICO_MODULE_DIR=${ZEPHYR_HAL_RPI_PICO_MODULE_DIR}
37        -DZEPHYR_BASE=${ZEPHYR_BASE}
38        -DFLASH_TYPE=${flash_type}
39        -DPYTHON_EXECUTABLE=${Python3_EXECUTABLE}
40        -DRP2_BOOTLOADER_BYPRODUCT=${rp2_bootloader_asm}
41      INSTALL_COMMAND "" # No installation needed
42      BUILD_BYPRODUCTS ${rp2_bootloader_asm}
43      BUILD_ALWAYS TRUE
44      )
45
46      zephyr_library_add_dependencies(second_stage_bootloader)
47      zephyr_library_sources(${rp2_bootloader_asm})
48  endif()
49
50  if(CONFIG_SOC_SERIES_RP2040)
51    zephyr_compile_definitions(PICO_RP2040)
52  elseif(CONFIG_SOC_SERIES_RP2350)
53    zephyr_compile_definitions(PICO_RP2350)
54  endif()
55
56  # Pico sources and headers necessary for every build.
57  # These contain definitions and implementation used mostly for
58  # initializing the SoC, and therefore are always required.
59
60  zephyr_library_sources(
61    ${rp2_common_dir}/hardware_clocks/clocks.c
62    ${rp2_common_dir}/hardware_pll/pll.c
63    ${rp2_common_dir}/hardware_xosc/xosc.c
64    ${rp2_common_dir}/hardware_sync_spin_lock/sync_spin_lock.c
65    ${rp2_common_dir}/hardware_ticks/ticks.c
66    ${rp2_common_dir}/pico_bootrom/bootrom.c
67    ${rp2xxx_dir}/pico_platform/platform.c
68  )
69
70  zephyr_include_directories(
71    ${common_dir}/pico_base_headers/include
72    ${rp2_common_dir}/boot_bootrom_headers/include
73    ${rp2_common_dir}/hardware_base/include
74    ${rp2_common_dir}/hardware_clocks/include
75    ${rp2_common_dir}/hardware_watchdog/include
76    ${rp2_common_dir}/hardware_xosc/include
77    ${rp2_common_dir}/hardware_pll/include
78    ${rp2_common_dir}/hardware_irq/include
79    ${rp2_common_dir}/hardware_sync/include
80    ${rp2_common_dir}/hardware_timer/include
81    ${rp2_common_dir}/hardware_resets/include
82    ${rp2_common_dir}/hardware_boot_lock/include
83    ${rp2_common_dir}/hardware_ticks/include
84    ${rp2_common_dir}/hardware_sync_spin_lock/include
85    ${rp2_common_dir}/pico_bootrom/include
86    ${rp2_common_dir}/pico_flash/include
87    ${rp2_common_dir}/pico_platform_compiler/include
88    ${rp2_common_dir}/pico_platform_sections/include
89    ${rp2_common_dir}/pico_platform_panic/include
90    ${common_dir}/boot_picoboot_headers/include
91    ${common_dir}/boot_picobin_headers/include
92    ${rp2xxx_dir}/hardware_regs/include
93    ${rp2xxx_dir}/hardware_structs/include
94    ${rp2xxx_dir}/pico_platform/include
95    ${CMAKE_CURRENT_LIST_DIR}
96  )
97
98  zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_GPIO
99          ${rp2_common_dir}/hardware_gpio/gpio.c)
100  zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_GPIO
101          ${rp2_common_dir}/hardware_gpio/include)
102
103  zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_UART
104          ${rp2_common_dir}/hardware_uart/include)
105
106  zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_FLASH
107          ${rp2_common_dir}/hardware_flash/flash.c
108          ${rp2_common_dir}/hardware_xip_cache/xip_cache.c)
109  zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_FLASH
110          ${rp2_common_dir}/hardware_flash/include
111          ${rp2_common_dir}/hardware_xip_cache/include)
112
113  zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_PWM
114          ${rp2_common_dir}/hardware_pwm/include)
115
116  zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_ADC
117          ${rp2_common_dir}/hardware_adc/adc.c)
118  zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_ADC
119          ${rp2_common_dir}/hardware_adc/include)
120
121  zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_DMA
122          ${rp2_common_dir}/hardware_dma/dma.c)
123  zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_DMA
124          ${rp2_common_dir}/hardware_dma/include)
125
126  zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_TIMER
127          ${rp2_common_dir}/hardware_timer/timer.c)
128  zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_TIMER
129          ${rp2_common_dir}/hardware_timer/include)
130
131  zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_RTC
132          ${rp2_common_dir}/hardware_rtc/rtc.c)
133  zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_RTC
134          ${rp2_common_dir}/hardware_rtc/include)
135
136  zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_PIO
137          ${rp2_common_dir}/hardware_pio/pio.c)
138  zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_PIO
139          ${rp2_common_dir}/hardware_pio/include)
140
141  # Some flash driver functions must be executed from the RAM.
142  # Originally pico-sdk places them in the RW data section, so this
143  # implementation does the same.
144  zephyr_linker_sources_ifdef(CONFIG_PICOSDK_USE_FLASH RWDATA timecritical.ld)
145
146  # A function in flash.c adds 1 to a function pointer, causing a warning
147  set_source_files_properties(
148    ${rp2_common_dir}/hardware_flash/flash.c
149    PROPERTIES
150    COMPILE_FLAGS $<TARGET_PROPERTY:compiler,warning_no_pointer_arithmetic>
151  )
152
153  zephyr_library_sources_ifdef(CONFIG_PICOSDK_USE_CLAIM
154          ${common_dir}/hardware_claim/claim.c)
155  zephyr_include_directories_ifdef(CONFIG_PICOSDK_USE_CLAIM
156          ${common_dir}/hardware_claim/include)
157
158  zephyr_library_sources_ifdef(CONFIG_SOC_SERIES_RP2350
159          ${rp2_common_dir}/pico_runtime_init/runtime_init.c)
160  zephyr_include_directories_ifdef(CONFIG_SOC_SERIES_RP2350
161          ${rp2_common_dir}/pico_runtime/include
162          ${rp2_common_dir}/pico_runtime_init/include)
163
164endif()
165