opentitanlib/test_utils/
gpio.rs1use anyhow::Result;
6use std::time::Duration;
7
8use crate::io::uart::Uart;
9use crate::test_utils::e2e_command::TestCommand;
10use crate::test_utils::rpc::{ConsoleRecv, ConsoleSend};
11use crate::test_utils::status::Status;
12
13include!(env!("gpio"));
15
16impl GpioSet {
17 fn execute(&self, uart: &dyn Uart) -> Result<()> {
18 TestCommand::GpioSet.send(uart)?;
19 self.send(uart)?;
20 Status::recv(uart, Duration::from_secs(300), false)?;
21 Ok(())
22 }
23
24 pub fn write(uart: &dyn Uart, pin: u32, state: bool) -> Result<()> {
25 let payload = GpioSet {
26 action: GpioAction::Write,
27 pin_mask: pin,
28 state: state.into(),
29 };
30 payload.execute(uart)
31 }
32 pub fn set_enabled(uart: &dyn Uart, pin: u32, state: bool) -> Result<()> {
33 let payload = GpioSet {
34 action: GpioAction::SetEnabled,
35 pin_mask: pin,
36 state: state.into(),
37 };
38 payload.execute(uart)
39 }
40
41 pub fn write_all(uart: &dyn Uart, state: u32) -> Result<()> {
42 let payload = GpioSet {
43 action: GpioAction::WriteAll,
44 pin_mask: 0,
45 state,
46 };
47 payload.execute(uart)
48 }
49 pub fn set_enabled_all(uart: &dyn Uart, state: u32) -> Result<()> {
50 let payload = GpioSet {
51 action: GpioAction::SetEnabledAll,
52 pin_mask: 0,
53 state,
54 };
55 payload.execute(uart)
56 }
57
58 pub fn write_masked(uart: &dyn Uart, mask: u32, state: u32) -> Result<()> {
59 let payload = GpioSet {
60 action: GpioAction::WriteMasked,
61 pin_mask: mask,
62 state,
63 };
64 payload.execute(uart)
65 }
66 pub fn set_enabled_masked(uart: &dyn Uart, mask: u32, state: u32) -> Result<()> {
67 let payload = GpioSet {
68 action: GpioAction::SetEnabledMasked,
69 pin_mask: mask,
70 state,
71 };
72 payload.execute(uart)
73 }
74 pub fn set_input_noise_filter(uart: &dyn Uart, mask: u32, state: u32) -> Result<()> {
75 let payload = GpioSet {
76 action: GpioAction::SetInputNoiseFilter,
77 pin_mask: mask,
78 state,
79 };
80 payload.execute(uart)
81 }
82 pub fn irq_restore_all(uart: &dyn Uart, state: u32) -> Result<()> {
83 let payload = GpioSet {
84 action: GpioAction::IrqRestoreAll,
85 pin_mask: 0,
86 state,
87 };
88 payload.execute(uart)
89 }
90 pub fn irq_disable_all(uart: &dyn Uart, state: u32) -> Result<()> {
91 let payload = GpioSet {
92 action: GpioAction::IrqDisableAll,
93 pin_mask: 0,
94 state,
95 };
96 payload.execute(uart)
97 }
98 pub fn irq_acknowledge_all(uart: &dyn Uart) -> Result<()> {
99 let payload = GpioSet {
100 action: GpioAction::IrqAcknowledgeAll,
101 pin_mask: 0,
102 state: 0,
103 };
104 payload.execute(uart)
105 }
106 pub fn irq_set_trigger(uart: &dyn Uart, state: u32, trigger: String) -> Result<()> {
107 match trigger.as_str() {
108 "rising" => {
109 let payload = GpioSet {
110 action: GpioAction::IrqSetTriggerRisingEdge,
111 pin_mask: 0,
112 state,
113 };
114 payload.execute(uart)
115 }
116 "falling" => {
117 let payload = GpioSet {
118 action: GpioAction::IrqSetTriggerFallingEdge,
119 pin_mask: 0,
120 state,
121 };
122 payload.execute(uart)
123 }
124 "high" => {
125 let payload = GpioSet {
126 action: GpioAction::IrqSetTriggerHigh,
127 pin_mask: 0,
128 state,
129 };
130 payload.execute(uart)
131 }
132 "low" => {
133 let payload = GpioSet {
134 action: GpioAction::IrqSetTriggerLow,
135 pin_mask: 0,
136 state,
137 };
138 payload.execute(uart)
139 }
140 _ => {
141 log::error!("unsupport trigger: {:?}", trigger);
142 Ok(())
143 }
144 }
145 }
146}
147
148impl GpioGet {
149 pub fn read_all(uart: &dyn Uart) -> Result<u32> {
150 TestCommand::GpioGet.send(uart)?;
151 let data = GpioGet::recv(uart, Duration::from_secs(300), false)?;
152 Ok(data.state)
153 }
154}