probe_rs/vendor/espressif/sequences/
esp32c6.rsuse std::{sync::Arc, time::Duration};
use super::esp::EspFlashSizeDetector;
use crate::{
architecture::riscv::{
communication_interface::{RiscvCommunicationInterface, Sbaddress0, Sbcs, Sbdata0},
sequences::RiscvDebugSequence,
Dmcontrol,
},
MemoryInterface, Session,
};
#[derive(Debug)]
pub struct ESP32C6 {
inner: EspFlashSizeDetector,
}
impl ESP32C6 {
pub fn create() -> Arc<dyn RiscvDebugSequence> {
Arc::new(Self {
inner: EspFlashSizeDetector {
stack_pointer: 0x40850000,
load_address: 0x40810000,
spiflash_peripheral: 0x6000_3000,
efuse_get_spiconfig_fn: None,
attach_fn: 0x4000_01DC,
},
})
}
}
impl RiscvDebugSequence for ESP32C6 {
fn on_connect(&self, interface: &mut RiscvCommunicationInterface) -> Result<(), crate::Error> {
tracing::info!("Disabling esp32c6 watchdogs...");
interface.write_word_32(0x600B1C20, 0x50D83AA1)?; let current = interface.read_word_32(0x600B_1C1C)?;
interface.write_word_32(0x600B_1C1C, current | 1 << 18)?; interface.write_word_32(0x600B1C20, 0x0)?; interface.write_word_32(0x6000_8064, 0x50D83AA1)?; interface.write_word_32(0x6000_8048, 0x0)?;
interface.write_word_32(0x6000_8064, 0x0)?; interface.write_word_32(0x6000_9064, 0x50D83AA1)?; interface.write_word_32(0x6000_9048, 0x0)?;
interface.write_word_32(0x6000_9064, 0x0)?; interface.write_word_32(0x600B_1C18, 0x50D83AA1)?; interface.write_word_32(0x600B_1C00, 0x0)?;
interface.write_word_32(0x600B_1C18, 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_dm_register(Sbcs(0x48000))?;
interface.write_dm_register(Sbaddress0(0x600b1034))?;
interface.write_dm_register(Sbdata0(0x80000000_u32))?;
interface.write_dm_register(Dmcontrol(0))?;
interface.write_dm_register(Sbcs(0x48000))?;
interface.write_dm_register(Sbaddress0(0x600b1038))?;
interface.write_dm_register(Sbdata0(0x10000000_u32))?;
interface.write_dm_register(Dmcontrol(0))?;
let mut dmcontrol = Dmcontrol(0);
dmcontrol.set_dmactive(true);
dmcontrol.set_resumereq(true);
interface.write_dm_register(dmcontrol)?;
std::thread::sleep(Duration::from_millis(10));
let mut dmcontrol = Dmcontrol(0);
dmcontrol.set_dmactive(true);
dmcontrol.set_ackhavereset(true);
interface.write_dm_register(dmcontrol)?;
interface.enter_debug_mode()?;
self.on_connect(interface)?;
interface.reset_hart_and_halt(timeout)?;
Ok(())
}
}