From 97438c6e8344be2e4eb6a87548eaf934a6d71540 Mon Sep 17 00:00:00 2001 From: Anthony DiGirolamo Date: Tue, 2 Jul 2024 21:23:04 +0000 Subject: [PATCH] pw_digital_io_rp2040: Add pull up/down resistors to Rp2040Config MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ia9334962b601825c5502cba21256db1e7a1decb1 Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/219731 Reviewed-by: Keir Mierle Commit-Queue: Auto-Submit Lint: Lint 🤖 Pigweed-Auto-Submit: Anthony DiGirolamo Presubmit-Verified: CQ Bot Account --- pw_digital_io_rp2040/BUILD.gn | 8 ++------ pw_digital_io_rp2040/digital_io.cc | 2 ++ pw_digital_io_rp2040/docs.rst | 20 ++++++++++++++++++- .../public/pw_digital_io_rp2040/digital_io.h | 2 ++ 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/pw_digital_io_rp2040/BUILD.gn b/pw_digital_io_rp2040/BUILD.gn index 29cc90c46..93a284350 100644 --- a/pw_digital_io_rp2040/BUILD.gn +++ b/pw_digital_io_rp2040/BUILD.gn @@ -25,17 +25,13 @@ config("public_includes") { pw_source_set("pw_digital_io_rp2040") { public_configs = [ ":public_includes" ] public = [ "public/pw_digital_io_rp2040/digital_io.h" ] - deps = [ - "$PICO_ROOT/src/common/pico_base", - "$PICO_ROOT/src/common/pico_stdlib", - "$PICO_ROOT/src/rp2_common/hardware_gpio", - ] public_deps = [ + "$PICO_ROOT/src/common/pico_base", + "$PICO_ROOT/src/rp2_common/hardware_gpio", "$dir_pw_digital_io", "$dir_pw_status", ] sources = [ "digital_io.cc" ] - remove_configs = [ "$dir_pw_build:strict_warnings" ] } pw_test("digital_io_test") { diff --git a/pw_digital_io_rp2040/digital_io.cc b/pw_digital_io_rp2040/digital_io.cc index 695f4cf84..1db6321ef 100644 --- a/pw_digital_io_rp2040/digital_io.cc +++ b/pw_digital_io_rp2040/digital_io.cc @@ -30,6 +30,7 @@ Status Rp2040DigitalIn::DoEnable(bool enable) { gpio_init(config_.pin); gpio_set_dir(config_.pin, GPIO_IN); + gpio_set_pulls(config_.pin, config_.enable_pull_up, config_.enable_pull_down); return OkStatus(); } @@ -54,6 +55,7 @@ Status Rp2040DigitalInOut::DoEnable(bool enable) { gpio_init(config_.pin); gpio_set_dir(config_.pin, GPIO_OUT); + gpio_set_pulls(config_.pin, config_.enable_pull_up, config_.enable_pull_down); return OkStatus(); } diff --git a/pw_digital_io_rp2040/docs.rst b/pw_digital_io_rp2040/docs.rst index aca141e35..b171bfcf5 100644 --- a/pw_digital_io_rp2040/docs.rst +++ b/pw_digital_io_rp2040/docs.rst @@ -37,6 +37,11 @@ Example code to use GPIO pins: .pin = 16, .polarity = Polarity::kActiveHigh, }; + constexpr Rp2040Config button_connected_to_ground_config{ + .pin = 12, + .polarity = Polarity::kActiveLow, + .enable_pull_up = true, + }; // Config output pin: Rp2040DigitalInOut out(output_pin_config); @@ -46,11 +51,24 @@ Example code to use GPIO pins: // This pulls pin to ground since the polarity is kActiveLow. out.SetState(State::kActive); - // Config input pin: + // Config input pins: Rp2040DigitalIn in(input_pin_config); in.Enable(); + Rp2040DigitalIn button(button_connected_to_ground_config); + button.Enable(); + // Get the pin state. Since the polarity is kActiveHigh this will return // State::kActive if the pin is high or and State::kInactive if the pin is // low (grounded). State pin_state = in.GetState(); + + auto button_result = button.GetState(); + if (button_result.ok()) { + if (button_result.value() == State::kActive) { + PW_LOG_INFO("Button is pressed."); + } + if (button_result.value() == State::kInactive) { + PW_LOG_INFO("Button is released."); + } + } diff --git a/pw_digital_io_rp2040/public/pw_digital_io_rp2040/digital_io.h b/pw_digital_io_rp2040/public/pw_digital_io_rp2040/digital_io.h index 3d4c09e0f..1439980e8 100644 --- a/pw_digital_io_rp2040/public/pw_digital_io_rp2040/digital_io.h +++ b/pw_digital_io_rp2040/public/pw_digital_io_rp2040/digital_io.h @@ -24,6 +24,8 @@ namespace pw::digital_io { struct Rp2040Config { uint16_t pin; Polarity polarity; + bool enable_pull_up = false; + bool enable_pull_down = false; bool operator==(const Rp2040Config& rhs) const { return polarity == rhs.polarity && pin == rhs.pin;