use accessor::array;
use accessor::Mapper;
pub use capability::Capability;
pub use operational::{Operational, PortRegisterSet};
pub use runtime::InterrupterRegisterSet;
pub use runtime::Runtime;
pub mod capability;
pub mod doorbell;
pub mod operational;
pub mod runtime;
#[derive(Debug)]
pub struct Registers<M>
where
M: Mapper + Clone,
{
pub capability: Capability<M>,
pub doorbell: array::ReadWrite<doorbell::Register, M>,
pub operational: Operational<M>,
pub port_register_set: array::ReadWrite<PortRegisterSet, M>,
pub runtime: Runtime<M>,
pub interrupter_register_set: InterrupterRegisterSet<M>,
}
impl<M> Registers<M>
where
M: Mapper + Clone,
{
pub unsafe fn new(mmio_base: usize, mapper: M) -> Self {
let capability = Capability::new(mmio_base, &mapper);
let doorbell = doorbell::Register::new(mmio_base, &capability, mapper.clone());
let operational =
Operational::new(mmio_base, capability.caplength.read_volatile(), &mapper);
let port_register_set = PortRegisterSet::new(mmio_base, &capability, mapper.clone());
let runtime = Runtime::new(mmio_base, capability.rtsoff.read_volatile(), mapper.clone());
let interrupter_register_set =
InterrupterRegisterSet::new(mmio_base, capability.rtsoff.read_volatile(), mapper);
Self {
capability,
doorbell,
operational,
port_register_set,
runtime,
interrupter_register_set,
}
}
}