probe_rs/architecture/arm/component/swo.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
//! 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::architecture::arm::ArmProbeInterface;
use crate::Error;
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 ArmProbeInterface,
}
impl<'a> Swo<'a> {
/// Construct a new SWO component.
pub fn new(
interface: &'a mut dyn ArmProbeInterface,
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(())
}
}