Example Pico builds working pw_sys_io_pico

- Added pico_core_sources and pico_executable
- pico_base toolchain for building bs2_default.elf
- pw_sys_io_pico hooked up but not working in blinky yet
  Still need to call pw_pico_Init() on start
- pw_sys_io_pico over usb serial works
  But blinky/main.cc needs to manually call pw_sys_io_pico_Init();

Change-Id: I5b2c2e5a2528a0b36c7572b5921d781b6eb811ff
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9bdb44e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,50 @@
+# Build
+out/
+outcmake/
+.presubmit/
+compile_commands.json
+
+# Environment
+.environment/
+
+# Editors
+.idea/
+.project
+.cproject
+.vscode
+.clangd/
+*.swp
+*.swo
+.#*
+
+# Python
+python*-env/
+.python*-env/
+venv/
+*.pyc
+*.egg/
+*.eggs/
+*.egg-info/
+.cache/
+.mypy_cache/
+__pycache__/
+
+# Mac
+.DS_Store
+
+# GDB
+.gdb_history
+
+# Git
+*.orig
+*.BACKUP.*
+*.BASE.*
+*.LOCAL.*
+*.REMOTE.*
+*_BACKUP_*.txt
+*_BASE_*.txt
+*_LOCAL_*.txt
+*_REMOTE_*.txt
+
+# Other
+logfile.txt
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..4219bc8
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,9 @@
+[submodule "third_party/pico-extras"]
+	path = third_party/pico-extras
+	url = https://github.com/raspberrypi/pico-extras.git
+[submodule "third_party/pico-sdk"]
+	path = third_party/pico-sdk
+	url = https://github.com/raspberrypi/pico-sdk.git
+[submodule "third_party/pigweed"]
+	path = third_party/pigweed
+	url = https://pigweed.googlesource.com/pigweed/pigweed
diff --git a/.gn b/.gn
new file mode 100644
index 0000000..4a6a9cc
--- /dev/null
+++ b/.gn
@@ -0,0 +1,18 @@
+# Copyright 2021 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.
+
+buildconfig = "//BUILDCONFIG.gn"
+
+default_args = {
+}
diff --git a/BUILD.gn b/BUILD.gn
new file mode 100644
index 0000000..8d57764
--- /dev/null
+++ b/BUILD.gn
@@ -0,0 +1,65 @@
+# Copyright 2021 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/python.gni")
+import("$dir_pw_tokenizer/database.gni")
+import("$dir_pw_unit_test/test.gni")
+
+# Lists all the targets build by default with e.g. `ninja -C out`.
+group("default") {
+  deps = [
+    ":host",
+    ":pico",
+    ":python",
+
+    # ":python.lint",
+    # ":python.tests",
+  ]
+}
+
+# Group all targets that run on host only, e.g. tests, utils.
+group("host") {
+  deps = [
+    # No host tests yet
+    # ":host_tests(//targets/host:host_debug_tests)"
+    # "//applications/blinky:blinky(//targets/host:host_debug)",
+
+    # elf2uf2 Host tool
+    "//third_party/elf2uf2:elf2uf2(//targets/host:host_debug)",
+  ]
+}
+
+group("pico") {
+  deps = [
+    # Typical pico executables use the pico_debug toolchain.
+    "//applications/blinky:blinky(//targets/pico:pico_debug)",
+    "//pico_build(//targets/pico:pico_debug)",
+
+    # bs2_default uses the pico_base_debug toolchain.
+    "//pico_build/bs2_default(//targets/pico_base:pico_base_debug)",
+  ]
+}
+
+# Python packages are built using the host toolchain.
+pw_python_group("python") {
+  # This depends on the 'tools' target in //tools/BUILD.gn
+  python_deps = [
+    "tools",
+    "//pico_build/py:py",
+    "//third_party/pigweed/pw_env_setup:python",
+    "//third_party/pigweed/pw_env_setup:target_support_packages",
+  ]
+}
diff --git a/BUILDCONFIG.gn b/BUILDCONFIG.gn
new file mode 100644
index 0000000..d798e4a
--- /dev/null
+++ b/BUILDCONFIG.gn
@@ -0,0 +1,28 @@
+# Copyright 2021 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.
+
+# This is imported into a scope so as not to pollute the global variable space.
+_pigweed_directory = {
+  import("//build_overrides/pigweed.gni")
+}
+
+declare_args() {
+  dir_third_party_pico_sdk = "//third_party/pico-sdk"
+  dir_third_party_pico_extras = "//third_party/pico-extras"
+}
+
+# The default toolchain is not used in Pigweed builds, so it is set to an empty
+# toolchain. The top-level BUILD.gn should stamp a group with all of the build
+# targets and their toolchains.
+set_default_toolchain("${_pigweed_directory.dir_pw_toolchain}/default")
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..dcd2316
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,44 @@
+cmake_minimum_required(VERSION 3.13)
+
+include(pico_sdk_import.cmake)
+
+project(picohellousbserial C CXX ASM)
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+
+if (PICO_SDK_VERSION_STRING VERSION_LESS "1.3.0")
+    message(FATAL_ERROR "Raspberry Pi Pico SDK version 1.3.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}")
+endif()
+
+# initialize the Raspberry Pi Pico SDK
+pico_sdk_init()
+
+add_compile_options(-Wall
+  -Wno-format          # int != int32_t as far as the compiler is concerned because gcc has int32_t as long int
+  -Wno-unused-function # we have some for the docs that aren't called
+  -Wno-maybe-uninitialized
+  )
+
+
+if (TARGET tinyusb_device)
+    add_executable(hello_usb
+            hello_usb.c
+            )
+
+    # pull in common dependencies
+    target_link_libraries(hello_usb pico_stdlib)
+
+    # enable usb output, disable uart output
+    pico_enable_stdio_usb(hello_usb 1)
+    pico_enable_stdio_uart(hello_usb 0)
+
+    # create map/bin/hex/uf2 file etc.
+    pico_add_extra_outputs(hello_usb)
+
+    # add url via pico_set_program_url
+    # example_auto_set_url(hello_usb)
+
+elseif(PICO_ON_DEVICE)
+    message(WARNING "not building hello_usb because TinyUSB submodule is not initialized in the SDK")
+endif()
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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
+
+       http://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.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b21708b
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# picohellousb
\ No newline at end of file
diff --git a/activate.bat b/activate.bat
new file mode 100644
index 0000000..303ce4f
--- /dev/null
+++ b/activate.bat
@@ -0,0 +1,31 @@
+:<<"::WINDOWS_ONLY"
+@echo off
+:: Copyright 2021 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.
+::WINDOWS_ONLY
+:; echo "ERROR: Attempting to run Windows .bat from a Unix/POSIX shell!"
+:; echo "Instead, run the following command."
+:; echo ""
+:; echo "    source ./activate.sh"
+:; echo ""
+:<<"::WINDOWS_ONLY"
+
+:: First, activate the development environment.
+set PW_SKIP_BOOTSTRAP=1
+call "%~dp0\bootstrap.bat"
+set PW_SKIP_BOOTSTRAP=
+
+:: Add user-defined environment configuration here.
+
+::WINDOWS_ONLY
diff --git a/activate.sh b/activate.sh
new file mode 120000
index 0000000..eba5389
--- /dev/null
+++ b/activate.sh
@@ -0,0 +1 @@
+bootstrap.sh
\ No newline at end of file
diff --git a/applications/blinky/BUILD.gn b/applications/blinky/BUILD.gn
new file mode 100644
index 0000000..757068b
--- /dev/null
+++ b/applications/blinky/BUILD.gn
@@ -0,0 +1,30 @@
+# Copyright 2021 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/target_types.gni")
+
+pw_executable("blinky") {
+  sources = [ "main.cc" ]
+  deps = [
+    "$dir_pw_log",
+
+    # The assert backend is defined in the toolchain with `pw_assert_BACKEND`.
+    "$dir_pw_assert",
+    "$dir_pw_board_led",
+    "$dir_pw_spin_delay",
+    "$dir_pw_sys_io_pico",
+  ]
+}
diff --git a/applications/blinky/main.cc b/applications/blinky/main.cc
new file mode 100644
index 0000000..bc31973
--- /dev/null
+++ b/applications/blinky/main.cc
@@ -0,0 +1,37 @@
+// Copyright 2021 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 "pw_board_led/led.h"
+#include "pw_log/log.h"
+#include "pw_spin_delay/delay.h"
+#include "pw_sys_io_pico/init.h"
+
+int main() {
+  pw_sys_io_pico_Init();
+
+  pw::board_led::Init();
+  int i = 0;
+
+  while (true) {
+    PW_LOG_INFO("Blink %d", i++);
+
+    pw::board_led::TurnOn();
+    pw::spin_delay::WaitMillis(1000);
+
+    pw::board_led::TurnOff();
+    pw::spin_delay::WaitMillis(1000);
+  }
+
+  return 0;
+}
diff --git a/banner.txt b/banner.txt
new file mode 100644
index 0000000..7a6b653
--- /dev/null
+++ b/banner.txt
@@ -0,0 +1,2 @@
+   ╱╱╱  █▀█ █░█░█   █▀▀ ▀▄▀ █▀█ █▀▀ █▀█ █ █▀▄▀█ █▀▀ █▄░█ ▀█▀ ▄▀█ █░░
+  ╱╱╱   █▀▀ ▀▄▀▄▀   ██▄ █░█ █▀▀ ██▄ █▀▄ █ █░▀░█ ██▄ █░▀█ ░█░ █▀█ █▄▄
diff --git a/bootstrap.bat b/bootstrap.bat
new file mode 100644
index 0000000..3ded860
--- /dev/null
+++ b/bootstrap.bat
@@ -0,0 +1,50 @@
+:<<"::WINDOWS_ONLY"

+@echo off

+:: Copyright 2021 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.

+::WINDOWS_ONLY

+:; echo "ERROR: Attempting to run Windows .bat from a Unix/POSIX shell!"

+:; echo "Instead, run the following command."

+:; echo ""

+:; echo "    source ./activate.sh"

+:; echo ""

+:<<"::WINDOWS_ONLY"

+

+:: The bootstrap.bat must be run initially to install all required programs.

+:: After that, use activate.bat to enter the environment in a shell.

+

+:: First, activate the Pigweed development environment.

+set "_pw_bootstrap_script=%~dp0.\third_party\pigweed\bootstrap.bat"

+set "PW_PROJECT_ROOT=%~dp0."

+set "PIGWEED_EXPERIMENTAL_ROOT=%PW_PROJECT_ROOT%"

+

+:: Set your project's banner and color.

+set "PW_BRANDING_BANNER=%PW_PROJECT_ROOT%\banner.txt"

+set "PW_BRANDING_BANNER_COLOR=cyan"

+

+if not exist "%_pw_bootstrap_script%" (

+  echo Error: "%_pw_bootstrap_script%" not found.

+  echo Did you forget to initialize the git submodules?

+  echo To setup the git submodules run:

+  echo   git submodule init

+  echo   git submodule update

+  goto finish

+)

+

+call "%_pw_bootstrap_script%"

+

+:: Add user-defined initial setup here.

+

+:finish

+::WINDOWS_ONLY

diff --git a/bootstrap.sh b/bootstrap.sh
new file mode 100755
index 0000000..fce93af
--- /dev/null
+++ b/bootstrap.sh
@@ -0,0 +1,134 @@
+# Copyright 2021 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.
+
+# This script must be sourced, not executed.
+#
+# Create a new environment:
+#
+#   source bootstrap.sh
+#
+# Activate an existing environment:
+#
+#   source activate.sh
+
+_bootstrap_abspath () {
+  $(command -v python3 || command -v python2 || command -v python) -c "import os.path; print(os.path.abspath('$@'))"
+}
+
+# Shell: bash.
+if test -n "$BASH"; then
+  _BOOTSTRAP_PATH="$(_bootstrap_abspath "$BASH_SOURCE")"
+# Shell: zsh.
+elif test -n "$ZSH_NAME"; then
+  _BOOTSTRAP_PATH="$(_bootstrap_abspath "${(%):-%N}")"
+# Shell: dash.
+elif test ${0##*/} = dash; then
+  _BOOTSTRAP_PATH="$(_bootstrap_abspath \
+    "$(lsof -p $$ -Fn0 | tail -1 | sed 's#^[^/]*##;')")"
+# If everything else fails, try $0. It could work.
+else
+  _BOOTSTRAP_PATH="$(_bootstrap_abspath "$0")"
+fi
+
+# Check if this file is being executed or sourced.
+_pw_sourced=0
+if [ -n "$SWARMING_BOT_ID" ]; then
+  # If set we're running on swarming and don't need this check.
+  _pw_sourced=1
+elif [ -n "$ZSH_EVAL_CONTEXT" ]; then
+  case $ZSH_EVAL_CONTEXT in *:file) _pw_sourced=1;; esac
+elif [ -n "$KSH_VERSION" ]; then
+  [ "$(cd $(dirname -- $0) && pwd -P)/$(basename -- $0)" != \
+    "$(cd $(dirname -- ${.sh.file}) && pwd -P)/$(basename -- ${.sh.file})" ] \
+    && _pw_sourced=1
+elif [ -n "$BASH_VERSION" ]; then
+  (return 0 2>/dev/null) && _pw_sourced=1
+else  # All other shells: examine $0 for known shell binary filenames
+  # Detects `sh` and `dash`; add additional shell filenames as needed.
+  case ${0##*/} in sh|dash) _pw_sourced=1;; esac
+fi
+
+# Downstream projects need to set something other than PW_ROOT here, like
+# YOUR_PROJECT_ROOT. Please also set PW_PROJECT_ROOT and PW_ROOT before
+# invoking pw_bootstrap or pw_activate.
+######### BEGIN PROJECT-SPECIFIC CODE #########
+PIGWEED_EXPERIMENTAL_ROOT="$(_bootstrap_abspath "$(dirname "$_BOOTSTRAP_PATH")")"
+export PIGWEED_EXPERIMENTAL_ROOT
+PW_PROJECT_ROOT="$PIGWEED_EXPERIMENTAL_ROOT"
+PW_ROOT="$PIGWEED_EXPERIMENTAL_ROOT/third_party/pigweed"
+
+# Set your project's banner and color.
+export PW_BRANDING_BANNER="$PIGWEED_EXPERIMENTAL_ROOT/banner.txt"
+export PW_BRANDING_BANNER_COLOR=magenta
+
+PIGWEED_EXPERIMENTAL_banner() {
+  cat "$PW_BRANDING_BANNER"
+  echo
+}
+
+PW_BANNER_FUNC="PIGWEED_EXPERIMENTAL_banner"
+########## END PROJECT-SPECIFIC CODE ##########
+export PW_BANNER_FUNC
+export PW_PROJECT_ROOT
+export PW_ROOT
+
+_util_sh="$PW_ROOT/pw_env_setup/util.sh"
+
+# Double-check that the Pigweed submodule has been checked out.
+if [ ! -e "$_util_sh" ]; then
+  echo "Error: $_util_sh not found."
+  echo "Did you forget to initialize the git submodules?"
+  echo "To setup the git submodules run:"
+  echo "  git submodule update --init"
+  return
+fi
+
+. "$_util_sh"
+
+pw_deactivate
+pw_eval_sourced "$_pw_sourced"
+pw_check_root "$PW_ROOT"
+_PW_ACTUAL_ENVIRONMENT_ROOT="$(pw_get_env_root)"
+export _PW_ACTUAL_ENVIRONMENT_ROOT
+SETUP_SH="$_PW_ACTUAL_ENVIRONMENT_ROOT/activate.sh"
+
+export PICO_SDK_PATH=$PIGWEED_EXPERIMENTAL_ROOT/third_party/pico-sdk
+export PICO_EXTRAS_PATH=$PIGWEED_EXPERIMENTAL_ROOT/third_party/pico-extras
+
+# Run full bootstrap when invoked as bootstrap, or env file is missing/empty.
+if [ "$(basename "$_BOOTSTRAP_PATH")" = "bootstrap.sh" ] || \
+  [ ! -f "$SETUP_SH" ] || \
+  [ ! -s "$SETUP_SH" ]; then
+# This is where pw_bootstrap is called. Most small projects will include
+# --use-pigweed-defaults.
+######### BEGIN PROJECT-SPECIFIC CODE #########
+  pw_bootstrap --shell-file "$SETUP_SH" --install-dir "$_PW_ACTUAL_ENVIRONMENT_ROOT" --config-file "$PW_PROJECT_ROOT/env_setup.json"
+########## END PROJECT-SPECIFIC CODE ##########
+  pw_finalize bootstrap "$SETUP_SH"
+else
+  pw_activate
+  pw_finalize activate "$SETUP_SH"
+fi
+
+# This is where any additional checks about the environment should go.
+######### BEGIN PROJECT-SPECIFIC CODE #########
+########## END PROJECT-SPECIFIC CODE ##########
+
+unset _pw_sourced
+unset _BOOTSTRAP_PATH
+unset SETUP_SH
+unset _bootstrap_abspath
+unset _util_sh
+
+pw_cleanup
diff --git a/build_overrides/pigweed.gni b/build_overrides/pigweed.gni
new file mode 100644
index 0000000..dffa7a5
--- /dev/null
+++ b/build_overrides/pigweed.gni
@@ -0,0 +1,33 @@
+# Copyright 2021 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.
+
+declare_args() {
+  # Location of the Pigweed repository.
+  dir_pigweed = "//third_party/pigweed/"
+}
+
+# Upstream Pigweed modules.
+import("$dir_pigweed/modules.gni")
+
+# Experimental modules.
+declare_args() {
+  dir_pico_build = get_path_info("//pico_build", "abspath")
+  dir_pw_board_led = get_path_info("//pw_board_led", "abspath")
+  dir_pw_board_led_host = get_path_info("//pw_board_led_host", "abspath")
+  dir_pw_board_led_pico = get_path_info("//pw_board_led_pico", "abspath")
+  dir_pw_spin_delay = get_path_info("//pw_spin_delay", "abspath")
+  dir_pw_spin_delay_host = get_path_info("//pw_spin_delay_host", "abspath")
+  dir_pw_spin_delay_pico = get_path_info("//pw_spin_delay_pico", "abspath")
+  dir_pw_sys_io_pico = get_path_info("//pw_sys_io_pico", "abspath")
+}
diff --git a/buildcmake.sh b/buildcmake.sh
new file mode 100755
index 0000000..a8be8bd
--- /dev/null
+++ b/buildcmake.sh
@@ -0,0 +1,5 @@
+#!/bin/bash
+mkdir -p outcmake
+cd outcmake
+cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .. && make -j4
+
diff --git a/env_setup.json b/env_setup.json
new file mode 100644
index 0000000..fddf704
--- /dev/null
+++ b/env_setup.json
@@ -0,0 +1,60 @@
+{
+  "root_variable": "PIGWEED_EXPERIMENTAL_ROOT",
+  "cipd_package_files": [
+    "third_party/pigweed/pw_env_setup/py/pw_env_setup/cipd_setup/pigweed.json",
+    "third_party/pigweed/pw_env_setup/py/pw_env_setup/cipd_setup/bazel.json",
+    "third_party/pigweed/pw_env_setup/py/pw_env_setup/cipd_setup/python.json",
+    "third_party/pigweed/pw_env_setup/py/pw_env_setup/cipd_setup/luci.json"
+  ],
+  "virtualenv": {
+    "gn_root": ".",
+    "gn_targets": [
+      ":python.install"
+    ]
+  },
+  "optional_submodules": [
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32l0xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/tools/uf2",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_f3",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_l5",
+    "third_party/pico-sdk/lib/tinyusb/lib/CMSIS_5",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_f1",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_l4",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32f7xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_l1",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/silabs/cmsis-dfp-efm32gg12b",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32f1xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32l1xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/nxp/lpcopen",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_g0",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32g0xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32g4xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/nordic/nrfx",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/mindmotion/mm32sdk",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/gd/nuclei-sdk",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32f0xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_f7",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_h7",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32f4xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/renesas/rx",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/sony/cxd56/spresense-exported-sdk",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/ti",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_f0",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32l4xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/lib/sct_neopixel",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32l5xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32h7xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32f2xx_hal_driver",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_l0",
+    "third_party/pico-sdk/lib/tinyusb/lib/FreeRTOS-Kernel",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/nxp/nxp_sdk",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_f4",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/nxp/mcux-sdk",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_g4",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/cmsis_device_f2",
+    "third_party/pico-sdk/lib/tinyusb/lib/lwip",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/nuvoton",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/microchip",
+    "third_party/pico-sdk/lib/tinyusb/hw/mcu/st/stm32f3xx_hal_driver"
+  ]
+}
diff --git a/hello_usb.c b/hello_usb.c
new file mode 100644
index 0000000..f21dc3a
--- /dev/null
+++ b/hello_usb.c
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include "pico/stdlib.h"
+#include <stdio.h>
+
+int main() {
+  stdio_init_all();
+  while (true) {
+    printf("Hello, world!\n");
+    sleep_ms(1000);
+  }
+  return 0;
+}
diff --git a/pico_build/BUILD.gn b/pico_build/BUILD.gn
new file mode 100644
index 0000000..cb34363
--- /dev/null
+++ b/pico_build/BUILD.gn
@@ -0,0 +1,7 @@
+import("//build_overrides/pigweed.gni")
+
+import("$dir_pw_build/target_types.gni")
+
+pw_executable("pico_build") {
+  sources = [ "//hello_usb.c" ]
+}
diff --git a/pico_build/bs2_default/BUILD.gn b/pico_build/bs2_default/BUILD.gn
new file mode 100644
index 0000000..89c0f2a
--- /dev/null
+++ b/pico_build/bs2_default/BUILD.gn
@@ -0,0 +1,58 @@
+import("//build_overrides/pigweed.gni")
+
+import("$dir_pw_build/target_types.gni")
+
+_pico_sdk_dir = rebase_path(dir_third_party_pico_sdk)
+
+pw_executable("bs2_default") {
+  defines = [
+    "PICO_H_LOCATION=\"${_pico_sdk_dir}/src/boards/include/boards/pico.h\"",
+    "RENAME_EXCEPTIONS_H_LOCATION=\"$_pico_sdk_dir/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h\"",
+    "PICO_BOARD=\"pico\"",
+    "PICO_BUILD=1",
+    "PICO_NO_HARDWARE=0",
+    "PICO_ON_DEVICE=1",
+  ]
+  asmflags = [
+    "-mcpu=cortex-m0plus",
+    "-mthumb",
+    "-O3",
+    "-DNDEBUG",
+  ]
+  include_dirs = [
+    "${_pico_sdk_dir}/src/boards/include",
+    "${_pico_sdk_dir}/src/common/pico_base/include",
+    "${_pico_sdk_dir}/src/rp2040/hardware_regs/include",
+    "${_pico_sdk_dir}/src/rp2_common/boot_stage2/asminclude",
+    "${_pico_sdk_dir}/src/rp2_common/boot_stage2/include",
+    "${_pico_sdk_dir}/src/rp2_common/hardware_base/include",
+    "${_pico_sdk_dir}/src/rp2_common/pico_platform/include",
+    "$dir_pico_build/public_overrides",
+  ]
+  sources =
+      [ "${_pico_sdk_dir}/src/rp2_common/boot_stage2/compile_time_choice.S" ]
+  ldflags = [
+    "-Wl,--build-id=none",
+    "-nostartfiles",
+    "-Wl,--script=${_pico_sdk_dir}/src/rp2_common/boot_stage2/boot_stage2.ld",
+    "-Wl,-Map=bs2_default.elf.map",
+  ]
+}
+
+# Followup steps for bs2_default.elf
+
+# 1. arm-none-eabi-objdump -h bs2_default.elf >bs2_default.dis
+# 2. arm-none-eabi-objdump -d bs2_default.elf >>bs2_default.dis
+# 3. Generating bs2_default.bin
+#   cd pico-sdk/src/rp2_common/boot_stage2 &&
+#   ../../../../../.environment/cipd/pigweed/bin/arm-none-eabi-objcopy
+#   -Obinary
+#   /home/tonymd/pico/picohellousbserial/outcmake/pico-sdk/src/rp2_common/boot_stage2/bs2_default.elf
+#   /home/tonymd/pico/picohellousbserial/outcmake/pico-sdk/src/rp2_common/boot_stage2/bs2_default.bin
+# 4. Generating bs2_default_padded_checksummed.S
+#   cd pico-sdk/src/rp2_common/boot_stage2 &&
+#   /usr/bin/python3.8
+#   ./picohellousbserial/third_party/pico-sdk/src/rp2_common/boot_stage2/pad_checksum
+#   -s 0xffffffff
+#   ./picohellousbserial/outcmake/pico-sdk/src/rp2_common/boot_stage2/bs2_default.bin
+#   ./picohellousbserial/outcmake/pico-sdk/src/rp2_common/boot_stage2/bs2_default_padded_checksummed.S
diff --git a/pico_build/bs2_default_padded_checksummed.S b/pico_build/bs2_default_padded_checksummed.S
new file mode 100644
index 0000000..d64917b
--- /dev/null
+++ b/pico_build/bs2_default_padded_checksummed.S
@@ -0,0 +1,23 @@
+// Padded and checksummed version of: out/cmake_build/pico-sdk/src/rp2_common/boot_stage2/bs2_default.bin
+
+.cpu cortex-m0plus
+.thumb
+
+.section .boot2, "ax"
+
+.byte 0x00, 0xb5, 0x32, 0x4b, 0x21, 0x20, 0x58, 0x60, 0x98, 0x68, 0x02, 0x21, 0x88, 0x43, 0x98, 0x60
+.byte 0xd8, 0x60, 0x18, 0x61, 0x58, 0x61, 0x2e, 0x4b, 0x00, 0x21, 0x99, 0x60, 0x02, 0x21, 0x59, 0x61
+.byte 0x01, 0x21, 0xf0, 0x22, 0x99, 0x50, 0x2b, 0x49, 0x19, 0x60, 0x01, 0x21, 0x99, 0x60, 0x35, 0x20
+.byte 0x00, 0xf0, 0x44, 0xf8, 0x02, 0x22, 0x90, 0x42, 0x14, 0xd0, 0x06, 0x21, 0x19, 0x66, 0x00, 0xf0
+.byte 0x34, 0xf8, 0x19, 0x6e, 0x01, 0x21, 0x19, 0x66, 0x00, 0x20, 0x18, 0x66, 0x1a, 0x66, 0x00, 0xf0
+.byte 0x2c, 0xf8, 0x19, 0x6e, 0x19, 0x6e, 0x19, 0x6e, 0x05, 0x20, 0x00, 0xf0, 0x2f, 0xf8, 0x01, 0x21
+.byte 0x08, 0x42, 0xf9, 0xd1, 0x00, 0x21, 0x99, 0x60, 0x1b, 0x49, 0x19, 0x60, 0x00, 0x21, 0x59, 0x60
+.byte 0x1a, 0x49, 0x1b, 0x48, 0x01, 0x60, 0x01, 0x21, 0x99, 0x60, 0xeb, 0x21, 0x19, 0x66, 0xa0, 0x21
+.byte 0x19, 0x66, 0x00, 0xf0, 0x12, 0xf8, 0x00, 0x21, 0x99, 0x60, 0x16, 0x49, 0x14, 0x48, 0x01, 0x60
+.byte 0x01, 0x21, 0x99, 0x60, 0x01, 0xbc, 0x00, 0x28, 0x00, 0xd0, 0x00, 0x47, 0x12, 0x48, 0x13, 0x49
+.byte 0x08, 0x60, 0x03, 0xc8, 0x80, 0xf3, 0x08, 0x88, 0x08, 0x47, 0x03, 0xb5, 0x99, 0x6a, 0x04, 0x20
+.byte 0x01, 0x42, 0xfb, 0xd0, 0x01, 0x20, 0x01, 0x42, 0xf8, 0xd1, 0x03, 0xbd, 0x02, 0xb5, 0x18, 0x66
+.byte 0x18, 0x66, 0xff, 0xf7, 0xf2, 0xff, 0x18, 0x6e, 0x18, 0x6e, 0x02, 0xbd, 0x00, 0x00, 0x02, 0x40
+.byte 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x07, 0x00, 0x00, 0x03, 0x5f, 0x00, 0x21, 0x22, 0x00, 0x00
+.byte 0xf4, 0x00, 0x00, 0x18, 0x22, 0x20, 0x00, 0xa0, 0x00, 0x01, 0x00, 0x10, 0x08, 0xed, 0x00, 0xe0
+.byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xb2, 0x4e, 0x7a
diff --git a/pico_build/public_overrides/pico/config_autogen.h b/pico_build/public_overrides/pico/config_autogen.h
new file mode 100644
index 0000000..4bbfecf
--- /dev/null
+++ b/pico_build/public_overrides/pico/config_autogen.h
@@ -0,0 +1,4 @@
+#pragma once
+
+#include PICO_H_LOCATION
+#include RENAME_EXCEPTIONS_H_LOCATION
diff --git a/pico_build/public_overrides/pico/version.h b/pico_build/public_overrides/pico/version.h
new file mode 100644
index 0000000..015270c
--- /dev/null
+++ b/pico_build/public_overrides/pico/version.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+// ---------------------------------------
+// THIS FILE IS AUTOGENERATED; DO NOT EDIT
+// ---------------------------------------
+
+#ifndef _PICO_VERSION_H
+#define _PICO_VERSION_H
+
+#define PICO_SDK_VERSION_MAJOR 1
+#define PICO_SDK_VERSION_MINOR 3
+#define PICO_SDK_VERSION_REVISION 0
+#define PICO_SDK_VERSION_STRING "1.3.0"
+
+#endif
diff --git a/pico_build/py/BUILD.gn b/pico_build/py/BUILD.gn
new file mode 100644
index 0000000..09b5f03
--- /dev/null
+++ b/pico_build/py/BUILD.gn
@@ -0,0 +1,31 @@
+# Copyright 2021 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/python.gni")
+
+pw_python_package("py") {
+  setup = [
+    "pyproject.toml",
+    "setup.cfg",
+    "setup.py",
+  ]
+  sources = [
+    "pico_build/__init__.py",
+    "pico_build/generate_bs2.py",
+  ]
+
+  pylintrc = "$dir_pigweed/.pylintrc"
+}
diff --git a/pico_build/py/pico_build/__init__.py b/pico_build/py/pico_build/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/pico_build/py/pico_build/__init__.py
diff --git a/pico_build/py/pico_build/generate_bs2.py b/pico_build/py/pico_build/generate_bs2.py
new file mode 100644
index 0000000..64d1c35
--- /dev/null
+++ b/pico_build/py/pico_build/generate_bs2.py
@@ -0,0 +1,54 @@
+#!/usr/bin/env python3
+# Copyright 2021 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.
+"""PNG to rgb565 header file converter."""
+
+import argparse
+import logging
+from pathlib import Path
+
+from jinja2 import Environment, FileSystemLoader, make_logging_undefined
+
+jinja_env = Environment(
+    # Load templates automatically from pw_console/templates
+    loader=FileSystemLoader(Path(__file__).parent / 'templates'),
+    # Raise errors if variables are undefined in templates
+    undefined=make_logging_undefined(logger=logging.getLogger(__package__), ),
+    # Trim whitespace in templates
+    trim_blocks=True,
+    lstrip_blocks=True,
+)
+
+
+def _arg_parser():
+    """Setup argparse."""
+    parser = argparse.ArgumentParser(description=__doc__)
+    parser.add_argument('OUTPUT_PATH', type=Path, help="output_path")
+    return parser.parse_args()
+
+
+def main() -> None:
+    args = _arg_parser()
+
+    output_path = args.output_path
+    if not output_path.is_dir():
+        raise FileNotFoundError
+
+    template = jinja_env.get_template('bs2.jinja')
+    output_file = output_path / 'bs2_generated.h'
+    output_file.write_text(template.render(text="hello"))
+
+
+if __name__ == '__main__':
+    main()
diff --git a/pico_build/py/pico_build/templates/bs2.jinja b/pico_build/py/pico_build/templates/bs2.jinja
new file mode 100644
index 0000000..1fb1127
--- /dev/null
+++ b/pico_build/py/pico_build/templates/bs2.jinja
@@ -0,0 +1,3 @@
+#pragma once
+
+{{ '// hello' }}
diff --git a/pico_build/py/pyproject.toml b/pico_build/py/pyproject.toml
new file mode 100644
index 0000000..798b747
--- /dev/null
+++ b/pico_build/py/pyproject.toml
@@ -0,0 +1,16 @@
+# Copyright 2021 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.
+[build-system]
+requires = ['setuptools', 'wheel']
+build-backend = 'setuptools.build_meta'
diff --git a/pico_build/py/setup.cfg b/pico_build/py/setup.cfg
new file mode 100644
index 0000000..cb20f67
--- /dev/null
+++ b/pico_build/py/setup.cfg
@@ -0,0 +1,32 @@
+# Copyright 2021 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.
+[metadata]
+name = pico_build
+version = 0.0.1
+author = Pigweed Authors
+author_email = pigweed-developers@googlegroups.com
+description = Pigweed Pico Build
+
+[options]
+packages = find:
+zip_safe = False
+install_requires =
+    jinja2
+
+[options.entry_points]
+console_scripts = generate_bs2_checksumed = pico_build.generate_bs2:main
+
+[options.package_data]
+pico_build =
+    py.typed
\ No newline at end of file
diff --git a/pico_build/py/setup.py b/pico_build/py/setup.py
new file mode 100644
index 0000000..de3c949
--- /dev/null
+++ b/pico_build/py/setup.py
@@ -0,0 +1,18 @@
+# Copyright 2021 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.
+"""pico_build"""
+
+import setuptools  # type: ignore
+
+setuptools.setup()  # Package definition in setup.cfg
diff --git a/pico_sdk_import.cmake b/pico_sdk_import.cmake
new file mode 120000
index 0000000..7461ddb
--- /dev/null
+++ b/pico_sdk_import.cmake
@@ -0,0 +1 @@
+third_party/pico-sdk/external/pico_sdk_import.cmake
\ No newline at end of file
diff --git a/pw_board_led/BUILD.gn b/pw_board_led/BUILD.gn
new file mode 100644
index 0000000..bf09f23
--- /dev/null
+++ b/pw_board_led/BUILD.gn
@@ -0,0 +1,32 @@
+# Copyright 2021 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/facade.gni")
+
+declare_args() {
+  # The backend (driver) to use for the board LED.
+  pw_board_led_BACKEND = ""
+}
+
+config("public_includes") {
+  include_dirs = [ "public" ]
+}
+
+pw_facade("pw_board_led") {
+  backend = pw_board_led_BACKEND
+  public_configs = [ ":public_includes" ]
+  public = [ "public/pw_board_led/led.h" ]
+}
diff --git a/pw_board_led/public/pw_board_led/led.h b/pw_board_led/public/pw_board_led/led.h
new file mode 100644
index 0000000..ab03651
--- /dev/null
+++ b/pw_board_led/public/pw_board_led/led.h
@@ -0,0 +1,25 @@
+// Copyright 2021 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.
+#pragma once
+
+namespace pw::board_led {
+
+void Init();
+void TurnOn();
+void TurnOff();
+void Toggle();
+
+// TODO(amontanez): Maybe we should add a GetState()? 🤔
+
+} // namespace pw::board_led
diff --git a/pw_board_led_host/BUILD.gn b/pw_board_led_host/BUILD.gn
new file mode 100644
index 0000000..0266972
--- /dev/null
+++ b/pw_board_led_host/BUILD.gn
@@ -0,0 +1,25 @@
+# Copyright 2021 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/target_types.gni")
+
+pw_source_set("pw_board_led_host") {
+  deps = [
+    "$dir_pw_board_led:pw_board_led.facade",
+    dir_pw_log,
+  ]
+  sources = [ "led.cc" ]
+}
diff --git a/pw_board_led_host/led.cc b/pw_board_led_host/led.cc
new file mode 100644
index 0000000..71f520c
--- /dev/null
+++ b/pw_board_led_host/led.cc
@@ -0,0 +1,49 @@
+// Copyright 2021 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 "pw_board_led/led.h"
+
+#include <cinttypes>
+
+#include "pw_log/log.h"
+
+namespace pw::board_led {
+namespace {
+
+bool led_on = false;
+
+} // namespace
+
+void Init() { TurnOff(); }
+
+void TurnOff() {
+  PW_LOG_INFO("[ ]");
+  led_on = false;
+}
+
+void TurnOn() {
+  PW_LOG_INFO("[*]");
+  led_on = true;
+}
+
+void Toggle() {
+  // Check if the LED is on. If so, turn it off.
+  if (led_on) {
+    TurnOff();
+  } else {
+    TurnOn();
+  }
+}
+
+} // namespace pw::board_led
diff --git a/pw_board_led_pico/BUILD.gn b/pw_board_led_pico/BUILD.gn
new file mode 100644
index 0000000..b4795a5
--- /dev/null
+++ b/pw_board_led_pico/BUILD.gn
@@ -0,0 +1,26 @@
+# Copyright 2021 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/target_types.gni")
+
+pw_source_set("pw_board_led_pico") {
+  deps = [
+    "$dir_pw_board_led:pw_board_led.facade",
+    "//targets/pico:pico_core_sources",
+  ]
+  sources = [ "led.cc" ]
+  remove_configs = [ "$dir_pw_build:strict_warnings" ]
+}
diff --git a/pw_board_led_pico/led.cc b/pw_board_led_pico/led.cc
new file mode 100644
index 0000000..a286056
--- /dev/null
+++ b/pw_board_led_pico/led.cc
@@ -0,0 +1,53 @@
+// Copyright 2021 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 "pico/stdlib.h"
+
+#include "pw_board_led/led.h"
+
+#include <cinttypes>
+
+namespace pw::board_led {
+namespace {
+
+constexpr uint kLedPin = PICO_DEFAULT_LED_PIN;
+bool led_on = false;
+
+} // namespace
+
+void Init() {
+  gpio_init(kLedPin);
+  gpio_set_dir(kLedPin, GPIO_OUT);
+}
+
+void TurnOff() {
+  gpio_put(kLedPin, 0);
+  led_on = false;
+}
+
+void TurnOn() {
+  gpio_put(kLedPin, 1);
+  led_on = true;
+}
+
+void Toggle() {
+  // Check if the LED is on. If so, turn it off.
+  if (led_on) {
+    TurnOff();
+  } else {
+    TurnOn();
+  }
+}
+
+} // namespace pw::board_led
diff --git a/pw_spin_delay/BUILD.gn b/pw_spin_delay/BUILD.gn
new file mode 100644
index 0000000..41b9275
--- /dev/null
+++ b/pw_spin_delay/BUILD.gn
@@ -0,0 +1,32 @@
+# Copyright 2021 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/facade.gni")
+
+declare_args() {
+  # The backend (driver) to use for the board LED.
+  pw_spin_delay_BACKEND = ""
+}
+
+config("public_includes") {
+  include_dirs = [ "public" ]
+}
+
+pw_facade("pw_spin_delay") {
+  backend = pw_spin_delay_BACKEND
+  public_configs = [ ":public_includes" ]
+  public = [ "public/pw_spin_delay/delay.h" ]
+}
diff --git a/pw_spin_delay/public/pw_spin_delay/delay.h b/pw_spin_delay/public/pw_spin_delay/delay.h
new file mode 100644
index 0000000..d6b701b
--- /dev/null
+++ b/pw_spin_delay/public/pw_spin_delay/delay.h
@@ -0,0 +1,25 @@
+// Copyright 2021 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.
+#pragma once
+
+#include <cinttypes>
+#include <cstddef>
+
+namespace pw::spin_delay {
+
+void WaitMillis(size_t delay_ms);
+uint32_t Millis();
+uint32_t Micros();
+
+} // namespace pw::spin_delay
diff --git a/pw_spin_delay_host/BUILD.gn b/pw_spin_delay_host/BUILD.gn
new file mode 100644
index 0000000..fea87c4
--- /dev/null
+++ b/pw_spin_delay_host/BUILD.gn
@@ -0,0 +1,22 @@
+# Copyright 2021 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/target_types.gni")
+
+pw_source_set("pw_spin_delay_host") {
+  deps = [ "$dir_pw_spin_delay:pw_spin_delay.facade" ]
+  sources = [ "delay.cc" ]
+}
diff --git a/pw_spin_delay_host/delay.cc b/pw_spin_delay_host/delay.cc
new file mode 100644
index 0000000..44415d4
--- /dev/null
+++ b/pw_spin_delay_host/delay.cc
@@ -0,0 +1,61 @@
+// Copyright 2021 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 "pw_spin_delay/delay.h"
+
+#include <chrono>
+#include <cstddef>
+#include <cstdint>
+
+namespace {
+std::chrono::system_clock::time_point kProgramStart =
+    std::chrono::system_clock::now();
+}
+
+namespace pw::spin_delay {
+
+void WaitMillis(size_t delay_ms) {
+  std::chrono::system_clock::time_point start =
+      std::chrono::system_clock::now();
+  std::chrono::system_clock::time_point now;
+  size_t difference;
+  do {
+    now = std::chrono::system_clock::now();
+    difference =
+        std::chrono::duration_cast<std::chrono::milliseconds>(now - start)
+            .count();
+  } while (difference < delay_ms);
+}
+
+uint32_t Millis() {
+  std::chrono::system_clock::time_point now;
+  uint32_t difference;
+  now = std::chrono::system_clock::now();
+  difference =
+      std::chrono::duration_cast<std::chrono::milliseconds>(now - kProgramStart)
+          .count();
+  return difference;
+}
+
+uint32_t Micros() {
+  std::chrono::system_clock::time_point now;
+  uint32_t difference;
+  now = std::chrono::system_clock::now();
+  difference =
+      std::chrono::duration_cast<std::chrono::microseconds>(now - kProgramStart)
+          .count();
+  return difference;
+}
+
+} // namespace pw::spin_delay
diff --git a/pw_spin_delay_pico/BUILD.gn b/pw_spin_delay_pico/BUILD.gn
new file mode 100644
index 0000000..b84dd84
--- /dev/null
+++ b/pw_spin_delay_pico/BUILD.gn
@@ -0,0 +1,26 @@
+# Copyright 2021 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/target_types.gni")
+
+pw_source_set("pw_spin_delay_pico") {
+  deps = [
+    "$dir_pw_spin_delay:pw_spin_delay.facade",
+    "//targets/pico:pico_core_sources",
+  ]
+  sources = [ "delay.cc" ]
+  remove_configs = [ "$dir_pw_build:strict_warnings" ]
+}
diff --git a/pw_spin_delay_pico/delay.cc b/pw_spin_delay_pico/delay.cc
new file mode 100644
index 0000000..05cc712
--- /dev/null
+++ b/pw_spin_delay_pico/delay.cc
@@ -0,0 +1,27 @@
+// Copyright 2021 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 "pw_spin_delay/delay.h"
+
+#include <cstddef>
+
+#include "pico/stdlib.h"
+
+namespace pw::spin_delay {
+
+void WaitMillis(size_t delay_ms) { sleep_ms(delay_ms); }
+uint32_t Millis() { return 0; }
+uint32_t Micros() { return 0; }
+
+} // namespace pw::spin_delay
diff --git a/pw_sys_io_pico/BUILD.gn b/pw_sys_io_pico/BUILD.gn
new file mode 100644
index 0000000..bcbe437
--- /dev/null
+++ b/pw_sys_io_pico/BUILD.gn
@@ -0,0 +1,41 @@
+# Copyright 2019 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/target_types.gni")
+import("$dir_pw_docgen/docs.gni")
+
+config("default_config") {
+  include_dirs = [ "public" ]
+}
+
+if (dir_third_party_pico_sdk != "") {
+  pw_source_set("pw_sys_io_pico") {
+    remove_configs = [ "$dir_pw_build:strict_warnings" ]
+    public_configs = [ ":default_config" ]
+    public = [ "public/pw_sys_io_pico/init.h" ]
+    public_deps = [ "$dir_pw_preprocessor" ]
+    deps = [
+      "$dir_pw_sys_io:default_putget_bytes",
+      "$dir_pw_sys_io:facade",
+      "//targets/pico:pico_core_sources",
+    ]
+    sources = [ "sys_io_pico.cc" ]
+  }
+}
+
+pw_doc_group("docs") {
+  sources = [ "docs.rst" ]
+}
diff --git a/pw_sys_io_pico/public/pw_sys_io_pico/init.h b/pw_sys_io_pico/public/pw_sys_io_pico/init.h
new file mode 100644
index 0000000..c3177ec
--- /dev/null
+++ b/pw_sys_io_pico/public/pw_sys_io_pico/init.h
@@ -0,0 +1,23 @@
+// Copyright 2020 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.
+#pragma once
+
+#include "pw_preprocessor/util.h"
+
+PW_EXTERN_C_START
+
+// The actual implement of PreMainInit() in sys_io_BACKEND.
+void pw_sys_io_pico_Init();
+
+PW_EXTERN_C_END
diff --git a/pw_sys_io_pico/sys_io_pico.cc b/pw_sys_io_pico/sys_io_pico.cc
new file mode 100644
index 0000000..1b02ba8
--- /dev/null
+++ b/pw_sys_io_pico/sys_io_pico.cc
@@ -0,0 +1,68 @@
+// Copyright 2019 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 <cinttypes>
+#include <cstdint>
+
+#include "hardware/irq.h"
+#include "hardware/uart.h"
+#include "pico/stdio.h"
+#include "pico/stdlib.h"
+
+#include "pw_preprocessor/compiler.h"
+#include "pw_sys_io/sys_io.h"
+
+extern "C" void pw_sys_io_pico_Init() { stdio_init_all(); }
+
+namespace pw::sys_io {
+
+Status ReadByte(std::byte *dest) {
+  while (true) {
+    if (TryReadByte(dest).ok()) {
+      return OkStatus();
+    }
+  }
+}
+
+Status TryReadByte(std::byte *dest) {
+  int c = getchar_timeout_us(0);
+  if (c == PICO_ERROR_TIMEOUT) {
+    return Status::Unavailable();
+  }
+  *dest = static_cast<std::byte>(c);
+  return OkStatus();
+}
+
+Status WriteByte(std::byte b) {
+  putchar_raw((uint8_t)b);
+  return OkStatus();
+}
+
+// Writes a string using pw::sys_io, and add newline characters at the end.
+StatusWithSize WriteLine(const std::string_view &s) {
+  size_t chars_written = 0;
+  StatusWithSize result = WriteBytes(std::as_bytes(std::span(s)));
+  if (!result.ok()) {
+    return result;
+  }
+  chars_written += result.size();
+
+  // Write trailing newline.
+  result = WriteBytes(std::as_bytes(std::span("\r\n", 2)));
+  chars_written += result.size();
+
+  return StatusWithSize(result.status(), chars_written);
+}
+
+} // namespace pw::sys_io
diff --git a/targets/common_backends.gni b/targets/common_backends.gni
new file mode 100644
index 0000000..00c4edf
--- /dev/null
+++ b/targets/common_backends.gni
@@ -0,0 +1,37 @@
+# Copyright 2021 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")
+
+# Inherit from a Pigweed upstream toolchain and override backends as needed.
+toolchain_overrides = {
+  # Configure backend for assert facade.
+  pw_assert_BACKEND = dir_pw_assert_basic
+
+  # Configure the pw_log facade for Base64 tokenized logging.
+  pw_log_BACKEND = dir_pw_log_tokenized
+  pw_tokenizer_GLOBAL_HANDLER_WITH_PAYLOAD_BACKEND =
+      "$dir_pw_log_tokenized:base64_over_hdlc"
+
+  # Alternately, configure pw_log for plain text logging
+  # pw_log_BACKEND = dir_pw_log_basic
+
+  # Path to the nanopb installation. Defaults to included git module.
+  dir_pw_third_party_nanopb = "//third_party/nanopb"
+
+  pw_build_LINK_DEPS = [
+    "$dir_pw_assert:impl",
+    "$dir_pw_log:impl",
+  ]
+}
diff --git a/targets/host/BUILD.gn b/targets/host/BUILD.gn
new file mode 100644
index 0000000..200c021
--- /dev/null
+++ b/targets/host/BUILD.gn
@@ -0,0 +1,22 @@
+# Copyright 2021 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_toolchain/generate_toolchain.gni")
+import("target_toolchains.gni")
+
+generate_toolchains("toolchains") {
+  toolchains = toolchains_list
+}
diff --git a/targets/host/target_toolchains.gni b/targets/host/target_toolchains.gni
new file mode 100644
index 0000000..c27aabc
--- /dev/null
+++ b/targets/host/target_toolchains.gni
@@ -0,0 +1,80 @@
+# Copyright 2021 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("//targets/common_backends.gni")
+import("$dir_pigweed/targets/host/target_toolchains.gni")
+import("$dir_pw_protobuf_compiler/proto.gni")
+import("$dir_pw_third_party/nanopb/nanopb.gni")
+
+target_toolchain_host = {
+  _excluded_members = [
+    "defaults",
+    "name",
+  ]
+
+  _excluded_defaults = [
+    "pw_trace_BACKEND",
+    "pw_trace_tokenizer_time",
+  ]
+
+  clang_debug = {
+    name = "host_debug"
+    if (host_os == "win") {
+      _toolchain_base = pw_target_toolchain_host.gcc_debug
+    } else {
+      _toolchain_base = pw_target_toolchain_host.clang_debug
+    }
+    forward_variables_from(_toolchain_base, "*", _excluded_members)
+    defaults = {
+      forward_variables_from(_toolchain_base.defaults, "*", _excluded_defaults)
+      forward_variables_from(toolchain_overrides, "*")
+
+      # Force hosts to use basic log backend to avoid generating and loading its
+      # own tokenized database.
+      pw_log_BACKEND = dir_pw_log_basic
+
+      # Configure backend for pw_sys_io facade.
+      pw_sys_io_BACKEND = dir_pw_sys_io_stdio
+
+      pw_board_led_BACKEND = dir_pw_board_led_host
+      pw_spin_delay_BACKEND = dir_pw_spin_delay_host
+    }
+  }
+
+  # Toolchain for tests only.
+  clang_debug_tests = {
+    name = "host_debug_tests"
+    if (host_os == "win") {
+      _toolchain_base = pw_target_toolchain_host.gcc_debug
+    } else {
+      _toolchain_base = pw_target_toolchain_host.clang_debug
+    }
+    forward_variables_from(_toolchain_base, "*", _excluded_members)
+    defaults = {
+      forward_variables_from(_toolchain_base.defaults, "*", _excluded_defaults)
+      forward_variables_from(toolchain_overrides, "*")
+
+      # Force tests to use basic log backend to avoid generating and loading its
+      # own tokenized database.
+      pw_log_BACKEND = dir_pw_log_basic
+    }
+  }
+}
+
+toolchains_list = [
+  target_toolchain_host.clang_debug,
+  target_toolchain_host.clang_debug_tests,
+]
diff --git a/targets/pico/BUILD.gn b/targets/pico/BUILD.gn
new file mode 100644
index 0000000..0ed5c36
--- /dev/null
+++ b/targets/pico/BUILD.gn
@@ -0,0 +1,328 @@
+# Copyright 2021 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_toolchain/generate_toolchain.gni")
+
+if (dir_third_party_pico_sdk != "") {
+  import("target_toolchains.gni")
+
+  generate_toolchains("toolchains") {
+    toolchains = toolchains_list
+  }
+
+  if (current_toolchain != default_toolchain) {
+    _pico_sdk_dir = rebase_path(dir_third_party_pico_sdk)
+
+    config("pico_config") {
+      defines = [
+        "DIR_THIRD_PARTY_PICO_SDK=\"$_pico_sdk_dir\"",
+        "PICO_H_LOCATION=\"${_pico_sdk_dir}/src/boards/include/boards/pico.h\"",
+        "RENAME_EXCEPTIONS_H_LOCATION=\"$_pico_sdk_dir/src/rp2_common/cmsis/include/cmsis/rename_exceptions.h\"",
+        "CFG_TUSB_DEBUG=0",
+        "CFG_TUSB_MCU=OPT_MCU_RP2040",
+        "CFG_TUSB_OS=OPT_OS_PICO",
+        "LIB_PICO_BIT_OPS=1",
+        "LIB_PICO_BIT_OPS_PICO=1",
+        "LIB_PICO_DIVIDER=1",
+        "LIB_PICO_DIVIDER_HARDWARE=1",
+        "LIB_PICO_DOUBLE=1",
+        "LIB_PICO_DOUBLE_PICO=1",
+        "LIB_PICO_FIX_RP2040_USB_DEVICE_ENUMERATION=1",
+        "LIB_PICO_FLOAT=1",
+        "LIB_PICO_FLOAT_PICO=1",
+        "LIB_PICO_INT64_OPS=1",
+        "LIB_PICO_INT64_OPS_PICO=1",
+        "LIB_PICO_MALLOC=1",
+        "LIB_PICO_MEM_OPS=1",
+        "LIB_PICO_MEM_OPS_PICO=1",
+        "LIB_PICO_PLATFORM=1",
+        "LIB_PICO_PRINTF=1",
+        "LIB_PICO_PRINTF_PICO=1",
+        "LIB_PICO_RUNTIME=1",
+        "LIB_PICO_STANDARD_LINK=1",
+        "LIB_PICO_STDIO=1",
+        "LIB_PICO_STDIO_USB=1",
+        "LIB_PICO_STDLIB=1",
+        "LIB_PICO_SYNC=1",
+        "LIB_PICO_SYNC_CORE=1",
+        "LIB_PICO_SYNC_CRITICAL_SECTION=1",
+        "LIB_PICO_SYNC_MUTEX=1",
+        "LIB_PICO_SYNC_SEM=1",
+        "LIB_PICO_TIME=1",
+        "LIB_PICO_UNIQUE_ID=1",
+        "LIB_PICO_UTIL=1",
+        "PICO_BOARD=\"pico\"",
+        "PICO_BUILD=1",
+        "PICO_CMAKE_BUILD_TYPE=\"Release\"",
+        "PICO_COPY_TO_RAM=0",
+        "PICO_CXX_ENABLE_EXCEPTIONS=0",
+        "PICO_NO_FLASH=0",
+        "PICO_NO_HARDWARE=0",
+        "PICO_ON_DEVICE=1",
+
+        # "PICO_TARGET_NAME=\"hello_usb\"",
+        "PICO_USE_BLOCKED_RAM=0",
+      ]
+      include_dirs = [
+        "$dir_third_party_pico_sdk/src/common/pico_stdlib/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_gpio/include",
+        "$dir_third_party_pico_sdk/src/common/pico_base/include",
+        "$dir_pico_build/public_overrides",
+        "$dir_third_party_pico_sdk/src/boards/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_platform/include",
+        "$dir_third_party_pico_sdk/src/rp2040/hardware_regs/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_base/include",
+        "$dir_third_party_pico_sdk/src/rp2040/hardware_structs/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_claim/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_sync/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_uart/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_divider/include",
+        "$dir_third_party_pico_sdk/src/common/pico_time/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_timer/include",
+        "$dir_third_party_pico_sdk/src/common/pico_sync/include",
+        "$dir_third_party_pico_sdk/src/common/pico_util/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_runtime/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_clocks/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_irq/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_resets/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_pll/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_vreg/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_watchdog/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_xosc/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_printf/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_bootrom/include",
+        "$dir_third_party_pico_sdk/src/common/pico_bit_ops/include",
+        "$dir_third_party_pico_sdk/src/common/pico_divider/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_double/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_int64_ops/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_float/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_malloc/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/boot_stage2/include",
+        "$dir_third_party_pico_sdk/src/common/pico_binary_info/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_stdio/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_stdio_usb/include",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/common",
+        "$dir_third_party_pico_sdk/lib/tinyusb/hw",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_unique_id/include",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_flash/include",
+        "$dir_third_party_pico_sdk/src/common/pico_usb_reset_interface/include",
+        "-NDEBUG",
+      ]
+      cflags = [
+        "-Wno-unused-function",
+        "-Wno-maybe-uninitialized",
+        "-ffunction-sections",
+        "-fdata-sections",
+        "-Wno-error=undef",
+        "-Wno-error=cast-qual",
+        "-Wno-error=pointer-arith",
+      ]
+      cflags_c = [ "-std=gnu11" ]
+      ldflags = [
+        "-Wl,--wrap=sprintf",
+        "-Wl,--wrap=snprintf",
+        "-Wl,--wrap=vsnprintf",
+        "-Wl,--wrap=__clzsi2",
+        "-Wl,--wrap=__clzdi2",
+        "-Wl,--wrap=__ctzsi2",
+        "-Wl,--wrap=__ctzdi2",
+        "-Wl,--wrap=__popcountsi2",
+        "-Wl,--wrap=__popcountdi2",
+        "-Wl,--wrap=__clz",
+        "-Wl,--wrap=__clzl",
+        "-Wl,--wrap=__clzll",
+        "-Wl,--wrap=__aeabi_idiv",
+        "-Wl,--wrap=__aeabi_idivmod",
+        "-Wl,--wrap=__aeabi_ldivmod",
+        "-Wl,--wrap=__aeabi_uidiv",
+        "-Wl,--wrap=__aeabi_uidivmod",
+        "-Wl,--wrap=__aeabi_uldivmod",
+        "-Wl,--wrap=__aeabi_lmul",
+        "-Wl,--wrap=__aeabi_fadd",
+        "-Wl,--wrap=__aeabi_fdiv",
+        "-Wl,--wrap=__aeabi_fmul",
+        "-Wl,--wrap=__aeabi_frsub",
+        "-Wl,--wrap=__aeabi_fsub",
+        "-Wl,--wrap=__aeabi_cfcmpeq",
+        "-Wl,--wrap=__aeabi_cfrcmple",
+        "-Wl,--wrap=__aeabi_cfcmple",
+        "-Wl,--wrap=__aeabi_fcmpeq",
+        "-Wl,--wrap=__aeabi_fcmplt",
+        "-Wl,--wrap=__aeabi_fcmple",
+        "-Wl,--wrap=__aeabi_fcmpge",
+        "-Wl,--wrap=__aeabi_fcmpgt",
+        "-Wl,--wrap=__aeabi_fcmpun",
+        "-Wl,--wrap=__aeabi_i2f",
+        "-Wl,--wrap=__aeabi_l2f",
+        "-Wl,--wrap=__aeabi_ui2f",
+        "-Wl,--wrap=__aeabi_ul2f",
+        "-Wl,--wrap=__aeabi_f2iz",
+        "-Wl,--wrap=__aeabi_f2lz",
+        "-Wl,--wrap=__aeabi_f2uiz",
+        "-Wl,--wrap=__aeabi_f2ulz",
+        "-Wl,--wrap=__aeabi_f2d",
+        "-Wl,--wrap=sqrtf",
+        "-Wl,--wrap=cosf",
+        "-Wl,--wrap=sinf",
+        "-Wl,--wrap=tanf",
+        "-Wl,--wrap=atan2f",
+        "-Wl,--wrap=expf",
+        "-Wl,--wrap=logf",
+        "-Wl,--wrap=ldexpf",
+        "-Wl,--wrap=copysignf",
+        "-Wl,--wrap=truncf",
+        "-Wl,--wrap=floorf",
+        "-Wl,--wrap=ceilf",
+        "-Wl,--wrap=roundf",
+        "-Wl,--wrap=sincosf",
+        "-Wl,--wrap=asinf",
+        "-Wl,--wrap=acosf",
+        "-Wl,--wrap=atanf",
+        "-Wl,--wrap=sinhf",
+        "-Wl,--wrap=coshf",
+        "-Wl,--wrap=tanhf",
+        "-Wl,--wrap=asinhf",
+        "-Wl,--wrap=acoshf",
+        "-Wl,--wrap=atanhf",
+        "-Wl,--wrap=exp2f",
+        "-Wl,--wrap=log2f",
+        "-Wl,--wrap=exp10f",
+        "-Wl,--wrap=log10f",
+        "-Wl,--wrap=powf",
+        "-Wl,--wrap=powintf",
+        "-Wl,--wrap=hypotf",
+        "-Wl,--wrap=cbrtf",
+        "-Wl,--wrap=fmodf",
+        "-Wl,--wrap=dremf",
+        "-Wl,--wrap=remainderf",
+        "-Wl,--wrap=remquof",
+        "-Wl,--wrap=expm1f",
+        "-Wl,--wrap=log1pf",
+        "-Wl,--wrap=fmaf",
+        "-Wl,--wrap=malloc",
+        "-Wl,--wrap=calloc",
+        "-Wl,--wrap=free",
+        "-Wl,--wrap=memcpy",
+        "-Wl,--wrap=memset",
+        "-Wl,--wrap=__aeabi_memcpy",
+        "-Wl,--wrap=__aeabi_memset",
+        "-Wl,--wrap=__aeabi_memcpy4",
+        "-Wl,--wrap=__aeabi_memset4",
+        "-Wl,--wrap=__aeabi_memcpy8",
+        "-Wl,--wrap=__aeabi_memset8",
+        "-Wl,-Map=hello_usb.elf.map",
+        "-Wl,--script=${_pico_sdk_dir}/src/rp2_common/pico_standard_link/memmap_default.ld",
+        "-Wl,-z,max-page-size=4096",
+        "-Wl,--gc-sections",
+        "-Wl,--wrap=printf",
+        "-Wl,--wrap=vprintf",
+        "-Wl,--wrap=puts",
+        "-Wl,--wrap=putchar",
+        "-Wl,--wrap=getchar",
+      ]
+    }
+
+    pw_source_set("pre_init") {
+      sources = [ "init.cc" ]
+
+      public_deps = [
+        "$dir_pw_sys_io_pico",
+        "//targets/pico:pico_core_sources",
+      ]
+      deps = []
+      remove_configs = [ "$dir_pw_build:strict_warnings" ]
+    }
+
+    pw_source_set("pico_core_sources") {
+      public_configs = [ ":pico_config" ]
+      sources = [
+        "$dir_pico_build/bs2_default_padded_checksummed.S",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/audio/audio_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/cdc/cdc_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/dfu/dfu_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/dfu/dfu_rt_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/hid/hid_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/midi/midi_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/msc/msc_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/net/ecm_rndis_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/net/ncm_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/usbtmc/usbtmc_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/vendor/vendor_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/class/video/video_device.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/common/tusb_fifo.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/device/usbd.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/device/usbd_control.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/dcd_rp2040.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/portable/raspberrypi/rp2040/rp2040_usb.c",
+        "$dir_third_party_pico_sdk/lib/tinyusb/src/tusb.c",
+        "$dir_third_party_pico_sdk/src/common/pico_sync/critical_section.c",
+        "$dir_third_party_pico_sdk/src/common/pico_sync/lock_core.c",
+        "$dir_third_party_pico_sdk/src/common/pico_sync/mutex.c",
+        "$dir_third_party_pico_sdk/src/common/pico_sync/sem.c",
+        "$dir_third_party_pico_sdk/src/common/pico_time/time.c",
+        "$dir_third_party_pico_sdk/src/common/pico_time/timeout_helper.c",
+        "$dir_third_party_pico_sdk/src/common/pico_util/datetime.c",
+        "$dir_third_party_pico_sdk/src/common/pico_util/pheap.c",
+        "$dir_third_party_pico_sdk/src/common/pico_util/queue.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_claim/claim.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_clocks/clocks.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_flash/flash.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_gpio/gpio.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_irq/irq.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_irq/irq_handler_chain.S",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_pll/pll.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_sync/sync.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_timer/timer.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_uart/uart.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_vreg/vreg.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_watchdog/watchdog.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/hardware_xosc/xosc.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_bit_ops/bit_ops_aeabi.S",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_bootrom/bootrom.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_divider/divider.S",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_double/double_aeabi.S",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_double/double_init_rom.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_double/double_math.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_double/double_v1_rom_shim.S",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_fix/rp2040_usb_device_enumeration/rp2040_usb_device_enumeration.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_float/float_init_rom.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_float/float_math.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_int64_ops/pico_int64_ops_aeabi.S",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_malloc/pico_malloc.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_mem_ops/mem_ops_aeabi.S",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_platform/platform.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_printf/printf.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_runtime/runtime.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_standard_link/binary_info.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_standard_link/crt0.S",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_standard_link/new_delete.cpp",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_stdio/stdio.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_stdio_usb/reset_interface.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_stdio_usb/stdio_usb.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_stdio_usb/stdio_usb_descriptors.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_stdlib/stdlib.c",
+        "$dir_third_party_pico_sdk/src/rp2_common/pico_unique_id/unique_id.c",
+      ]
+    }
+  }
+} else {
+  config("pico_config") {
+  }
+  group("pre_init") {
+  }
+}
diff --git a/targets/pico/init.cc b/targets/pico/init.cc
new file mode 100644
index 0000000..26926c3
--- /dev/null
+++ b/targets/pico/init.cc
@@ -0,0 +1,25 @@
+// Copyright 2020 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 "pico/stdlib.h"
+
+#include "pw_sys_io_pico/init.h"
+
+// Pico target specific init. For Pigweed, this calls pw_sys_io's init. User
+// projects may chose to provide something different if they need more pre-main
+// init functionality.
+extern "C" void pw_pico_Init() {
+  stdio_init_all();
+  pw_sys_io_pico_Init();
+}
diff --git a/targets/pico/pico_executable.gni b/targets/pico/pico_executable.gni
new file mode 100644
index 0000000..d823d0a
--- /dev/null
+++ b/targets/pico/pico_executable.gni
@@ -0,0 +1,30 @@
+# Copyright 2020 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("pico_executable") {
+  target("executable", target_name) {
+    forward_variables_from(invoker, "*")
+    if (!defined(deps)) {
+      deps = []
+    }
+    deps += [
+      "//targets/pico:pico_core_sources",
+      "//targets/pico:pre_init",
+    ]
+  }
+}
diff --git a/targets/pico/target_toolchains.gni b/targets/pico/target_toolchains.gni
new file mode 100644
index 0000000..a379781
--- /dev/null
+++ b/targets/pico/target_toolchains.gni
@@ -0,0 +1,107 @@
+# Copyright 2021 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("//targets/common_backends.gni")
+
+import("$dir_pw_protobuf_compiler/proto.gni")
+import("$dir_pw_third_party/nanopb/nanopb.gni")
+import("$dir_pw_toolchain/arm_gcc/toolchains.gni")
+
+_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 = "pico_executable"
+
+  pw_build_EXECUTABLE_TARGET_TYPE_FILE =
+      get_path_info("pico_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_pico_use_test_server) {
+  #   _test_runner_script =
+  #       "$dir_pico_build/py/pico_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_sys_io_BACKEND = dir_pw_sys_io_pico
+
+  # pw_rpc_system_server_BACKEND =
+  #     "$dir_pigweed/targets/pico:system_rpc_server"
+  # pw_pico_build_INIT_BACKEND = "//targets/pico:pre_init"
+
+  pw_build_LINK_DEPS += [
+    "$dir_pw_assert:impl",
+    "$dir_pw_log:impl",
+  ]
+
+  current_cpu = "arm"
+  current_os = ""
+}
+
+target_toolchain_pico = {
+  _excluded_members = [
+    "defaults",
+    "name",
+  ]
+
+  pico_debug = {
+    name = "pico_debug"
+    _toolchain_base = pw_toolchain_arm_gcc.cortex_m0plus_size_optimized
+    forward_variables_from(_toolchain_base, "*", _excluded_members)
+    final_binary_extension = ".elf"
+    defaults = {
+      forward_variables_from(_toolchain_base.defaults, "*")
+      forward_variables_from(_target_config, "*")
+
+      # Configure backend for pw_board_led
+      pw_board_led_BACKEND = "$dir_pw_board_led_pico"
+
+      # Configure backend for pw_spin_delay
+      pw_spin_delay_BACKEND = "$dir_pw_spin_delay_pico"
+    }
+  }
+
+  # # Toolchain for tests only.
+  # pico_debug_tests = {
+  #   name = "pico_debug_tests"
+  #   _toolchain_base = pw_target_toolchain_pico.debug
+  #   forward_variables_from(_toolchain_base, "*", _excluded_members)
+  #   defaults = {
+  #     forward_variables_from(_toolchain_base.defaults, "*")
+  #     forward_variables_from(toolchain_overrides, "*")
+
+  #     # Force tests to use basic log backend to avoid generating and loading its
+  #     # own tokenized database.
+  #     pw_log_BACKEND = dir_pw_log_basic
+  #   }
+  # }
+}
+
+toolchains_list = [
+  target_toolchain_pico.pico_debug,
+  # target_toolchain_pico.pico_debug_tests,
+]
diff --git a/targets/pico_base/BUILD.gn b/targets/pico_base/BUILD.gn
new file mode 100644
index 0000000..200c021
--- /dev/null
+++ b/targets/pico_base/BUILD.gn
@@ -0,0 +1,22 @@
+# Copyright 2021 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_toolchain/generate_toolchain.gni")
+import("target_toolchains.gni")
+
+generate_toolchains("toolchains") {
+  toolchains = toolchains_list
+}
diff --git a/targets/pico_base/target_toolchains.gni b/targets/pico_base/target_toolchains.gni
new file mode 100644
index 0000000..be33e06
--- /dev/null
+++ b/targets/pico_base/target_toolchains.gni
@@ -0,0 +1,62 @@
+# Copyright 2021 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("//targets/common_backends.gni")
+
+import("$dir_pw_toolchain/arm_gcc/toolchains.gni")
+
+target_toolchain_pico_base = {
+  _excluded_members = [
+    "defaults",
+    "name",
+  ]
+
+  pico_base_debug = {
+    name = "pico_base_debug"
+    _toolchain_base = pw_toolchain_arm_gcc.cortex_m0plus_size_optimized
+    forward_variables_from(_toolchain_base, "*", _excluded_members)
+    final_binary_extension = ".elf"
+    defaults = {
+      forward_variables_from(_toolchain_base.defaults, "*")
+
+      # # Configure backend for pw_board_led
+      # pw_board_led_BACKEND = "$dir_pw_board_led_pico"
+
+      # # Configure backend for pw_spin_delay
+      # pw_spin_delay_BACKEND = "$dir_pw_spin_delay_pico"
+    }
+  }
+
+  # # Toolchain for tests only.
+  # pico_base_debug_tests = {
+  #   name = "pico_base_debug_tests"
+  #   _toolchain_base = pw_target_toolchain_pico.debug
+  #   forward_variables_from(_toolchain_base, "*", _excluded_members)
+  #   defaults = {
+  #     forward_variables_from(_toolchain_base.defaults, "*")
+  #     forward_variables_from(toolchain_overrides, "*")
+
+  #     # Force tests to use basic log backend to avoid generating and loading its
+  #     # own tokenized database.
+  #     pw_log_BACKEND = dir_pw_log_basic
+  #   }
+  # }
+}
+
+toolchains_list = [
+  target_toolchain_pico_base.pico_base_debug,
+  # target_toolchain_pico.pico_base_debug_tests,
+]
diff --git a/third_party/elf2uf2/BUILD.gn b/third_party/elf2uf2/BUILD.gn
new file mode 100644
index 0000000..7c5de65
--- /dev/null
+++ b/third_party/elf2uf2/BUILD.gn
@@ -0,0 +1,30 @@
+# Copyright 2021 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/target_types.gni")
+
+if (dir_third_party_pico_sdk != "") {
+  config("elf2uf2_configs") {
+    include_dirs = [ "$dir_third_party_pico_sdk/src/common/boot_uf2/include" ]
+    cflags_cc = [ "-std=gnu++14" ]
+  }
+
+  pw_executable("elf2uf2") {
+    configs = [ ":elf2uf2_configs" ]
+    sources = [ "$dir_third_party_pico_sdk/tools/elf2uf2/main.cpp" ]
+    remove_configs = [ "$dir_pw_build:strict_warnings" ]
+  }
+}
diff --git a/third_party/pico-extras b/third_party/pico-extras
new file mode 160000
index 0000000..77eae28
--- /dev/null
+++ b/third_party/pico-extras
@@ -0,0 +1 @@
+Subproject commit 77eae2836638baf2f61b321eb61125da99bb4445
diff --git a/third_party/pico-sdk b/third_party/pico-sdk
new file mode 160000
index 0000000..2062372
--- /dev/null
+++ b/third_party/pico-sdk
@@ -0,0 +1 @@
+Subproject commit 2062372d203b372849d573f252cf7c6dc2800c0a
diff --git a/third_party/pigweed b/third_party/pigweed
new file mode 160000
index 0000000..64a4b16
--- /dev/null
+++ b/third_party/pigweed
@@ -0,0 +1 @@
+Subproject commit 64a4b16be46435f6aacbf29f5fb70c355ff90216
diff --git a/tools/BUILD.gn b/tools/BUILD.gn
new file mode 100644
index 0000000..b93a53a
--- /dev/null
+++ b/tools/BUILD.gn
@@ -0,0 +1,30 @@
+# Copyright 2021 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/python.gni")
+
+pw_python_package("tools") {
+  setup = [ "setup.py" ]
+  sources = [
+    "pigweed_experimental_tools/__init__.py",
+    "pigweed_experimental_tools/presubmit_checks.py",
+  ]
+  python_deps = [
+    "$dir_pw_cli/py",
+    "$dir_pw_presubmit/py",
+  ]
+  pylintrc = "$dir_pigweed/.pylintrc"
+}
diff --git a/tools/pigweed_experimental_tools/__init__.py b/tools/pigweed_experimental_tools/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/pigweed_experimental_tools/__init__.py
diff --git a/tools/pigweed_experimental_tools/presubmit_checks.py b/tools/pigweed_experimental_tools/presubmit_checks.py
new file mode 100755
index 0000000..93c2f94
--- /dev/null
+++ b/tools/pigweed_experimental_tools/presubmit_checks.py
@@ -0,0 +1,161 @@
+#!/usr/bin/env python3
+# Copyright 2021 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.
+"""Example presubmit check script."""
+
+import argparse
+import logging
+import os
+from pathlib import Path
+import re
+import sys
+
+try:
+    import pw_cli.log
+except ImportError:
+    print('ERROR: Activate the environment before running presubmits!',
+          file=sys.stderr)
+    sys.exit(2)
+
+import pw_presubmit
+from pw_presubmit import (
+    build,
+    cli,
+    cpp_checks,
+    format_code,
+    git_repo,
+    inclusive_language,
+    install_hook,
+    python_checks,
+    PresubmitContext,
+)
+
+_LOG = logging.getLogger(__name__)
+
+# Set up variables for key project paths.
+try:
+    PROJECT_ROOT = Path(os.environ['PIGWEED_EXPERIMENTAL_ROOT'])
+except KeyError:
+    print(
+        'ERROR: The presubmit checks must be run in the sample project\'s root'
+        ' directory',
+        file=sys.stderr)
+    sys.exit(2)
+
+PIGWEED_ROOT = PROJECT_ROOT / 'third_party' / 'pigweed'
+REPOS = (
+    PROJECT_ROOT,
+    PIGWEED_ROOT,
+    PROJECT_ROOT / 'third_party' / 'nanopb',
+)
+
+# Rerun the build if files with these extensions change.
+_BUILD_EXTENSIONS = frozenset(
+    ['.rst', '.gn', '.gni', *format_code.C_FORMAT.extensions])
+
+
+#
+# Presubmit checks
+#
+def default_build(ctx: PresubmitContext):
+    """Creates a default build."""
+    build.gn_gen(PROJECT_ROOT, ctx.output_dir)
+    build.ninja(ctx.output_dir)
+
+
+def check_for_git_changes(_: PresubmitContext):
+    """Checks that repositories have all changes commited."""
+    checked_repos = (PIGWEED_ROOT, *REPOS)
+    changes = [r for r in checked_repos if git_repo.has_uncommitted_changes(r)]
+    for repo in changes:
+        _LOG.error('There are uncommitted changes in the %s repo!', repo.name)
+    if changes:
+        _LOG.warning(
+            'Commit or stash pending changes before running the presubmit.')
+        raise pw_presubmit.PresubmitFailure
+
+
+# Avoid running some checks on certain paths.
+PATH_EXCLUSIONS = (
+    re.compile(r'^external/'),
+    re.compile(r'^third_party/'),
+    re.compile(r'^vendor/'),
+)
+
+#
+# Presubmit check programs
+#
+OTHER_CHECKS = (
+    build.gn_gen_check,
+    inclusive_language.inclusive_language.with_filter(exclude=PATH_EXCLUSIONS),
+)
+
+QUICK = (
+    # List some presubmit checks to run
+    default_build,
+    # Use the upstream formatting checks, with custom path filters applied.
+    format_code.presubmit_checks(exclude=PATH_EXCLUSIONS),
+)
+
+LINTFORMAT = (
+    # Use the upstream formatting checks, with custom path filters applied.
+    format_code.presubmit_checks(exclude=PATH_EXCLUSIONS),
+    python_checks.gn_python_lint.with_filter(exclude=PATH_EXCLUSIONS),
+    cpp_checks.pragma_once.with_filter(endswith='.h', exclude=PATH_EXCLUSIONS),
+)
+
+FULL = (
+    cpp_checks.pragma_once.with_filter(endswith='.h', exclude=PATH_EXCLUSIONS),
+    QUICK,  # Add all checks from the 'quick' program
+    # Use the upstream Python checks, with custom path filters applied.
+    python_checks.gn_python_check.with_filter(exclude=PATH_EXCLUSIONS),
+)
+
+PROGRAMS = pw_presubmit.Programs(
+    quick=QUICK,
+    full=FULL,
+    lintformat=LINTFORMAT,
+    other_checks=OTHER_CHECKS,
+)
+
+
+def run(install: bool, **presubmit_args) -> int:
+    """Process the --install argument then invoke pw_presubmit."""
+
+    # Install the presubmit Git pre-push hook, if requested.
+    if install:
+        install_hook.install_hook(__file__, 'pre-push', ['--base', 'HEAD~'],
+                                  git_repo.root())
+        return 0
+
+    return cli.run(root=PROJECT_ROOT, **presubmit_args)
+
+
+def main() -> int:
+    """Run the presubmit checks for this repository."""
+    parser = argparse.ArgumentParser(description=__doc__)
+    cli.add_arguments(parser, PROGRAMS, 'quick')
+
+    # Define an option for installing a Git pre-push hook for this script.
+    parser.add_argument(
+        '--install',
+        action='store_true',
+        help='Install the presubmit as a Git pre-push hook and exit.')
+
+    return run(**vars(parser.parse_args()))
+
+
+if __name__ == '__main__':
+    pw_cli.log.install(logging.INFO)
+    sys.exit(main())
diff --git a/tools/pigweed_experimental_tools/py.typed b/tools/pigweed_experimental_tools/py.typed
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/pigweed_experimental_tools/py.typed
diff --git a/tools/setup.py b/tools/setup.py
new file mode 100644
index 0000000..7f4c6ff
--- /dev/null
+++ b/tools/setup.py
@@ -0,0 +1,34 @@
+# Copyright 2021 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.
+"""Utilities for Sample Project development."""
+
+import setuptools  # type: ignore
+
+setuptools.setup(
+    name='pigweed_experimental_tools',
+    version='0.0.1',
+    author='Pigweed Authors',
+    author_email='pigweed-developers@googlegroups.com',
+    description=__doc__,
+    packages=setuptools.find_packages(),
+    package_data={'pigweed_experimental_tools': ['py.typed']},
+    zip_safe=False,
+    entry_points={
+        'console_scripts': [
+            'find-files = pigweed_experimental_tools.find_files:main',
+        ]
+    },
+    install_requires=[
+        'pw_cli',
+    ])