blob: 8ec580d830acbbb5ba50e036615a5c7b2b86d7ab [file]
//! Arm SWO CoreSight Component
//!
//! # Description
//! This module provides access and control of the SWO CoreSight component block.
use super::super::memory::romtable::CoresightComponent;
use crate::Error;
use crate::architecture::arm::ArmDebugInterface;
const REGISTER_OFFSET_SWO_CODR: u32 = 0x10;
const REGISTER_OFFSET_SWO_SPPR: u32 = 0xF0;
const REGISTER_OFFSET_ACCESS: u32 = 0xFB0;
/// SWO unit
///
/// Serial Wire Output unit.
pub struct Swo<'a> {
component: &'a CoresightComponent,
interface: &'a mut dyn ArmDebugInterface,
}
impl<'a> Swo<'a> {
/// Construct a new SWO component.
pub fn new(
interface: &'a mut dyn ArmDebugInterface,
component: &'a CoresightComponent,
) -> Self {
Swo {
component,
interface,
}
}
/// Unlock the SWO and enable it for tracing the target.
///
/// This function enables the SWO unit as a whole. It does not actually send any data after
/// enabling it.
pub fn unlock(&mut self) -> Result<(), Error> {
self.component
.write_reg(self.interface, REGISTER_OFFSET_ACCESS, 0xC5AC_CE55)?;
Ok(())
}
/// Set the prescaler of the SWO.
pub fn set_prescaler(&mut self, value: u32) -> Result<(), Error> {
self.component
.write_reg(self.interface, REGISTER_OFFSET_SWO_CODR, value)?;
Ok(())
}
/// Set the SWO protocol.
/// 0 = sync trace mode
/// 1 = async SWO (manchester)
/// 2 = async SWO (NRZ)
/// 3 = reserved
pub fn set_pin_protocol(&mut self, value: u32) -> Result<(), Error> {
self.component
.write_reg(self.interface, REGISTER_OFFSET_SWO_SPPR, value)?;
Ok(())
}
}