use crate::bitman::ClearBit;
use crate::bitman::ReadBit;
use crate::bitman::ReadBits;
use crate::bitman::SetBit;
use crate::bitman::WriteBits;
use core::ops::RangeInclusive;
use core::ptr::read_volatile;
use core::ptr::write_volatile;
#[allow(clippy::not_unsafe_ptr_arg_deref)]
#[inline]
#[must_use]
pub fn read_from_address(address: *mut u32) -> u32 {
unsafe { read_volatile(address) }
}
#[allow(clippy::not_unsafe_ptr_arg_deref)]
#[inline]
pub fn write_to_address(address: *mut u32, value: u32) {
unsafe { write_volatile(address, value) }
}
#[inline]
pub fn set_address_bit(address: *mut u32, index: u32) {
let old = read_from_address(address);
let new = old.set_bit(index);
write_to_address(address, new);
}
#[inline]
pub fn clear_address_bit(address: *mut u32, index: u32) {
let old = read_from_address(address);
let new = old.clear_bit(index);
write_to_address(address, new);
}
#[inline]
#[must_use]
pub fn read_address_bit(address: *mut u32, index: u32) -> bool {
let value = read_from_address(address);
value.read_bit(index)
}
#[inline]
#[must_use]
pub fn read_address_bits(address: *mut u32, indices: RangeInclusive<u32>) -> u32 {
let value = read_from_address(address);
value.read_bits(indices)
}
#[inline]
pub fn write_address_bits(address: *mut u32, indices: RangeInclusive<u32>, value: u32) {
let start = *indices.start();
#[allow(clippy::arithmetic_side_effects)]
let length = indices.end() - indices.start();
let old = read_from_address(address);
let new = old.write_bits(start, value, length);
write_to_address(address, new);
}