pw_digital_io_rp2040: Add pull up/down resistors to Rp2040Config

Change-Id: Ia9334962b601825c5502cba21256db1e7a1decb1
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/219731
Reviewed-by: Keir Mierle <keir@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed-service-accounts.iam.gserviceaccount.com>
Lint: Lint 🤖 <android-build-ayeaye@system.gserviceaccount.com>
Pigweed-Auto-Submit: Anthony DiGirolamo <tonymd@google.com>
Presubmit-Verified: CQ Bot Account <pigweed-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Anthony DiGirolamo 2024-07-02 21:23:04 +00:00 committed by CQ Bot Account
parent bfaf596d3e
commit 97438c6e83
4 changed files with 25 additions and 7 deletions

View File

@ -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") {

View File

@ -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();
}

View File

@ -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.");
}
}

View File

@ -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;