use crate::assembly;
use super::{addrs, assign, assign_bit, read_word, Bitwise};
use core::arch::asm;
pub enum Resolution {
Bits8 = 0x0,
Bits10 = 0x1,
Bits12 = 0x2,
}
const ANALOG_PIN_BITS: [u32; 10] = [7, 8, 12, 11, 6, 5, 15, 0, 13, 14];
pub fn analog_start_clock() {
assign_bit(addrs::CCM_CCGR1, Bitwise::Or, 0x3 << 16);
assign(0x400C_4048, 0x1 << 7);
loop {
if (read_word(0x400C_4048) & (0x1 << 7)) > 0 {
assembly!("nop");
} else {
break;
}
}
analog_set_resolution(Resolution::Bits12);
assign(0x400C_4048, (0x1 << 6) | (0x1 << 5));
}
pub fn analog_set_resolution(resolution: Resolution) {
assign(
0x400C_4044,
(0x3 << 14) | (0x1 << 16) | ((resolution as u32) << 2),
);
}
pub fn analog_read(pin: usize) -> u32 {
if pin > 23 || pin < 14 {
return 0;
}
let analog_idx = pin - 14;
assign(addrs::ADC1_HC0, ANALOG_PIN_BITS[analog_idx]);
loop {
let val = read_word(addrs::ADC1_HS);
if val & 0x1 > 0 {
break;
} else {
assembly!("nop");
}
}
return read_word(0x400C_4024);
}