use vorago_shared_periphs::sysconfig::reset_peripheral_for_cycles; pub use crate::gpio::{Pin, PinId, PinIdProvider, Port}; use crate::sealed::Sealed; use crate::PeripheralSelect; pub trait PinMarker: Sealed { const ID: PinId; } macro_rules! pin_id { ($Id:ident, $Port:path, $num:literal) => { // Need paste macro to use ident in doc attribute paste::paste! { #[doc = "Pin ID representing pin " $Id] #[derive(Debug)] pub enum $Id {} impl $crate::sealed::Sealed for $Id {} impl PinIdProvider for $Id { const ID: PinId = PinId::new_unchecked($Port, $num); } impl PinMarker for Pin<$Id> { const ID: PinId = $Id::ID; } } }; } impl Sealed for Pin {} pin_id!(Pa0, Port::A, 0); pin_id!(Pa1, Port::A, 1); pin_id!(Pa2, Port::A, 2); pin_id!(Pa3, Port::A, 3); pin_id!(Pa4, Port::A, 4); pin_id!(Pa5, Port::A, 5); pin_id!(Pa6, Port::A, 6); pin_id!(Pa7, Port::A, 7); pin_id!(Pa8, Port::A, 8); pin_id!(Pa9, Port::A, 9); pin_id!(Pa10, Port::A, 10); pin_id!(Pa11, Port::A, 11); pin_id!(Pa12, Port::A, 12); pin_id!(Pa13, Port::A, 13); pin_id!(Pa14, Port::A, 14); pin_id!(Pa15, Port::A, 15); pin_id!(Pa16, Port::A, 16); pin_id!(Pa17, Port::A, 17); pin_id!(Pa18, Port::A, 18); pin_id!(Pa19, Port::A, 19); pin_id!(Pa20, Port::A, 20); pin_id!(Pa21, Port::A, 21); pin_id!(Pa22, Port::A, 22); pin_id!(Pa23, Port::A, 23); pin_id!(Pa24, Port::A, 24); pin_id!(Pa25, Port::A, 25); pin_id!(Pa26, Port::A, 26); pin_id!(Pa27, Port::A, 27); pin_id!(Pa28, Port::A, 28); pin_id!(Pa29, Port::A, 29); pin_id!(Pa30, Port::A, 30); pin_id!(Pa31, Port::A, 31); pin_id!(Pb0, Port::B, 0); pin_id!(Pb1, Port::B, 1); pin_id!(Pb2, Port::B, 2); pin_id!(Pb3, Port::B, 3); pin_id!(Pb4, Port::B, 4); pin_id!(Pb5, Port::B, 5); pin_id!(Pb6, Port::B, 6); pin_id!(Pb7, Port::B, 7); pin_id!(Pb8, Port::B, 8); pin_id!(Pb9, Port::B, 9); pin_id!(Pb10, Port::B, 10); pin_id!(Pb11, Port::B, 11); pin_id!(Pb12, Port::B, 12); pin_id!(Pb13, Port::B, 13); pin_id!(Pb14, Port::B, 14); pin_id!(Pb15, Port::B, 15); pin_id!(Pb16, Port::B, 16); pin_id!(Pb17, Port::B, 17); pin_id!(Pb18, Port::B, 18); pin_id!(Pb19, Port::B, 19); pin_id!(Pb20, Port::B, 20); pin_id!(Pb21, Port::B, 21); pin_id!(Pb22, Port::B, 22); pin_id!(Pb23, Port::B, 23); pub struct PinsA { pub pa0: Pin, pub pa1: Pin, pub pa2: Pin, pub pa3: Pin, pub pa4: Pin, pub pa5: Pin, pub pa6: Pin, pub pa7: Pin, pub pa8: Pin, pub pa9: Pin, pub pa10: Pin, pub pa11: Pin, pub pa12: Pin, pub pa13: Pin, pub pa14: Pin, pub pa15: Pin, pub pa16: Pin, pub pa17: Pin, pub pa18: Pin, pub pa19: Pin, pub pa20: Pin, pub pa21: Pin, pub pa22: Pin, pub pa23: Pin, pub pa24: Pin, pub pa25: Pin, pub pa26: Pin, pub pa27: Pin, pub pa28: Pin, pub pa29: Pin, pub pa30: Pin, pub pa31: Pin, } impl PinsA { pub fn new(_port_a: va108xx::Porta) -> Self { let syscfg = unsafe { va108xx::Sysconfig::steal() }; reset_peripheral_for_cycles(PeripheralSelect::PortA, 2); syscfg.peripheral_clk_enable().modify(|_, w| { w.porta().set_bit(); w.gpio().set_bit(); w.ioconfig().set_bit() }); Self { pa0: Pin::new(), pa1: Pin::new(), pa2: Pin::new(), pa3: Pin::new(), pa4: Pin::new(), pa5: Pin::new(), pa6: Pin::new(), pa7: Pin::new(), pa8: Pin::new(), pa9: Pin::new(), pa10: Pin::new(), pa11: Pin::new(), pa12: Pin::new(), pa13: Pin::new(), pa14: Pin::new(), pa15: Pin::new(), pa16: Pin::new(), pa17: Pin::new(), pa18: Pin::new(), pa19: Pin::new(), pa20: Pin::new(), pa21: Pin::new(), pa22: Pin::new(), pa23: Pin::new(), pa24: Pin::new(), pa25: Pin::new(), pa26: Pin::new(), pa27: Pin::new(), pa28: Pin::new(), pa29: Pin::new(), pa30: Pin::new(), pa31: Pin::new(), } } } pub struct PinsB { pub pb0: Pin, pub pb1: Pin, pub pb2: Pin, pub pb3: Pin, pub pb4: Pin, pub pb5: Pin, pub pb6: Pin, pub pb7: Pin, pub pb8: Pin, pub pb9: Pin, pub pb10: Pin, pub pb11: Pin, pub pb12: Pin, pub pb13: Pin, pub pb14: Pin, pub pb15: Pin, pub pb16: Pin, pub pb17: Pin, pub pb18: Pin, pub pb19: Pin, pub pb20: Pin, pub pb21: Pin, pub pb22: Pin, pub pb23: Pin, } impl PinsB { pub fn new(_port_b: va108xx::Portb) -> Self { let syscfg = unsafe { va108xx::Sysconfig::steal() }; reset_peripheral_for_cycles(PeripheralSelect::PortB, 2); syscfg.peripheral_clk_enable().modify(|_, w| { w.portb().set_bit(); w.gpio().set_bit(); w.ioconfig().set_bit() }); Self { pb0: Pin::new(), pb1: Pin::new(), pb2: Pin::new(), pb3: Pin::new(), pb4: Pin::new(), pb5: Pin::new(), pb6: Pin::new(), pb7: Pin::new(), pb8: Pin::new(), pb9: Pin::new(), pb10: Pin::new(), pb11: Pin::new(), pb12: Pin::new(), pb13: Pin::new(), pb14: Pin::new(), pb15: Pin::new(), pb16: Pin::new(), pb17: Pin::new(), pb18: Pin::new(), pb19: Pin::new(), pb20: Pin::new(), pb21: Pin::new(), pb22: Pin::new(), pb23: Pin::new(), } } }