use std::sync::Arc;
use std::thread;
use std::time::Duration;
use crate::architecture::arm::{
ArmError, Pins,
communication_interface::DapProbe,
dp::DpAddress,
sequences::{ArmDebugSequence, DefaultArmSequence},
};
#[derive(Debug)]
pub struct InfineonTle;
impl InfineonTle {
pub fn create() -> Arc<dyn ArmDebugSequence> {
Arc::new(Self)
}
fn enter_debug_mode(&self, interface: &mut dyn DapProbe) -> Result<(), ArmError> {
let mut select = Pins(0);
select.set_nreset(true);
select.set_swdio_tms(true);
select.set_swclk_tck(true);
let select = select.0 as u32;
let mut reset_asserted = Pins(0);
reset_asserted.set_swdio_tms(true);
reset_asserted.set_swclk_tck(true);
let reset_asserted = reset_asserted.0 as u32;
let mut reset_released = Pins(0);
reset_released.set_swdio_tms(true);
reset_released.set_swclk_tck(true);
reset_released.set_nreset(true);
let reset_released = reset_released.0 as u32;
tracing::debug!("Infineon TLE: resetting with TMS/SWDCLK high to enter debug mode");
let _ = interface.swj_pins(reset_asserted, select, 0)?;
thread::sleep(Duration::from_millis(10));
let _ = interface.swj_pins(reset_released, select, 0)?;
thread::sleep(Duration::from_millis(10));
Ok(())
}
}
impl ArmDebugSequence for InfineonTle {
fn debug_port_setup(
&self,
interface: &mut dyn DapProbe,
dp: DpAddress,
) -> Result<(), ArmError> {
self.enter_debug_mode(interface)?;
DefaultArmSequence(()).debug_port_setup(interface, dp)
}
fn reset_hardware_assert(&self, interface: &mut dyn DapProbe) -> Result<(), ArmError> {
let mut select = Pins(0);
select.set_nreset(true);
select.set_swdio_tms(true);
select.set_swclk_tck(true);
let mut output = Pins(0);
output.set_swdio_tms(true);
output.set_swclk_tck(true);
let _ = interface.swj_pins(output.0 as u32, select.0 as u32, 0)?;
Ok(())
}
}