crate::unstable_module! {
pub mod clocks;
}
pub(crate) mod cpu_control;
pub(crate) mod regi2c;
pub(crate) use esp32p4 as pac;
#[inline(always)]
#[cfg(feature = "rt")]
pub(crate) fn riscv_preinit() {
unsafe {
cache_invalidate_addr(0x40000000, 64 * 1024 * 1024);
}
}
pub(crate) fn pre_init() {
#[cfg(multi_core)]
unsafe {
cpu_control::internal_park_core(crate::system::Cpu::AppCpu, true);
cpu_control::disable_core1();
}
}
pub(crate) fn enable_branch_predictor() {
const MHCR_RS: u32 = 1 << 4; const MHCR_BFE: u32 = 1 << 5; const MHCR_BTB: u32 = 1 << 12; unsafe {
core::arch::asm!("csrrs x0, 0x7c1, {0}", in(reg) MHCR_RS | MHCR_BFE | MHCR_BTB);
}
}
const CACHE_MAP_L1_ICACHE_0: u32 = 1 << 0;
const CACHE_MAP_L1_ICACHE_1: u32 = 1 << 1;
const CACHE_MAP_L1_DCACHE: u32 = 1 << 4;
const CACHE_MAP_L2_CACHE: u32 = 1 << 5;
fn cache_l2_bus(addr: u32) -> u32 {
let internal = memory_range!("DRAM").contains(&addr);
if internal { 0 } else { CACHE_MAP_L2_CACHE }
}
pub(crate) unsafe fn cache_writeback_addr(addr: u32, size: u32) {
unsafe extern "C" {
fn Cache_WriteBack_Addr(bus: u32, addr: u32, size: u32);
}
unsafe {
Cache_WriteBack_Addr(CACHE_MAP_L1_DCACHE | cache_l2_bus(addr), addr, size);
}
}
pub(crate) unsafe fn cache_invalidate_addr(addr: u32, size: u32) {
unsafe extern "C" {
fn Cache_Invalidate_Addr(bus: u32, addr: u32, size: u32);
}
unsafe {
Cache_Invalidate_Addr(CACHE_MAP_L1_DCACHE | cache_l2_bus(addr), addr, size);
}
}
pub(crate) unsafe fn cache_invalidate_icache_addr(addr: u32, size: u32) {
unsafe extern "C" {
fn Cache_Invalidate_Addr(bus: u32, addr: u32, size: u32);
}
unsafe {
Cache_Invalidate_Addr(
CACHE_MAP_L1_ICACHE_0 | CACHE_MAP_L1_ICACHE_1 | cache_l2_bus(addr),
addr,
size,
);
}
}
#[cfg(i2s_driver_supported)]
#[cfg_attr(not(feature = "unstable"), allow(unused))]
pub(crate) fn i2s_sclk_frequency() -> u32 {
clocks::pll_f160m_frequency()
}