use crate::architecture::arm::communication_interface::RegisterParseError;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ApClass {
#[default]
Undefined = 0b0000,
ComAp = 0b0001,
MemAp = 0b1000,
}
impl ApClass {
pub fn from_u8(value: u8) -> Option<Self> {
match value {
0b0000 => Some(ApClass::Undefined),
0b0001 => Some(ApClass::ComAp),
0b1000 => Some(ApClass::MemAp),
_ => None,
}
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum ApType {
#[default]
JtagComAp = 0x0,
AmbaAhb3 = 0x1,
AmbaApb2Apb3 = 0x2,
AmbaAxi3Axi4 = 0x4,
AmbaAhb5 = 0x5,
AmbaApb4Apb5 = 0x6,
AmbaAxi5 = 0x7,
AmbaAhb5Hprot = 0x8,
}
impl ApType {
pub fn from_u8(value: u8) -> Option<Self> {
match value {
0x0 => Some(ApType::JtagComAp),
0x1 => Some(ApType::AmbaAhb3),
0x2 => Some(ApType::AmbaApb2Apb3),
0x4 => Some(ApType::AmbaAxi3Axi4),
0x5 => Some(ApType::AmbaAhb5),
0x6 => Some(ApType::AmbaApb4Apb5),
0x7 => Some(ApType::AmbaAxi5),
0x8 => Some(ApType::AmbaAhb5Hprot),
_ => None,
}
}
}
define_ap_register!(
name: IDR,
address: 0x0FC,
fields: [
REVISION: u8,
DESIGNER: jep106::JEP106Code,
CLASS: ApClass,
#[doc(hidden)]
_RES0: u8,
VARIANT: u8,
TYPE: ApType,
],
from: value => Ok(IDR {
REVISION: ((value >> 28) & 0x0F) as u8,
DESIGNER: {
let designer = ((value >> 17) & 0x7FF) as u16;
let cc = (designer >> 7) as u8;
let id = (designer & 0x7f) as u8;
jep106::JEP106Code::new(cc, id)
},
CLASS: ApClass::from_u8(((value >> 13) & 0x0F) as u8).ok_or_else(|| RegisterParseError::new("IDR", value))?,
_RES0: 0,
VARIANT: ((value >> 4) & 0x0F) as u8,
TYPE: ApType::from_u8((value & 0x0F) as u8).ok_or_else(|| RegisterParseError::new("IDR", value))?
}),
to: value => (u32::from(value.REVISION) << 28)
| (((u32::from(value.DESIGNER.cc) << 7) | u32::from(value.DESIGNER.id)) << 17)
| ((value.CLASS as u32) << 13)
| (u32::from(value.VARIANT) << 4)
| (value.TYPE as u32)
);