#![no_std]
#![cfg_attr(
feature = "direct-boot",
feature(asm_experimental_arch),
feature(naked_functions)
)]
#![doc(html_logo_url = "https://avatars.githubusercontent.com/u/46717278")]
pub use esp_hal_common::*;
pub mod analog {
pub use esp_hal_common::analog::{AvailableAnalog, SensExt};
}
#[cfg(all(feature = "rt", feature = "direct-boot"))]
#[doc(hidden)]
#[no_mangle]
#[link_section = ".init"]
#[naked]
unsafe extern "C" fn init() {
core::arch::asm!("call0 startup_direct_boot", options(noreturn));
}
#[cfg(all(feature = "rt", feature = "direct-boot"))]
#[doc(hidden)]
#[no_mangle]
pub unsafe fn startup_direct_boot() -> ! {
extern "C" {
static mut _rtc_fast_bss_start: u32;
static mut _rtc_fast_bss_end: u32;
static mut _rtc_slow_bss_start: u32;
static mut _rtc_slow_bss_end: u32;
static mut _rtc_fast_text_start: u32;
static mut _rtc_fast_text_end: u32;
static mut _irtc_fast_text: u32;
static mut _rtc_fast_data_start: u32;
static mut _rtc_fast_data_end: u32;
static mut _irtc_fast_data: u32;
static mut _rtc_slow_text_start: u32;
static mut _rtc_slow_text_end: u32;
static mut _irtc_slow_text: u32;
static mut _rtc_slow_data_start: u32;
static mut _rtc_slow_data_end: u32;
static mut _irtc_slow_data: u32;
static mut _stack_end_cpu0: u32;
}
xtensa_lx::set_stack_pointer(&mut _stack_end_cpu0);
r0::init_data(
&mut _rtc_fast_data_start,
&mut _rtc_fast_data_end,
&_irtc_fast_data,
);
r0::init_data(
&mut _rtc_fast_text_start,
&mut _rtc_fast_text_end,
&_irtc_fast_text,
);
r0::init_data(
&mut _rtc_slow_data_start,
&mut _rtc_slow_data_end,
&_irtc_slow_data,
);
r0::init_data(
&mut _rtc_slow_text_start,
&mut _rtc_slow_text_end,
&_irtc_slow_text,
);
esp_hal_common::xtensa_lx_rt::zero_bss(&mut _rtc_fast_bss_start, &mut _rtc_fast_bss_end);
esp_hal_common::xtensa_lx_rt::zero_bss(&mut _rtc_slow_bss_start, &mut _rtc_slow_bss_end);
extern "C" {
static mut _srwtext: u32;
static mut _erwtext: u32;
static mut _irwtext: u32;
}
r0::init_data(&mut _srwtext, &mut _erwtext, &_irwtext);
(&*crate::peripherals::TIMG0::PTR)
.int_ena_timers
.modify(|_, w| w.t0_int_ena().set_bit().t1_int_ena().set_bit());
(&*crate::peripherals::TIMG1::PTR)
.int_ena_timers
.modify(|_, w| w.t0_int_ena().set_bit().t1_int_ena().set_bit());
(&*crate::peripherals::RTC_CNTL::PTR)
.swd_wprotect
.write(|w| w.bits(0x8f1d312a));
(&*crate::peripherals::RTC_CNTL::PTR)
.swd_conf
.modify(|_, w| w.swd_disable().set_bit());
(&*crate::peripherals::RTC_CNTL::PTR)
.swd_wprotect
.write(|w| w.bits(0));
(&*crate::peripherals::SYSTEM::PTR)
.sysclk_conf
.modify(|_, w| w.soc_clk_sel().bits(1));
esp_hal_common::xtensa_lx_rt::Reset();
}
#[cfg(feature = "rt")]
#[doc(hidden)]
#[link_section = ".rwtext"]
pub unsafe fn configure_cpu_caches() {
extern "C" {
fn rom_config_instruction_cache_mode(
cfg_cache_size: u32,
cfg_cache_ways: u8,
cfg_cache_line_size: u8,
);
}
const CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE: u32 = 0x4000; const CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS: u8 = 8; const CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE: u8 = 32; rom_config_instruction_cache_mode(
CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE,
CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS,
CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE,
);
}
#[cfg(feature = "rt")]
#[doc(hidden)]
#[no_mangle]
#[link_section = ".rwtext"]
pub unsafe extern "C" fn ESP32Reset() -> ! {
configure_cpu_caches();
extern "C" {
static mut _rtc_fast_bss_start: u32;
static mut _rtc_fast_bss_end: u32;
static mut _rtc_slow_bss_start: u32;
static mut _rtc_slow_bss_end: u32;
static mut _stack_end_cpu0: u32;
}
esp_hal_common::xtensa_lx::set_stack_pointer(&mut _stack_end_cpu0);
esp_hal_common::xtensa_lx_rt::zero_bss(&mut _rtc_fast_bss_start, &mut _rtc_fast_bss_end);
esp_hal_common::xtensa_lx_rt::zero_bss(&mut _rtc_slow_bss_start, &mut _rtc_slow_bss_end);
esp_hal_common::xtensa_lx_rt::Reset();
}
#[doc(hidden)]
#[no_mangle]
#[rustfmt::skip]
pub extern "Rust" fn __init_data() -> bool {
#[cfg(feature = "direct-boot")]
let res = true;
#[cfg(not(feature = "direct-boot"))]
let res = false;
res
}