#![allow(dead_code)]
use core::ptr::{read_volatile, write_volatile};
#[inline(always)]
pub unsafe fn write_rtc_mem(addr: u32, val: i32) {
write_volatile(addr as *mut i32, val);
}
#[inline(always)]
pub unsafe fn read_rtc_mem(addr: u32) -> i32 {
read_volatile(addr as *const i32)
}
#[inline(always)]
pub const fn riscv_reg_conv(addr: u32) -> u32 {
((addr & 0xffff) << 3) & 0xe000 | addr & 0x1fff | 0x8000
}
#[inline(always)]
pub const fn ets_uncached_addr(addr: u32) -> u32 {
riscv_reg_conv(addr)
}
#[inline(always)]
pub const fn bit(nr: u32) -> u32 {
1u32 << nr
}
#[inline(always)]
pub unsafe fn reg_write(r: u32, v: u32) {
write_volatile(riscv_reg_conv(r) as *mut u32, v);
}
#[inline(always)]
pub unsafe fn reg_read(r: u32) -> u32 {
read_volatile(riscv_reg_conv(r) as *const u32)
}
#[inline(always)]
pub unsafe fn reg_get_bit(r: u32, b: u32) -> u32 {
read_volatile(riscv_reg_conv(r) as *const u32) & b
}
#[inline(always)]
pub unsafe fn reg_set_bit(r: u32, b: u32) {
let addr = riscv_reg_conv(r) as *mut u32;
write_volatile(addr, read_volatile(addr) | b);
}
#[inline(always)]
pub unsafe fn reg_clr_bit(r: u32, b: u32) {
let addr = riscv_reg_conv(r) as *mut u32;
write_volatile(addr, read_volatile(addr) & !b);
}
#[inline(always)]
pub unsafe fn reg_set_bits(r: u32, b: u32, m: u32) {
let addr = riscv_reg_conv(r) as *mut u32;
write_volatile(addr, read_volatile(addr) & !m | b & m);
}
#[inline(always)]
pub unsafe fn reg_get_field(r: u32, f_s: u32, f_v: u32) -> u32 {
(reg_read(r) >> f_s) & f_v
}
#[inline(always)]
pub unsafe fn reg_set_field(r: u32, f_s: u32, f_v: u32, v: u32) {
reg_write(r, (reg_read(r) & !(f_v << f_s)) | ((v & f_v) << f_s));
}
#[inline(always)]
pub const fn value_get_field(r: u32, f: u32, f_s: u32) -> u32 {
(r >> f_s) & f
}
#[inline(always)]
pub const fn value_get_field2(r: u32, f: u32, f_s: u32) -> u32 {
(r & f) >> f_s
}
#[inline(always)]
pub const fn value_set_field(r: u32, f: u32, f_s: u32, v: u32) -> u32 {
r & !(f << f_s) | (v << f_s)
}
#[inline(always)]
pub const fn value_set_field2(r: u32, f: u32, f_s: u32, v: u32) -> u32 {
r & !f | (v << f_s)
}
#[inline(always)]
pub const fn field_to_value(f: u32, f_s: u32, v: u32) -> u32 {
(v & f) << f_s
}
#[inline(always)]
pub const fn field_to_value2(f: u32, f_s: u32, v: u32) -> u32 {
(v << f_s) & f
}
#[inline(always)]
pub unsafe fn read_peri_reg(addr: u32) -> u32 {
read_volatile(ets_uncached_addr(addr) as *const u32)
}
#[inline(always)]
pub unsafe fn write_peri_reg(addr: u32, v: u32) {
write_volatile(ets_uncached_addr(addr) as *mut u32, v);
}
#[inline(always)]
pub unsafe fn clear_peri_reg_mask(addr: u32, mask: u32) {
write_peri_reg(addr, read_peri_reg(addr) & !mask);
}
#[inline(always)]
pub unsafe fn set_peri_reg_mask(addr: u32, mask: u32) {
write_peri_reg(addr, read_peri_reg(addr) | mask);
}
#[inline(always)]
pub unsafe fn get_peri_reg_mask(addr: u32, mask: u32) -> u32 {
read_peri_reg(addr) & mask
}
#[inline(always)]
pub unsafe fn get_peri_reg_bits(addr: u32, bit_map: u32, shift: u8) -> u32 {
(read_peri_reg(addr) & (bit_map << shift)) >> shift
}
pub unsafe fn set_peri_reg_bits(addr: u32, bit_map: u32, value: u32, shift: u8) {
write_peri_reg(
addr,
read_peri_reg(addr) & !(bit_map << shift) | ((value & bit_map) << shift),
);
}
pub unsafe fn get_peri_reg_bits2(addr: u32, mask: u32, shift: u8) -> u32 {
(read_peri_reg(addr) >> shift) & mask
}