diff options
Diffstat (limited to 'pw_sys_io_rp2040')
-rw-r--r-- | pw_sys_io_rp2040/BUILD.bazel | 41 | ||||
-rw-r--r-- | pw_sys_io_rp2040/BUILD.gn | 38 | ||||
-rw-r--r-- | pw_sys_io_rp2040/OWNERS | 1 | ||||
-rw-r--r-- | pw_sys_io_rp2040/docs.rst | 8 | ||||
-rw-r--r-- | pw_sys_io_rp2040/sys_io.cc | 89 |
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 |