|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | use anyhow::Result; | 
|  | use serde::{Deserialize, Serialize}; | 
|  | use structopt::clap::arg_enum; | 
|  | use thiserror::Error; | 
|  |  | 
|  | use crate::impl_serializable_error; | 
|  |  | 
|  | /// Errors related to the GPIO interface. | 
|  | #[derive(Debug, Error, Serialize, Deserialize)] | 
|  | pub enum GpioError { | 
|  | #[error("Invalid pin name {0}")] | 
|  | InvalidPinName(String), | 
|  | #[error("Invalid pin number {0}")] | 
|  | InvalidPinNumber(u8), | 
|  | /// The current mode of the pin (input) does not support the requested operation (set | 
|  | /// level). | 
|  | #[error("Invalid mode for pin {0}")] | 
|  | InvalidPinMode(u8), | 
|  | /// The hardware does not support the requested mode (open drain, pull down input, etc.) | 
|  | #[error("Unsupported mode {0} requested")] | 
|  | UnsupportedPinMode(PinMode), | 
|  | /// The hardware does not support the requested mode (open drain, pull down input, etc.) | 
|  | #[error("Unsupported pull mode {0} requested")] | 
|  | UnsupportedPullMode(PullMode), | 
|  | #[error("Conflicting pin configurations for pin {0}: host:{1}, target:{2}")] | 
|  | PinModeConflict(String, String, String), | 
|  | #[error("Conflicting pin logic values for pin {0}: host:{1}, target:{2}")] | 
|  | PinValueConflict(String, String, String), | 
|  | #[error("Undefined pin logic value for pin {0}")] | 
|  | PinValueUndefined(String), | 
|  | #[error("Generic error: {0}")] | 
|  | Generic(String), | 
|  | } | 
|  | impl_serializable_error!(GpioError); | 
|  |  | 
|  | arg_enum! { | 
|  | /// Mode of I/O pins. | 
|  | #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] | 
|  | pub enum PinMode { | 
|  | Input, | 
|  | PushPull, | 
|  | OpenDrain, | 
|  | } | 
|  | } | 
|  |  | 
|  | arg_enum! { | 
|  | /// Mode of weak pull (relevant in Input and OpenDrain modes). | 
|  | #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq)] | 
|  | pub enum PullMode { | 
|  | None, | 
|  | PullUp, | 
|  | PullDown, | 
|  | } | 
|  | } | 
|  |  | 
|  | /// A trait which represents a single GPIO pin. | 
|  | pub trait GpioPin { | 
|  | /// Reads the value of the the GPIO pin. | 
|  | fn read(&self) -> Result<bool>; | 
|  |  | 
|  | /// Sets the value of the GPIO pin to `value`. | 
|  | fn write(&self, value: bool) -> Result<()>; | 
|  |  | 
|  | /// Sets the mode of the GPIO pin as input, output, or open drain I/O. | 
|  | fn set_mode(&self, mode: PinMode) -> Result<()>; | 
|  |  | 
|  | /// Sets the weak pull resistors of the GPIO pin. | 
|  | fn set_pull_mode(&self, mode: PullMode) -> Result<()>; | 
|  | } |