blob: 03adf98dd560c39d4fc56aa1135b67b0fff79a7a [file] [log] [blame]
//! GPIO instantiation.
use core::ops::{Index, IndexMut};
use kernel::common::StaticRef;
pub use lowrisc::gpio::GpioPin;
use lowrisc::gpio::{pins, GpioRegisters};
use lowrisc::padctrl::PadCtrlRegisters;
const PADCTRL_BASE: StaticRef<PadCtrlRegisters> =
unsafe { StaticRef::new(0x4046_0000 as *const PadCtrlRegisters) };
const GPIO0_BASE: StaticRef<GpioRegisters> =
unsafe { StaticRef::new(0x4004_0000 as *const GpioRegisters) };
pub struct Port<'a> {
pins: [GpioPin<'a>; 32],
}
impl<'a> Index<usize> for Port<'a> {
type Output = GpioPin<'a>;
fn index(&self, index: usize) -> &GpioPin<'a> {
&self.pins[index]
}
}
impl<'a> IndexMut<usize> for Port<'a> {
fn index_mut(&mut self, index: usize) -> &mut GpioPin<'a> {
&mut self.pins[index]
}
}
pub static mut PORT: Port = Port {
pins: [
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin0),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin1),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin2),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin3),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin4),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin5),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin6),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin7),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin8),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin9),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin10),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin11),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin12),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin13),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin14),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin15),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin16),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin17),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin18),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin19),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin20),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin21),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin22),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin23),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin24),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin25),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin26),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin27),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin28),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin29),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin30),
GpioPin::new(GPIO0_BASE, PADCTRL_BASE, pins::pin31),
],
};