use crate::gpio::{AltFunc, AnyPin, Pin, Pull};
use embassy_hal_internal::Peri;
use hk32f005_pac::gpio::regs::Cfgy;
pub struct Flex<'d> {
pub(crate) pin: Peri<'d, AnyPin>,
}
impl<'d> Flex<'d> {
pub fn new(pin: Peri<'d, impl Pin>) -> Self {
Self { pin: pin.into() }
}
#[inline(never)]
pub fn set_as_input(&mut self, pull: Pull) {
let r = self.pin.block();
let pin = self.pin.pin();
let cfgy = r.cfgx(pin);
let mut value: Cfgy = Default::default();
value.set_oty(true);
match pull {
Pull::None => {}
Pull::Up => {
value.set_puy(true);
}
Pull::Down => {
value.set_pdy(true);
}
}
cfgy.write_value(value);
}
#[inline(never)]
pub fn set_as_output(&self) {
let r = self.pin.block();
let pin = self.pin.pin();
let cfgy = r.cfgx(pin);
let mut value: Cfgy = Default::default();
value.set_modery(0b_01);
cfgy.write_value(value);
}
#[inline(never)]
pub fn set_as_input_output_pull(&self, pull: Pull) {
let r = self.pin.block();
let pin = self.pin.pin();
let cfgy = r.cfgx(pin);
let mut value: Cfgy = Default::default();
value.set_oty(true);
value.set_modery(0b_01);
match pull {
Pull::None => {}
Pull::Up => {
value.set_puy(true);
}
Pull::Down => {
value.set_pdy(true);
}
}
cfgy.write_value(value);
}
#[inline(never)]
pub fn set_as_alternate(&self, mode: AltFunc) {
let r = self.pin.block();
let pin = self.pin.pin();
let cfgy = r.cfgx(pin);
cfgy.modify(|w| {
w.set_afsely(mode as u8);
w.set_modery(0b_10);
});
}
#[inline(never)]
pub fn set_as_analog(&mut self) {
let r = self.pin.block();
let pin = self.pin.pin();
let cfgy = r.cfgx(pin);
let mut value: Cfgy = Default::default();
value.set_oty(true);
value.set_modery(0b_11);
cfgy.write_value(value);
}
}