xref: /aosp_15_r20/external/pigweed/pw_digital_io_rp2040/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_digital_io_rp2040:
2*61c4878aSAndroid Build Coastguard Worker
3*61c4878aSAndroid Build Coastguard Worker--------------------
4*61c4878aSAndroid Build Coastguard Workerpw_digital_io_rp2040
5*61c4878aSAndroid Build Coastguard Worker--------------------
6*61c4878aSAndroid Build Coastguard Worker``pw_digital_io_rp2040`` implements the :ref:`module-pw_digital_io` interface using
7*61c4878aSAndroid Build Coastguard Workerthe `Raspberry Pi Pico SDK <https://github.com/raspberrypi/pico-sdk/>`_.
8*61c4878aSAndroid Build Coastguard Worker
9*61c4878aSAndroid Build Coastguard WorkerSetup
10*61c4878aSAndroid Build Coastguard Worker=====
11*61c4878aSAndroid Build Coastguard WorkerUse of this module requires setting up the Pico SDK for use with Pigweed. Follow
12*61c4878aSAndroid Build Coastguard Workerthe steps in :ref:`target-rp2040` to get setup.
13*61c4878aSAndroid Build Coastguard Worker
14*61c4878aSAndroid Build Coastguard WorkerExamples
15*61c4878aSAndroid Build Coastguard Worker========
16*61c4878aSAndroid Build Coastguard WorkerUse ``pw::digital_io::Rp2040DigitalIn`` and
17*61c4878aSAndroid Build Coastguard Worker``pw::digital_io::Rp2040DigitalInOut`` classes to control GPIO pins.
18*61c4878aSAndroid Build Coastguard Worker
19*61c4878aSAndroid Build Coastguard WorkerExample code to use GPIO pins:
20*61c4878aSAndroid Build Coastguard Worker
21*61c4878aSAndroid Build Coastguard Worker.. code-block:: cpp
22*61c4878aSAndroid Build Coastguard Worker
23*61c4878aSAndroid Build Coastguard Worker   #include "pw_digital_io/polarity.h"
24*61c4878aSAndroid Build Coastguard Worker   #include "pw_digital_io_rp2040/digital_io.h"
25*61c4878aSAndroid Build Coastguard Worker
26*61c4878aSAndroid Build Coastguard Worker   using pw::digital_io::Polarity;
27*61c4878aSAndroid Build Coastguard Worker   using pw::digital_io::Rp2040Config;
28*61c4878aSAndroid Build Coastguard Worker   using pw::digital_io::Rp2040DigitalIn;
29*61c4878aSAndroid Build Coastguard Worker   using pw::digital_io::Rp2040DigitalInOut;
30*61c4878aSAndroid Build Coastguard Worker   using pw::digital_io::State;
31*61c4878aSAndroid Build Coastguard Worker
32*61c4878aSAndroid Build Coastguard Worker   constexpr Rp2040Config output_pin_config{
33*61c4878aSAndroid Build Coastguard Worker       .pin = 15,
34*61c4878aSAndroid Build Coastguard Worker       .polarity = Polarity::kActiveLow,
35*61c4878aSAndroid Build Coastguard Worker   };
36*61c4878aSAndroid Build Coastguard Worker   constexpr Rp2040Config input_pin_config{
37*61c4878aSAndroid Build Coastguard Worker       .pin = 16,
38*61c4878aSAndroid Build Coastguard Worker       .polarity = Polarity::kActiveHigh,
39*61c4878aSAndroid Build Coastguard Worker   };
40*61c4878aSAndroid Build Coastguard Worker   constexpr Rp2040Config button_connected_to_ground_config{
41*61c4878aSAndroid Build Coastguard Worker       .pin = 12,
42*61c4878aSAndroid Build Coastguard Worker       .polarity = Polarity::kActiveLow,
43*61c4878aSAndroid Build Coastguard Worker       .enable_pull_up = true,
44*61c4878aSAndroid Build Coastguard Worker   };
45*61c4878aSAndroid Build Coastguard Worker
46*61c4878aSAndroid Build Coastguard Worker   // Config output pin:
47*61c4878aSAndroid Build Coastguard Worker   Rp2040DigitalInOut out(output_pin_config);
48*61c4878aSAndroid Build Coastguard Worker   out.Enable();
49*61c4878aSAndroid Build Coastguard Worker
50*61c4878aSAndroid Build Coastguard Worker   // Set the output pin active.
51*61c4878aSAndroid Build Coastguard Worker   // This pulls pin to ground since the polarity is kActiveLow.
52*61c4878aSAndroid Build Coastguard Worker   out.SetState(State::kActive);
53*61c4878aSAndroid Build Coastguard Worker
54*61c4878aSAndroid Build Coastguard Worker   // Config input pins:
55*61c4878aSAndroid Build Coastguard Worker   Rp2040DigitalIn in(input_pin_config);
56*61c4878aSAndroid Build Coastguard Worker   in.Enable();
57*61c4878aSAndroid Build Coastguard Worker
58*61c4878aSAndroid Build Coastguard Worker   Rp2040DigitalIn button(button_connected_to_ground_config);
59*61c4878aSAndroid Build Coastguard Worker   button.Enable();
60*61c4878aSAndroid Build Coastguard Worker
61*61c4878aSAndroid Build Coastguard Worker   // Get the pin state. Since the polarity is kActiveHigh this will return
62*61c4878aSAndroid Build Coastguard Worker   // State::kActive if the pin is high or and State::kInactive if the pin is
63*61c4878aSAndroid Build Coastguard Worker   // low (grounded).
64*61c4878aSAndroid Build Coastguard Worker   State pin_state = in.GetState();
65*61c4878aSAndroid Build Coastguard Worker
66*61c4878aSAndroid Build Coastguard Worker   auto button_result = button.GetState();
67*61c4878aSAndroid Build Coastguard Worker   if (button_result.ok()) {
68*61c4878aSAndroid Build Coastguard Worker     if (button_result.value() == State::kActive) {
69*61c4878aSAndroid Build Coastguard Worker       PW_LOG_INFO("Button is pressed.");
70*61c4878aSAndroid Build Coastguard Worker     }
71*61c4878aSAndroid Build Coastguard Worker     if (button_result.value() == State::kInactive) {
72*61c4878aSAndroid Build Coastguard Worker       PW_LOG_INFO("Button is released.");
73*61c4878aSAndroid Build Coastguard Worker     }
74*61c4878aSAndroid Build Coastguard Worker   }
75