aboutsummaryrefslogtreecommitdiff
path: root/pw_sys_io_rp2040
diff options
context:
space:
mode:
Diffstat (limited to 'pw_sys_io_rp2040')
-rw-r--r--pw_sys_io_rp2040/BUILD.bazel41
-rw-r--r--pw_sys_io_rp2040/BUILD.gn38
-rw-r--r--pw_sys_io_rp2040/OWNERS1
-rw-r--r--pw_sys_io_rp2040/docs.rst8
-rw-r--r--pw_sys_io_rp2040/sys_io.cc89
5 files changed, 177 insertions, 0 deletions
diff --git a/pw_sys_io_rp2040/BUILD.bazel b/pw_sys_io_rp2040/BUILD.bazel
new file mode 100644
index 000000000..9017aa7fd
--- /dev/null
+++ b/pw_sys_io_rp2040/BUILD.bazel
@@ -0,0 +1,41 @@
+# Copyright 2022 The Pigweed Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+load(
+ "//pw_build:pigweed.bzl",
+ "pw_cc_library",
+)
+
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"])
+
+constraint_value(
+ name = "backend",
+ constraint_setting = "//pw_sys_io:backend_constraint_setting",
+)
+
+pw_cc_library(
+ name = "pw_sys_io_rp2040",
+ srcs = [
+ "sys_io.cc",
+ ],
+ # TODO: b/261603269 - Get this to build.
+ tags = ["manual"],
+ deps = [
+ "//pw_status",
+ "//pw_sys_io:default_putget_bytes",
+ "//pw_sys_io:facade",
+ ],
+)
diff --git a/pw_sys_io_rp2040/BUILD.gn b/pw_sys_io_rp2040/BUILD.gn
new file mode 100644
index 000000000..f92eb4ac1
--- /dev/null
+++ b/pw_sys_io_rp2040/BUILD.gn
@@ -0,0 +1,38 @@
+# Copyright 2022 The Pigweed Authors
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may not
+# use this file except in compliance with the License. You may obtain a copy of
+# the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations under
+# the License.
+
+import("//build_overrides/pigweed.gni")
+
+import("$dir_pigweed/build_overrides/pi_pico.gni")
+import("$dir_pw_build/target_types.gni")
+import("$dir_pw_docgen/docs.gni")
+import("$dir_pw_unit_test/test.gni")
+
+pw_source_set("pw_sys_io_rp2040") {
+ sources = [ "sys_io.cc" ]
+ deps = [
+ "$PICO_ROOT/src/common/pico_base",
+ "$PICO_ROOT/src/common/pico_stdlib",
+ "$dir_pw_status",
+ "$dir_pw_sys_io:default_putget_bytes",
+ "$dir_pw_sys_io:facade",
+ ]
+}
+
+pw_doc_group("docs") {
+ sources = [ "docs.rst" ]
+}
+
+pw_test_group("tests") {
+}
diff --git a/pw_sys_io_rp2040/OWNERS b/pw_sys_io_rp2040/OWNERS
new file mode 100644
index 000000000..307b1deb5
--- /dev/null
+++ b/pw_sys_io_rp2040/OWNERS
@@ -0,0 +1 @@
+amontanez@google.com
diff --git a/pw_sys_io_rp2040/docs.rst b/pw_sys_io_rp2040/docs.rst
new file mode 100644
index 000000000..c135584ab
--- /dev/null
+++ b/pw_sys_io_rp2040/docs.rst
@@ -0,0 +1,8 @@
+.. _module-pw_sys_io_rp2040:
+
+----------------
+pw_sys_io_rp2040
+----------------
+
+``pw_sys_io_rp2040`` implements the ``pw_sys_io`` facade using the Pico's STDIO
+library.
diff --git a/pw_sys_io_rp2040/sys_io.cc b/pw_sys_io_rp2040/sys_io.cc
new file mode 100644
index 000000000..da0ecf652
--- /dev/null
+++ b/pw_sys_io_rp2040/sys_io.cc
@@ -0,0 +1,89 @@
+// Copyright 2022 The Pigweed Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+#include "pw_sys_io/sys_io.h"
+
+#include <cinttypes>
+
+#include "pico/stdlib.h"
+#include "pw_status/status.h"
+
+namespace {
+
+void LazyInitSysIo() {
+ static bool initialized = false;
+ if (!initialized) {
+ stdio_init_all();
+ initialized = true;
+ }
+}
+
+// Spin until host connects.
+void WaitForConnect() {
+ while (!stdio_usb_connected()) {
+ sleep_ms(50);
+ }
+}
+
+} // namespace
+
+// This whole implementation is very inefficient because it only reads / writes
+// 1 byte at a time. It also does lazy initialization checks with every byte.
+namespace pw::sys_io {
+
+Status ReadByte(std::byte* dest) {
+ LazyInitSysIo();
+ WaitForConnect();
+ int c = PICO_ERROR_TIMEOUT;
+ while (c == PICO_ERROR_TIMEOUT) {
+ c = getchar_timeout_us(0);
+ }
+ *dest = static_cast<std::byte>(c);
+ return OkStatus();
+}
+
+Status TryReadByte(std::byte* dest) {
+ LazyInitSysIo();
+ int c = getchar_timeout_us(0);
+ if (c == PICO_ERROR_TIMEOUT) {
+ return Status::DeadlineExceeded();
+ }
+ *dest = static_cast<std::byte>(c);
+ return OkStatus();
+}
+
+Status WriteByte(std::byte b) {
+ // The return value of this is just the character sent.
+ LazyInitSysIo();
+ putchar_raw(static_cast<int>(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(as_bytes(span(s)));
+ if (!result.ok()) {
+ return result;
+ }
+ chars_written += result.size();
+
+ // Write trailing newline.
+ result = WriteBytes(as_bytes(span("\r\n", 2)));
+ chars_written += result.size();
+
+ return StatusWithSize(OkStatus(), chars_written);
+}
+
+} // namespace pw::sys_io