#![allow(dead_code)]
pub mod dma;
pub mod ext;
pub mod gpio;
pub mod mac;
#[cfg(feature = "esp32")]
pub const DMA_BASE: usize = 0x3FF6_9000;
#[cfg(feature = "esp32")]
pub const MAC_BASE: usize = 0x3FF6_A000;
#[cfg(feature = "esp32")]
pub const EXT_BASE: usize = 0x3FF6_9800;
#[cfg(feature = "esp32")]
pub const DPORT_WIFI_CLK_EN_REG: usize = 0x3FF0_00CC;
#[cfg(feature = "esp32")]
pub const DPORT_WIFI_CLK_EMAC_EN: u32 = 1 << 14;
#[cfg(feature = "esp32")]
pub const IO_MUX_BASE: usize = 0x3FF4_9000;
#[cfg(feature = "esp32")]
pub const IO_MUX_GPIO0_OFFSET: usize = 0x44;
pub const IO_MUX_FUN_IE: u32 = 1 << 9;
pub const IO_MUX_MCU_SEL_SHIFT: u32 = 12;
pub const IO_MUX_MCU_SEL_MASK: u32 = 0x7 << 12;
pub const IO_MUX_GPIO0_FUNC_EMAC_TX_CLK: u32 = 5;
#[cfg(feature = "esp32p4")]
pub const DMA_BASE: usize = 0x5008_4000;
#[cfg(feature = "esp32p4")]
pub const MAC_BASE: usize = 0x5008_5000;
#[cfg(feature = "esp32p4")]
pub const EXT_BASE: usize = 0x5008_4800;
#[inline(always)]
pub unsafe fn read_reg(addr: usize) -> u32 {
unsafe { core::ptr::read_volatile(addr as *const u32) }
}
#[inline(always)]
pub unsafe fn write_reg(addr: usize, value: u32) {
unsafe { core::ptr::write_volatile(addr as *mut u32, value) }
}
#[inline(always)]
pub unsafe fn modify_reg<F>(addr: usize, f: F)
where
F: FnOnce(u32) -> u32,
{
let value = unsafe { read_reg(addr) };
unsafe { write_reg(addr, f(value)) }
}
#[inline(always)]
pub unsafe fn set_bits(addr: usize, bits: u32) {
unsafe { modify_reg(addr, |v| v | bits) }
}
#[inline(always)]
pub unsafe fn clear_bits(addr: usize, bits: u32) {
unsafe { modify_reg(addr, |v| v & !bits) }
}
macro_rules! reg_rw {
($read_fn:ident, $write_fn:ident, $base:expr, $offset:expr, $doc:expr) => {
#[doc = concat!("Read ", $doc)]
#[inline(always)]
pub fn $read_fn() -> u32 {
unsafe { $crate::internal::register::read_reg($base + $offset) }
}
#[doc = concat!("Write ", $doc)]
#[inline(always)]
pub fn $write_fn(value: u32) {
unsafe { $crate::internal::register::write_reg($base + $offset, value) }
}
};
}
macro_rules! reg_ro {
($read_fn:ident, $base:expr, $offset:expr, $doc:expr) => {
#[doc = concat!("Read ", $doc)]
#[inline(always)]
pub fn $read_fn() -> u32 {
unsafe { $crate::internal::register::read_reg($base + $offset) }
}
};
}
macro_rules! reg_bit_ops {
($set_fn:ident, $clear_fn:ident, $base:expr, $offset:expr, $bit:expr, $what:expr, $set_verb:expr, $clear_verb:expr) => {
#[doc = concat!($set_verb, " ", $what)]
#[inline(always)]
pub fn $set_fn() {
unsafe { $crate::internal::register::set_bits($base + $offset, $bit) }
}
#[doc = concat!($clear_verb, " ", $what)]
#[inline(always)]
pub fn $clear_fn() {
unsafe { $crate::internal::register::clear_bits($base + $offset, $bit) }
}
};
}
macro_rules! reg_bit_check_clear {
($fn:ident, $base:expr, $offset:expr, $bit:expr, $doc:expr) => {
#[doc = $doc]
#[inline(always)]
pub fn $fn() -> bool {
unsafe { ($crate::internal::register::read_reg($base + $offset) & $bit) == 0 }
}
};
}
pub(crate) use reg_bit_check_clear;
pub(crate) use reg_bit_ops;
pub(crate) use reg_ro;
pub(crate) use reg_rw;