| # Copyright 2022 The Pigweed Authors |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| # use this file except in compliance with the License. You may obtain a copy of |
| # the License at |
| # |
| # https://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| # License for the specific language governing permissions and limitations under |
| # the License. |
| |
| import("//build_overrides/pi_pico.gni") |
| import("//build_overrides/pigweed.gni") |
| |
| import("$dir_pw_build/exec.gni") |
| import("$dir_pw_build/python_action.gni") |
| import("$dir_pw_build/target_types.gni") |
| |
| # TODO(amontanez): This can go away if the GN build can be upstreamed to the |
| # Pi Pico repo. |
| _CWD = "${PICO_SRC_DIR}/src/rp2_common/boot_stage2" |
| |
| config("public_include_dirs") { |
| include_dirs = [ |
| "${_CWD}/include", |
| "${_CWD}/asminclude", |
| ] |
| } |
| |
| # The upstream boot_stage2.ld doesn't specify the binary entry point or |
| # mark the required sections as KEEP(), so they're optimized out with |
| # Pigweed's aggressive default optimizations. |
| # |
| # Because of Pigweed's pw_build_DEFAULT_CONFIGS behavior, this flag |
| # needs to be a config rather than just an ldflag of boot_stage2_elf to ensure |
| # the flag is ordered properly. |
| config("no_gc_sections") { |
| ldflags = [ "-Wl,--no-gc-sections" ] |
| } |
| |
| pw_executable("boot_stage2_elf") { |
| _linker_script_path = rebase_path("${_CWD}/boot_stage2.ld", root_build_dir) |
| |
| # Compile as position-independent. |
| cflags = [ "-fPIC" ] |
| asmflags = cflags |
| |
| ldflags = cflags |
| ldflags += [ |
| "-T${_linker_script_path}", |
| "-nostartfiles", |
| ] |
| |
| public_configs = [ ":public_include_dirs" ] |
| configs = [ ":no_gc_sections" ] |
| |
| is_boot_stage2 = true |
| |
| public = [ "${_CWD}/include/boot_stage2/config.h" ] |
| |
| deps = [ "${PICO_ROOT}/src/common/pico_base" ] |
| |
| # The correct assembly file is pulled in by compile_time_choice.S. |
| inputs = [ |
| "${_CWD}/boot_stage2.ld", |
| "${_CWD}/boot2_at25sf128a.S", |
| "${_CWD}/boot2_generic_03h.S", |
| "${_CWD}/boot2_is25lp080.S", |
| "${_CWD}/boot2_usb_blinky.S", |
| "${_CWD}/boot2_w25q080.S", |
| "${_CWD}/boot2_w25x10cl.S", |
| ] |
| sources = [ "${_CWD}/compile_time_choice.S" ] |
| } |
| |
| pw_exec("boot_stage2_bin") { |
| _out_bin = "${target_out_dir}/boot_stage2.bin" |
| program = "arm-none-eabi-objcopy" |
| args = [ |
| "-Obinary", |
| "<TARGET_FILE(:boot_stage2_elf)>", |
| rebase_path(_out_bin, root_build_dir), |
| ] |
| outputs = [ _out_bin ] |
| deps = [ ":boot_stage2_elf" ] |
| } |
| |
| pw_python_action("boot_stage2_padded") { |
| _src_bin = get_target_outputs(":boot_stage2_bin") |
| _out_asm = "${target_out_dir}/boot_stage2.S" |
| script = "${_CWD}/pad_checksum" |
| args = [ |
| "-s", |
| "0xffffffff", |
| rebase_path(_src_bin[0], root_build_dir), |
| rebase_path(_out_asm, root_build_dir), |
| ] |
| outputs = [ _out_asm ] |
| deps = [ ":boot_stage2_bin" ] |
| } |
| |
| pw_source_set("boot_stage2_asm") { |
| deps = [ ":boot_stage2_padded" ] |
| sources = get_target_outputs(":boot_stage2_padded") |
| } |
| |
| group("boot_stage2") { |
| public_deps = [ |
| ":boot_stage2_asm", |
| ":boot_stage2_elf", |
| ] |
| } |