probe_rs/vendor/espressif/sequences/
esp32c3.rsuse std::{sync::Arc, time::Duration};
use super::esp::EspFlashSizeDetector;
use crate::{
architecture::riscv::{
communication_interface::RiscvCommunicationInterface, sequences::RiscvDebugSequence,
Dmcontrol, Dmstatus,
},
MemoryInterface, Session,
};
#[derive(Debug)]
pub struct ESP32C3 {
inner: EspFlashSizeDetector,
}
impl ESP32C3 {
pub fn create() -> Arc<dyn RiscvDebugSequence> {
Arc::new(Self {
inner: EspFlashSizeDetector {
stack_pointer: 0x403c0000,
load_address: 0x40390000,
spiflash_peripheral: 0x6000_2000,
efuse_get_spiconfig_fn: Some(0x4000071c),
attach_fn: 0x4000_0164,
},
})
}
}
impl RiscvDebugSequence for ESP32C3 {
fn on_connect(&self, interface: &mut RiscvCommunicationInterface) -> Result<(), crate::Error> {
tracing::info!("Disabling esp32c3 watchdogs...");
interface.sysbus_requires_halting(true);
interface.write_word_32(0x600080B0, 0x8F1D312A)?; let current = interface.read_word_32(0x600080AC)?;
interface.write_word_32(0x600080AC, current | 1 << 31)?; interface.write_word_32(0x600080B0, 0x0)?; interface.write_word_32(0x6001f064, 0x50D83AA1)?; interface.write_word_32(0x6001F048, 0x0)?;
interface.write_word_32(0x6001f064, 0x0)?; interface.write_word_32(0x60020064, 0x50D83AA1)?; interface.write_word_32(0x60020048, 0x0)?;
interface.write_word_32(0x60020064, 0x0)?; interface.write_word_32(0x600080a8, 0x50D83AA1)?; interface.write_word_32(0x60008090, 0x0)?;
interface.write_word_32(0x600080a8, 0x0)?; Ok(())
}
fn detect_flash_size(&self, session: &mut Session) -> Result<Option<usize>, crate::Error> {
self.inner.detect_flash_size(session)
}
fn reset_system_and_halt(
&self,
interface: &mut RiscvCommunicationInterface,
timeout: Duration,
) -> Result<(), crate::Error> {
interface.halt(timeout)?;
interface.write_word_32(0x6000_8000, 0x9C00_A000)?;
interface.write_word_32(0x6001_F068, 0)?;
loop {
let dmstatus = interface.read_dm_register::<Dmstatus>()?;
if dmstatus.allhavereset() && dmstatus.allhalted() {
break;
}
}
let mut dmcontrol = Dmcontrol(0);
dmcontrol.set_dmactive(true);
dmcontrol.set_ackhavereset(true);
interface.write_dm_register(dmcontrol)?;
interface.reset_hart_and_halt(timeout)?;
self.on_connect(interface)?;
Ok(())
}
}