use atsamd_hal_macros::hal_cfg;
use core::ptr;
const ADDR: u32 = 0x806020u32;
fn cal(addr_offset: u32, bit_shift: u32, bit_mask: u32) -> u32 {
unsafe {
let addr: *const u32 = (ADDR + addr_offset) as *const _;
let value = ptr::read_unaligned(addr);
(value >> bit_shift) & bit_mask
}
}
fn cal_with_errata(
addr_offset: u32,
bit_shift: u32,
bit_mask: u32,
bad_val: u32,
def_val: u32,
) -> u32 {
let val = cal(addr_offset, bit_shift, bit_mask);
if val == bad_val {
def_val
} else {
val
}
}
#[allow(clippy::unusual_byte_groupings)]
pub fn adc_linearity_cal() -> u8 {
cal(3, 3, 0b11111111) as u8
}
pub fn adc_bias_cal() -> u8 {
cal(4, 3, 0b111) as u8
}
pub fn osc32k_cal() -> u8 {
cal(4, 6, 0b1111111) as u8
}
pub fn dfll48m_coarse_cal() -> u8 {
cal_with_errata(7, 2, 0b111111, 0x3f, 0x1f) as u8
}
pub fn usb_transn_cal() -> u8 {
cal_with_errata(5, 5, 0b11111, 0x1f, 5) as u8
}
pub fn usb_transp_cal() -> u8 {
cal_with_errata(6, 2, 0b11111, 0x1f, 29) as u8
}
#[hal_cfg("nvmctrl-d11")]
pub fn usb_trim_cal() -> u8 {
cal_with_errata(6, 7, 0b111, 7, 5) as u8
}
#[hal_cfg("nvmctrl-d21")]
pub fn usb_trim_cal() -> u8 {
cal_with_errata(6, 7, 0b111, 7, 3) as u8
}
pub fn room_temp() -> f32 {
let int_val = cal(0x10, 0, 0b11111111);
let dec_val = cal(0x10 + 1, 0, 0b1111);
((int_val * 10) + dec_val) as f32 / 10.0
}
pub fn hot_temp() -> f32 {
let int_val = cal(0x10 + 1, 4, 0b11111111);
let dec_val = cal(0x10 + 2, 4, 0b1111);
((int_val * 10) + dec_val) as f32 / 10.0
}
pub fn room_int1v_val() -> i8 {
cal(0x10 + 3, 0, 0b11111111) as i8
}
pub fn hot_int1v_val() -> i8 {
cal(0x10 + 4, 0, 0b11111111) as i8
}
pub fn room_temp_adc_val() -> u16 {
cal(0x10 + 5, 0, 0b111111111111) as u16
}
pub fn hot_temp_adc_val() -> u16 {
cal(0x10 + 6, 4, 0b111111111111) as u16
}