targets: Fork the Pigweed arduino target This will allow overriding facade implementations like pw_log_BACKEND. Also set default baudrate to 1,000,000. Change-Id: Ic5e5f317d9e720e52e7d46a1ec7ad9154313f768 Reviewed-on: https://pigweed-review.googlesource.com/c/gonk/+/184830 Reviewed-by: Armando Montanez <amontanez@google.com> Commit-Queue: Anthony DiGirolamo <tonymd@google.com>
diff --git a/BUILD.gn b/BUILD.gn index 2120617..ea9870c 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -35,8 +35,8 @@ "//applications/system_example(//targets/stm32f769i_disc0_stm32cube:stm32f769i_disc0_stm32cube.size_optimized)", # Arduino targets - "//applications/fpga_config($dir_pigweed/targets/arduino:arduino_size_optimized)", - "//applications/spi_flash_test($dir_pigweed/targets/arduino:arduino_size_optimized)", + "//applications/fpga_config(//targets/stm32f730r8tx_arduino:arduino_size_optimized)", + "//applications/spi_flash_test(//targets/stm32f730r8tx_arduino:arduino_size_optimized)", ] }
diff --git a/README.md b/README.md index 508ba95..8bf1a10 100644 --- a/README.md +++ b/README.md
@@ -68,13 +68,13 @@ 1. Connect over serial. ```sh - python -m serial.tools.miniterm --raw /dev/ttyGonk 115200 + python -m serial.tools.miniterm --raw /dev/ttyGonk 1000000 ``` You should see output matching: ``` - --- Miniterm on /dev/ttyGonk 115200,8,N,1 --- + --- Miniterm on /dev/ttyGonk 1000000,8,N,1 --- --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- INF Device id: 1f 84 1 INF Device id: 1f 84 1
diff --git a/targets/stm32f730r8tx_arduino/BUILD.gn b/targets/stm32f730r8tx_arduino/BUILD.gn new file mode 100644 index 0000000..2e33b31 --- /dev/null +++ b/targets/stm32f730r8tx_arduino/BUILD.gn
@@ -0,0 +1,105 @@ +# Copyright 2023 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/pigweed.gni") + +import("$dir_pw_arduino_build/arduino.gni") +import("$dir_pw_build/target_types.gni") +import("$dir_pw_toolchain/generate_toolchain.gni") + +if (pw_arduino_build_CORE_PATH != "") { + import("target_toolchains.gni") + + generate_toolchains("target_toolchains") { + toolchains = pw_target_toolchain_arduino_list + } + + if (current_toolchain == + "//targets/stm32f730r8tx_arduino:arduino_size_optimized") { + config("arduino_build") { + exec_script(arduino_builder_script, + filter_exclude(arduino_run_command_args, + [ "--save-config" ]) + [ "--run-prebuilds" ], + "string") + + _exclude_flags = [ "-std=gnu++14" ] + + _cflags = exec_script(arduino_builder_script, + arduino_show_command_args + [ "--c-flags" ], + "list lines") + cflags = filter_exclude(_cflags, _exclude_flags) + + asmflags = exec_script(arduino_builder_script, + arduino_show_command_args + [ "--s-only-flags" ], + "list lines") + + _cflags_cc = + exec_script(arduino_builder_script, + arduino_show_command_args + [ "--cpp-only-flags" ], + "list lines") + cflags_cc = filter_exclude(_cflags_cc, _exclude_flags) + + _ldflags = exec_script(arduino_builder_script, + arduino_show_command_args + [ "--ld-flags" ], + "list lines") + ldflags = + filter_exclude(_ldflags, + [ + # Remove arguments ending in 'core.a', for example: + # C:/Users/username/pigweed/out/core.a + "*core.a\b", + + # Remove .elf output file, for example: + # -o C:/Users/username/pigweed/out/pigweed.elf + "\b-o\b", + "*.elf\b", + + # Remove the Arduino {object_files} variable + "{object_files}", + ]) + + # Teensy4 core recipe uses: '-larm_cortexM7lfsp_math -lm -lstdc++' + libs = filter_exclude( + exec_script(arduino_builder_script, + arduino_show_command_args + [ "--ld-lib-names" ], + "list lines"), + [ + # Exclude stdc++ and precompiled math libraries which causes + # linking errors for teensy cores. + "\bstdc++\b", + "\barm_cortexM0l_math\b", + "\barm_cortexM4lf_math\b", + "\barm_cortexM4l_math\b", + "\barm_cortexM7lfsp_math\b", + ]) + } + + pw_source_set("pre_init") { + sources = [ "init.cc" ] + public_deps = [ + "$dir_pw_sys_io_arduino", + "$dir_pw_third_party/arduino:arduino_core_sources", + ] + deps = [ + "$dir_pw_arduino_build:arduino_init.facade", + "$dir_pw_preprocessor", + ] + } + } +} else { + config("arduino_build") { + } + group("pre_init") { + } +}
diff --git a/targets/stm32f730r8tx_arduino/arduino_executable.gni b/targets/stm32f730r8tx_arduino/arduino_executable.gni new file mode 100644 index 0000000..2013bf0 --- /dev/null +++ b/targets/stm32f730r8tx_arduino/arduino_executable.gni
@@ -0,0 +1,27 @@ +# Copyright 2023 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/pigweed.gni") +import("$dir_pw_malloc/backend.gni") + +# Executable wrapper that includes some baremetal startup code. +template("arduino_executable") { + target("executable", target_name) { + forward_variables_from(invoker, "*") + if (!defined(deps)) { + deps = [] + } + deps += [ "$dir_pw_arduino_build:arduino_main_wrapper" ] + } +}
diff --git a/targets/stm32f730r8tx_arduino/init.cc b/targets/stm32f730r8tx_arduino/init.cc new file mode 100644 index 0000000..437ee3d --- /dev/null +++ b/targets/stm32f730r8tx_arduino/init.cc
@@ -0,0 +1,21 @@ +// Copyright 2023 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. + +#include <Arduino.h> + +#include "pw_arduino_build/init.h" + +// Arduino target specific init. pw_sys_io_arduino_Init() normally calls +// Serial.begin(115200). Instead, we init serial to a higher baudrate here. +extern "C" void pw_arduino_Init() { Serial.begin(1000000); }
diff --git a/targets/stm32f730r8tx_arduino/target_toolchains.gni b/targets/stm32f730r8tx_arduino/target_toolchains.gni new file mode 100644 index 0000000..57528f2 --- /dev/null +++ b/targets/stm32f730r8tx_arduino/target_toolchains.gni
@@ -0,0 +1,127 @@ +# Copyright 2023 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/pigweed.gni") + +import("$dir_pw_build/defaults.gni") +import("$dir_pw_sys_io/backend.gni") +import("$dir_pw_toolchain/arm_gcc/toolchains.gni") + +declare_args() { + # Enable the pw_target_runner for on-device testing. + pw_arduino_use_test_server = false +} +_target_config = { + # Use the logging main. + pw_unit_test_MAIN = "$dir_pw_unit_test:simple_printing_main" + + # Configuration options for Pigweed executable targets. + pw_build_EXECUTABLE_TARGET_TYPE = "arduino_executable" + + pw_build_EXECUTABLE_TARGET_TYPE_FILE = + get_path_info("arduino_executable.gni", "abspath") + + # Path to the bloaty config file for the output binaries. + pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_cortex_m/bloaty_config.bloaty" + + if (pw_arduino_use_test_server) { + _test_runner_script = + "$dir_pw_arduino_build/py/pw_arduino_build/unit_test_client.py" + pw_unit_test_AUTOMATIC_RUNNER = + get_path_info(_test_runner_script, "abspath") + } + + # Facade backends + pw_assert_BACKEND = dir_pw_assert_basic + pw_log_BACKEND = dir_pw_log_basic + pw_sync_INTERRUPT_SPIN_LOCK_BACKEND = + "$dir_pw_sync_baremetal:interrupt_spin_lock" + pw_sync_MUTEX_BACKEND = "$dir_pw_sync_baremetal:mutex" + pw_rpc_CONFIG = "$dir_pw_rpc:disable_global_mutex" + pw_sys_io_BACKEND = dir_pw_sys_io_arduino + pw_rpc_system_server_BACKEND = "$dir_pw_hdlc:hdlc_sys_io_system_server" + pw_arduino_build_INIT_BACKEND = "//targets/stm32f730r8tx_arduino:pre_init" + + pw_build_LINK_DEPS = [ + "$dir_pw_assert:impl", + "$dir_pw_log:impl", + ] + + current_cpu = "arm" + current_os = "" +} + +_toolchain_properties = { + final_binary_extension = ".elf" +} + +_target_default_configs = pigweed_default_configs + [ + "$dir_pw_toolchain/arm_gcc:enable_float_printf", + "//targets/stm32f730r8tx_arduino:arduino_build", + ] + +pw_target_toolchain_arduino = { + _excluded_members = [ + "defaults", + "name", + ] + + debug = { + name = "arduino_debug" + _toolchain_base = pw_toolchain_arm_gcc.cortex_m4f_debug + forward_variables_from(_toolchain_base, "*", _excluded_members) + forward_variables_from(_toolchain_properties, "*") + defaults = { + forward_variables_from(_toolchain_base.defaults, "*") + forward_variables_from(_target_config, "*") + default_configs = [] + default_configs = _target_default_configs + } + } + + speed_optimized = { + name = "arduino_speed_optimized" + _toolchain_base = pw_toolchain_arm_gcc.cortex_m4f_speed_optimized + forward_variables_from(_toolchain_base, "*", _excluded_members) + forward_variables_from(_toolchain_properties, "*") + defaults = { + forward_variables_from(_toolchain_base.defaults, "*") + forward_variables_from(_target_config, "*") + default_configs = [] + default_configs = _target_default_configs + } + } + + size_optimized = { + name = "arduino_size_optimized" + _toolchain_base = pw_toolchain_arm_gcc.cortex_m4f_size_optimized + forward_variables_from(_toolchain_base, "*", _excluded_members) + forward_variables_from(_toolchain_properties, "*") + defaults = { + forward_variables_from(_toolchain_base.defaults, "*") + forward_variables_from(_target_config, "*") + default_configs = [] + default_configs = _target_default_configs + } + } +} + +# This list just contains the members of the above scope for convenience to make +# it trivial to generate all the toolchains in this file via a +# `generate_toolchains` target. +pw_target_toolchain_arduino_list = [ + pw_target_toolchain_arduino.debug, + pw_target_toolchain_arduino.speed_optimized, + pw_target_toolchain_arduino.size_optimized, +]