use jep106::JEP106Code;
use probe_rs_target::Chip;
use crate::{
architecture::arm::{ArmChipInfo, ArmDebugInterface, FullyQualifiedApAddress},
config::DebugSequence,
config::Registry,
error::Error,
vendor::Vendor,
};
#[derive(docsplay::Display)]
pub struct Holtek;
const HOLTEK: JEP106Code = JEP106Code { id: 0x76, cc: 0x6 };
impl Vendor for Holtek {
fn try_create_debug_sequence(&self, _chip: &Chip) -> Option<DebugSequence> {
None
}
fn try_detect_arm_chip(
&self,
_registry: &Registry,
interface: &mut dyn ArmDebugInterface,
chip_info: ArmChipInfo,
) -> Result<Option<String>, Error> {
if chip_info.manufacturer != HOLTEK {
return Ok(None);
}
let access_port = &FullyQualifiedApAddress::v1_with_default_dp(0);
let mut memory_interface = interface.memory_interface(access_port)?;
let chip_id = memory_interface.as_mut().read_word_32(0x4004_8000)?;
tracing::debug!("Holtek: chip id register = {:#010x}", chip_id);
match chip_id {
0x52342 | 0x52341 => Ok(Some("HT32F52342".to_string())),
0x52352 | 0x52351 => Ok(Some("HT32F52352".to_string())),
_ => Ok(None),
}
}
}