opentitanlib/test_utils/
gpio.rs

1// Copyright lowRISC contributors (OpenTitan project).
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4
5use 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
13// Bring in the auto-generated sources.
14include!(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}