pub trait RegisterDescriptor {
const ADDRESS: u8;
type Value;
}
pub trait ReadableRegister: RegisterDescriptor {
fn from_raw(data: u32) -> Self::Value
where
Self::Value: From<u32>,
{
Self::Value::from(data)
}
}
pub trait WritableRegister: RegisterDescriptor {
fn to_raw(value: Self::Value) -> u32
where
Self::Value: Into<u32>,
{
value.into()
}
}
pub trait DpRegister: RegisterDescriptor {}
pub trait ApRegister: RegisterDescriptor {}
#[macro_export]
macro_rules! register_data_r {
($name:ident) => {
impl From<$name> for u32 {
fn from(value: $name) -> u32 {
value.0
}
}
impl From<u32> for $name {
fn from(value: u32) -> Self {
$name(value)
}
}
impl fmt::Display for $name {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "0x{:08X}", self.0)
}
}
};
}
#[macro_export]
macro_rules! register_data_rw {
($name:ident) => {
impl From<$name> for u32 {
fn from(value: $name) -> u32 {
value.0
}
}
impl From<u32> for $name {
fn from(value: u32) -> Self {
$name(value)
}
}
impl fmt::Display for $name {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "0x{:08X}", self.0)
}
}
};
}
#[macro_export]
macro_rules! register_data_w {
($name:ident) => {
impl From<$name> for u32 {
fn from(value: $name) -> u32 {
value.0
}
}
impl fmt::Display for $name {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "0x{:08X}", self.0)
}
}
};
}