xref: /aosp_15_r20/external/pigweed/targets/rp2040/BUILD.bazel (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker# Copyright 2022 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker#
3*61c4878aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker# use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker# the License at
6*61c4878aSAndroid Build Coastguard Worker#
7*61c4878aSAndroid Build Coastguard Worker#     https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker#
9*61c4878aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker# License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker# the License.
14*61c4878aSAndroid Build Coastguard Worker
15*61c4878aSAndroid Build Coastguard Workerload("@rules_python//sphinxdocs:sphinx_docs_library.bzl", "sphinx_docs_library")
16*61c4878aSAndroid Build Coastguard Workerload("//pw_build:compatibility.bzl", "incompatible_with_mcu")
17*61c4878aSAndroid Build Coastguard Workerload("//pw_build:merge_flags.bzl", "flags_from_dict")
18*61c4878aSAndroid Build Coastguard Workerload("//pw_build:pw_cc_binary.bzl", "pw_cc_binary")
19*61c4878aSAndroid Build Coastguard Workerload("//pw_build:pw_copy_and_patch_file.bzl", "pw_copy_and_patch_file")
20*61c4878aSAndroid Build Coastguard Workerload("//pw_toolchain/cc/current_toolchain:conditions.bzl", "if_compiler_is_clang")
21*61c4878aSAndroid Build Coastguard Workerload("//targets/rp2040:flash.bzl", "flash_rp2040", "flash_rp2350")
22*61c4878aSAndroid Build Coastguard Workerload("//targets/rp2040:transition.bzl", "RP2_SYSTEM_FLAGS", "rp2040_binary", "rp2350_binary")
23*61c4878aSAndroid Build Coastguard Worker
24*61c4878aSAndroid Build Coastguard Workerpackage(default_visibility = ["//visibility:public"])
25*61c4878aSAndroid Build Coastguard Worker
26*61c4878aSAndroid Build Coastguard Workerlicenses(["notice"])
27*61c4878aSAndroid Build Coastguard Worker
28*61c4878aSAndroid Build Coastguard Workerconfig_setting(
29*61c4878aSAndroid Build Coastguard Worker    name = "pico_clang_build",
30*61c4878aSAndroid Build Coastguard Worker    constraint_values = [
31*61c4878aSAndroid Build Coastguard Worker        "//pw_build/constraints/chipset:rp2040",
32*61c4878aSAndroid Build Coastguard Worker    ],
33*61c4878aSAndroid Build Coastguard Worker    flag_values = {
34*61c4878aSAndroid Build Coastguard Worker        "@bazel_tools//tools/cpp:compiler": "clang",
35*61c4878aSAndroid Build Coastguard Worker    },
36*61c4878aSAndroid Build Coastguard Worker)
37*61c4878aSAndroid Build Coastguard Worker
38*61c4878aSAndroid Build Coastguard Worker# This is an incomplete platform, do NOT try to pass this
39*61c4878aSAndroid Build Coastguard Worker# as a --platforms flag value. Use :rp2040 or :rp2350.
40*61c4878aSAndroid Build Coastguard Workerplatform(
41*61c4878aSAndroid Build Coastguard Worker    name = "rp2_common",
42*61c4878aSAndroid Build Coastguard Worker    constraint_values = [
43*61c4878aSAndroid Build Coastguard Worker        "@freertos//:disable_task_statics",
44*61c4878aSAndroid Build Coastguard Worker        "freertos_config_cv",
45*61c4878aSAndroid Build Coastguard Worker        "//pw_build/constraints/chipset:rp2040",  # TODO: https://pwbug.dev/343487589 - Use Pico SDK constraints.
46*61c4878aSAndroid Build Coastguard Worker        "//pw_build/constraints/rtos:freertos",
47*61c4878aSAndroid Build Coastguard Worker        "//pw_cpu_exception:enabled",
48*61c4878aSAndroid Build Coastguard Worker        "//pw_interrupt_cortex_m:backend",
49*61c4878aSAndroid Build Coastguard Worker        "@rust_crates//:no_std",
50*61c4878aSAndroid Build Coastguard Worker        "@platforms//os:none",
51*61c4878aSAndroid Build Coastguard Worker    ],
52*61c4878aSAndroid Build Coastguard Worker    flags = flags_from_dict(RP2_SYSTEM_FLAGS),
53*61c4878aSAndroid Build Coastguard Worker    visibility = ["//visibility:private"],
54*61c4878aSAndroid Build Coastguard Worker)
55*61c4878aSAndroid Build Coastguard Worker
56*61c4878aSAndroid Build Coastguard Workerplatform(
57*61c4878aSAndroid Build Coastguard Worker    name = "rp2040",
58*61c4878aSAndroid Build Coastguard Worker    constraint_values = [
59*61c4878aSAndroid Build Coastguard Worker        "@freertos//:port_ARM_CM0",
60*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//bazel/constraint:rp2040",
61*61c4878aSAndroid Build Coastguard Worker        # For toolchain selection.
62*61c4878aSAndroid Build Coastguard Worker        "@platforms//cpu:armv6-m",
63*61c4878aSAndroid Build Coastguard Worker        "@pw_toolchain//constraints/arm_mcpu:cortex-m0plus",
64*61c4878aSAndroid Build Coastguard Worker    ],
65*61c4878aSAndroid Build Coastguard Worker    flags = flags_from_dict({
66*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//bazel/config:PICO_DEFAULT_LINKER_SCRIPT": ":rp2040_linker_script",
67*61c4878aSAndroid Build Coastguard Worker    }),
68*61c4878aSAndroid Build Coastguard Worker    parents = [":rp2_common"],
69*61c4878aSAndroid Build Coastguard Worker)
70*61c4878aSAndroid Build Coastguard Worker
71*61c4878aSAndroid Build Coastguard Workerplatform(
72*61c4878aSAndroid Build Coastguard Worker    name = "rp2350",
73*61c4878aSAndroid Build Coastguard Worker    constraint_values = [
74*61c4878aSAndroid Build Coastguard Worker        "@freertos//:port_ARM_CM33_NTZ",
75*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//bazel/constraint:rp2350",
76*61c4878aSAndroid Build Coastguard Worker        # For toolchain selection.
77*61c4878aSAndroid Build Coastguard Worker        "@platforms//cpu:armv8-m",
78*61c4878aSAndroid Build Coastguard Worker        "@pw_toolchain//constraints/arm_mcpu:cortex-m33",
79*61c4878aSAndroid Build Coastguard Worker    ],
80*61c4878aSAndroid Build Coastguard Worker    flags = flags_from_dict({
81*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//bazel/config:PICO_DEFAULT_LINKER_SCRIPT": ":rp2350_linker_script",
82*61c4878aSAndroid Build Coastguard Worker    }),
83*61c4878aSAndroid Build Coastguard Worker    parents = [":rp2_common"],
84*61c4878aSAndroid Build Coastguard Worker)
85*61c4878aSAndroid Build Coastguard Worker
86*61c4878aSAndroid Build Coastguard Workercc_library(
87*61c4878aSAndroid Build Coastguard Worker    name = "extra_platform_libs",
88*61c4878aSAndroid Build Coastguard Worker    deps = [
89*61c4878aSAndroid Build Coastguard Worker        ":pre_init",
90*61c4878aSAndroid Build Coastguard Worker        "//pw_tokenizer:linker_script",
91*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//src/rp2_common/pico_stdlib",
92*61c4878aSAndroid Build Coastguard Worker    ] + if_compiler_is_clang(
93*61c4878aSAndroid Build Coastguard Worker        [
94*61c4878aSAndroid Build Coastguard Worker            "//pw_libcxx",
95*61c4878aSAndroid Build Coastguard Worker            "@pico-sdk//src/rp2_common/pico_clib_interface:llvm_libc_interface",
96*61c4878aSAndroid Build Coastguard Worker        ],
97*61c4878aSAndroid Build Coastguard Worker        otherwise = [],
98*61c4878aSAndroid Build Coastguard Worker    ),
99*61c4878aSAndroid Build Coastguard Worker)
100*61c4878aSAndroid Build Coastguard Worker
101*61c4878aSAndroid Build Coastguard Workeralias(
102*61c4878aSAndroid Build Coastguard Worker    name = "pico_sdk_clib_select",
103*61c4878aSAndroid Build Coastguard Worker    actual = if_compiler_is_clang(
104*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//src/rp2_common/pico_clib_interface:llvm_libc_interface",
105*61c4878aSAndroid Build Coastguard Worker        otherwise = "@pico-sdk//src/rp2_common/pico_clib_interface:newlib_interface",
106*61c4878aSAndroid Build Coastguard Worker    ),
107*61c4878aSAndroid Build Coastguard Worker)
108*61c4878aSAndroid Build Coastguard Worker
109*61c4878aSAndroid Build Coastguard Workercc_library(
110*61c4878aSAndroid Build Coastguard Worker    name = "freertos_config",
111*61c4878aSAndroid Build Coastguard Worker    hdrs = [
112*61c4878aSAndroid Build Coastguard Worker        "config/FreeRTOSConfig.h",
113*61c4878aSAndroid Build Coastguard Worker    ],
114*61c4878aSAndroid Build Coastguard Worker    includes = ["config/"],
115*61c4878aSAndroid Build Coastguard Worker    target_compatible_with = [":freertos_config_cv"],
116*61c4878aSAndroid Build Coastguard Worker    deps = [
117*61c4878aSAndroid Build Coastguard Worker        "//third_party/freertos:config_assert",
118*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//src/rp2_common/cmsis:cmsis_core",
119*61c4878aSAndroid Build Coastguard Worker    ],
120*61c4878aSAndroid Build Coastguard Worker)
121*61c4878aSAndroid Build Coastguard Worker
122*61c4878aSAndroid Build Coastguard Workerconstraint_value(
123*61c4878aSAndroid Build Coastguard Worker    name = "freertos_config_cv",
124*61c4878aSAndroid Build Coastguard Worker    constraint_setting = "@freertos//:freertos_config_setting",
125*61c4878aSAndroid Build Coastguard Worker)
126*61c4878aSAndroid Build Coastguard Worker
127*61c4878aSAndroid Build Coastguard Workercc_library(
128*61c4878aSAndroid Build Coastguard Worker    name = "unit_test_app",
129*61c4878aSAndroid Build Coastguard Worker    testonly = True,
130*61c4878aSAndroid Build Coastguard Worker    srcs = [
131*61c4878aSAndroid Build Coastguard Worker        "unit_test_app.cc",
132*61c4878aSAndroid Build Coastguard Worker    ],
133*61c4878aSAndroid Build Coastguard Worker    deps = [
134*61c4878aSAndroid Build Coastguard Worker        "//pw_status",
135*61c4878aSAndroid Build Coastguard Worker        "//pw_system",
136*61c4878aSAndroid Build Coastguard Worker        "//pw_unit_test:rpc_service",
137*61c4878aSAndroid Build Coastguard Worker    ],
138*61c4878aSAndroid Build Coastguard Worker    alwayslink = True,
139*61c4878aSAndroid Build Coastguard Worker)
140*61c4878aSAndroid Build Coastguard Worker
141*61c4878aSAndroid Build Coastguard Worker# This is just a stub to silence warnings saying that boot.cc and *.h files are
142*61c4878aSAndroid Build Coastguard Worker# missing from the bazel build. There's no plans yet to do a Bazel build for
143*61c4878aSAndroid Build Coastguard Worker# the Pi Pico.
144*61c4878aSAndroid Build Coastguard Workerfilegroup(
145*61c4878aSAndroid Build Coastguard Worker    name = "rp2040_files",
146*61c4878aSAndroid Build Coastguard Worker    srcs = [
147*61c4878aSAndroid Build Coastguard Worker        "config/rp2040_hal_config.h",
148*61c4878aSAndroid Build Coastguard Worker    ],
149*61c4878aSAndroid Build Coastguard Worker)
150*61c4878aSAndroid Build Coastguard Worker
151*61c4878aSAndroid Build Coastguard Worker# This is a duplication of the contents of pigweed_module_config.h since we
152*61c4878aSAndroid Build Coastguard Worker# can't do a -include because copts do not propagate to dependencies.
153*61c4878aSAndroid Build Coastguard Workercc_library(
154*61c4878aSAndroid Build Coastguard Worker    name = "pigweed_module_config",
155*61c4878aSAndroid Build Coastguard Worker    hdrs = ["config/pigweed_module_config.h"],
156*61c4878aSAndroid Build Coastguard Worker    defines = [
157*61c4878aSAndroid Build Coastguard Worker        # LINT.IfChange
158*61c4878aSAndroid Build Coastguard Worker        "PW_THREAD_FREERTOS_CONFIG_JOINING_ENABLED=1",
159*61c4878aSAndroid Build Coastguard Worker        "PW_ASSERT_BASIC_ACTION=PW_ASSERT_BASIC_ACTION_EXIT",
160*61c4878aSAndroid Build Coastguard Worker        # LINT.ThenChange(//targets/rp2040/config/pigweed_module_config.h)
161*61c4878aSAndroid Build Coastguard Worker    ],
162*61c4878aSAndroid Build Coastguard Worker)
163*61c4878aSAndroid Build Coastguard Worker
164*61c4878aSAndroid Build Coastguard Workercc_library(
165*61c4878aSAndroid Build Coastguard Worker    name = "pre_init",
166*61c4878aSAndroid Build Coastguard Worker    srcs = [
167*61c4878aSAndroid Build Coastguard Worker        "boot.cc",
168*61c4878aSAndroid Build Coastguard Worker    ],
169*61c4878aSAndroid Build Coastguard Worker    target_compatible_with = [":freertos_config_cv"],
170*61c4878aSAndroid Build Coastguard Worker    deps = [
171*61c4878aSAndroid Build Coastguard Worker        ":freertos_config",
172*61c4878aSAndroid Build Coastguard Worker        "//pw_assert",
173*61c4878aSAndroid Build Coastguard Worker        "//pw_assert:backend_impl",
174*61c4878aSAndroid Build Coastguard Worker        "//pw_cpu_exception:entry_backend_impl",
175*61c4878aSAndroid Build Coastguard Worker        "//pw_string",
176*61c4878aSAndroid Build Coastguard Worker        "//pw_system:init",
177*61c4878aSAndroid Build Coastguard Worker        "//third_party/freertos:support",
178*61c4878aSAndroid Build Coastguard Worker        "@freertos",
179*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//src/rp2_common/hardware_exception:hardware_exception",
180*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//src/rp2_common/pico_stdlib",
181*61c4878aSAndroid Build Coastguard Worker    ],
182*61c4878aSAndroid Build Coastguard Worker    alwayslink = 1,
183*61c4878aSAndroid Build Coastguard Worker)
184*61c4878aSAndroid Build Coastguard Worker
185*61c4878aSAndroid Build Coastguard Workercc_library(
186*61c4878aSAndroid Build Coastguard Worker    name = "device_handler",
187*61c4878aSAndroid Build Coastguard Worker    srcs = [
188*61c4878aSAndroid Build Coastguard Worker        "device_handler.cc",
189*61c4878aSAndroid Build Coastguard Worker    ],
190*61c4878aSAndroid Build Coastguard Worker    strip_include_prefix = "public",
191*61c4878aSAndroid Build Coastguard Worker    deps = [
192*61c4878aSAndroid Build Coastguard Worker        "//pw_cpu_exception_cortex_m:snapshot",
193*61c4878aSAndroid Build Coastguard Worker        "//pw_system:device_handler.facade",
194*61c4878aSAndroid Build Coastguard Worker        "//pw_thread_freertos:snapshot",
195*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//src/rp2_common/hardware_watchdog:hardware_watchdog",
196*61c4878aSAndroid Build Coastguard Worker    ],
197*61c4878aSAndroid Build Coastguard Worker)
198*61c4878aSAndroid Build Coastguard Worker
199*61c4878aSAndroid Build Coastguard Workerpw_cc_binary(
200*61c4878aSAndroid Build Coastguard Worker    name = "system_async_example",
201*61c4878aSAndroid Build Coastguard Worker    testonly = True,
202*61c4878aSAndroid Build Coastguard Worker    srcs = ["system_async_example.cc"],
203*61c4878aSAndroid Build Coastguard Worker    # TODO(b/365184562): This target does not build with asan and fuzztest.
204*61c4878aSAndroid Build Coastguard Worker    target_compatible_with = select({
205*61c4878aSAndroid Build Coastguard Worker        "//pw_fuzzer:use_fuzztest": ["@platforms//:incompatible"],
206*61c4878aSAndroid Build Coastguard Worker        "//conditions:default": [],
207*61c4878aSAndroid Build Coastguard Worker    }),
208*61c4878aSAndroid Build Coastguard Worker    deps = [
209*61c4878aSAndroid Build Coastguard Worker        "//pw_channel:rp2_stdio_channel",
210*61c4878aSAndroid Build Coastguard Worker        "//pw_libcxx",
211*61c4878aSAndroid Build Coastguard Worker        "//pw_multibuf:testing",
212*61c4878aSAndroid Build Coastguard Worker        "//pw_system:async",
213*61c4878aSAndroid Build Coastguard Worker        "//third_party/freertos:support",
214*61c4878aSAndroid Build Coastguard Worker        "@freertos",
215*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//src/rp2_common/pico_stdlib",
216*61c4878aSAndroid Build Coastguard Worker    ],
217*61c4878aSAndroid Build Coastguard Worker)
218*61c4878aSAndroid Build Coastguard Worker
219*61c4878aSAndroid Build Coastguard Workerrp2040_binary(
220*61c4878aSAndroid Build Coastguard Worker    name = "rp2040_system_async_example",
221*61c4878aSAndroid Build Coastguard Worker    testonly = True,
222*61c4878aSAndroid Build Coastguard Worker    binary = ":system_async_example",
223*61c4878aSAndroid Build Coastguard Worker)
224*61c4878aSAndroid Build Coastguard Worker
225*61c4878aSAndroid Build Coastguard Workerflash_rp2040(
226*61c4878aSAndroid Build Coastguard Worker    name = "flash_rp2040_system_async_example",
227*61c4878aSAndroid Build Coastguard Worker    testonly = True,
228*61c4878aSAndroid Build Coastguard Worker    rp2040_binary = ":rp2040_system_async_example",
229*61c4878aSAndroid Build Coastguard Worker)
230*61c4878aSAndroid Build Coastguard Worker
231*61c4878aSAndroid Build Coastguard Workerpw_copy_and_patch_file(
232*61c4878aSAndroid Build Coastguard Worker    name = "rp2040_memmap_default",
233*61c4878aSAndroid Build Coastguard Worker    src = "@pico-sdk//src/rp2_common/pico_crt0/rp2040:memmap_default.ld",
234*61c4878aSAndroid Build Coastguard Worker    out = "patched_rp2040_memmap_default.ld",
235*61c4878aSAndroid Build Coastguard Worker    patch_file = "patches/rp2040_memmap_default.ld.patch",
236*61c4878aSAndroid Build Coastguard Worker)
237*61c4878aSAndroid Build Coastguard Worker
238*61c4878aSAndroid Build Coastguard Workercc_library(
239*61c4878aSAndroid Build Coastguard Worker    name = "rp2040_linker_script",
240*61c4878aSAndroid Build Coastguard Worker    additional_linker_inputs = [":rp2040_memmap_default"],
241*61c4878aSAndroid Build Coastguard Worker    linkopts = ["-T$(execpath :rp2040_memmap_default)"],
242*61c4878aSAndroid Build Coastguard Worker    deps = [
243*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//src/rp2_common/pico_standard_link:default_flash_region",
244*61c4878aSAndroid Build Coastguard Worker    ],
245*61c4878aSAndroid Build Coastguard Worker)
246*61c4878aSAndroid Build Coastguard Worker
247*61c4878aSAndroid Build Coastguard Workerrp2350_binary(
248*61c4878aSAndroid Build Coastguard Worker    name = "rp2350_system_async_example",
249*61c4878aSAndroid Build Coastguard Worker    testonly = True,
250*61c4878aSAndroid Build Coastguard Worker    binary = ":system_async_example",
251*61c4878aSAndroid Build Coastguard Worker)
252*61c4878aSAndroid Build Coastguard Worker
253*61c4878aSAndroid Build Coastguard Workerflash_rp2350(
254*61c4878aSAndroid Build Coastguard Worker    name = "flash_rp2350_system_async_example",
255*61c4878aSAndroid Build Coastguard Worker    testonly = True,
256*61c4878aSAndroid Build Coastguard Worker    rp2350_binary = ":rp2350_system_async_example",
257*61c4878aSAndroid Build Coastguard Worker)
258*61c4878aSAndroid Build Coastguard Worker
259*61c4878aSAndroid Build Coastguard Workerpw_copy_and_patch_file(
260*61c4878aSAndroid Build Coastguard Worker    name = "rp2350_memmap_default",
261*61c4878aSAndroid Build Coastguard Worker    src = "@pico-sdk//src/rp2_common/pico_crt0/rp2350:memmap_default.ld",
262*61c4878aSAndroid Build Coastguard Worker    out = "patched_rp2350_memmap_default.ld",
263*61c4878aSAndroid Build Coastguard Worker    patch_file = "patches/rp2350_memmap_default.ld.patch",
264*61c4878aSAndroid Build Coastguard Worker)
265*61c4878aSAndroid Build Coastguard Worker
266*61c4878aSAndroid Build Coastguard Workercc_library(
267*61c4878aSAndroid Build Coastguard Worker    name = "rp2350_linker_script",
268*61c4878aSAndroid Build Coastguard Worker    additional_linker_inputs = [":rp2350_memmap_default"],
269*61c4878aSAndroid Build Coastguard Worker    linkopts = ["-T$(execpath :rp2350_memmap_default)"],
270*61c4878aSAndroid Build Coastguard Worker    deps = [
271*61c4878aSAndroid Build Coastguard Worker        "@pico-sdk//src/rp2_common/pico_standard_link:default_flash_region",
272*61c4878aSAndroid Build Coastguard Worker    ],
273*61c4878aSAndroid Build Coastguard Worker)
274*61c4878aSAndroid Build Coastguard Worker
275*61c4878aSAndroid Build Coastguard Workersphinx_docs_library(
276*61c4878aSAndroid Build Coastguard Worker    name = "docs",
277*61c4878aSAndroid Build Coastguard Worker    srcs = [
278*61c4878aSAndroid Build Coastguard Worker        "target_docs.rst",
279*61c4878aSAndroid Build Coastguard Worker        "upstream.rst",
280*61c4878aSAndroid Build Coastguard Worker    ],
281*61c4878aSAndroid Build Coastguard Worker    target_compatible_with = incompatible_with_mcu(),
282*61c4878aSAndroid Build Coastguard Worker)
283