1#![no_std]
28#![cfg_attr(docsrs, feature(doc_auto_cfg))]
29#[cfg(feature = "alloc")]
30extern crate alloc;
31#[cfg(test)]
32extern crate std;
33
34use gpio::Port;
35pub use va416xx as device;
36pub use va416xx as pac;
37
38pub mod can;
39pub mod clock;
40pub mod dma;
41pub mod edac;
42pub mod gpio;
43pub mod i2c;
44pub mod irq_router;
45pub mod pins;
46pub mod prelude;
47pub mod pwm;
48pub mod spi;
49pub mod time;
50pub mod timer;
51pub mod uart;
52pub mod wdt;
53
54#[cfg(feature = "va41630")]
55pub mod nvm;
56
57#[cfg(not(feature = "va41628"))]
58pub mod adc;
59#[cfg(not(feature = "va41628"))]
60pub mod dac;
61
62pub use vorago_shared_hal::{
63 assert_peripheral_reset, deassert_peripheral_reset, disable_nvic_interrupt,
64 disable_peripheral_clock, enable_nvic_interrupt, enable_peripheral_clock,
65 reset_peripheral_for_cycles, FunctionSelect, PeripheralSelect,
66};
67
68#[derive(Debug, PartialEq, Eq, thiserror::Error)]
69#[cfg_attr(feature = "defmt", derive(defmt::Format))]
70#[error("invalid pin with number {0}")]
71pub struct InvalidPinError(u8);
72
73#[inline]
79pub fn port_function_select(
80 ioconfig: &mut pac::Ioconfig,
81 port: Port,
82 pin: u8,
83 funsel: FunctionSelect,
84) -> Result<(), InvalidPinError> {
85 if (port == Port::G && pin >= 8) || pin >= 16 {
86 return Err(InvalidPinError(pin));
87 }
88 let reg_block = match port {
89 Port::A => ioconfig.porta(pin as usize),
90 Port::B => ioconfig.portb(pin as usize),
91 Port::C => ioconfig.portc(pin as usize),
92 Port::D => ioconfig.portd(pin as usize),
93 Port::E => ioconfig.porte(pin as usize),
94 Port::F => ioconfig.portf(pin as usize),
95 Port::G => ioconfig.portg(pin as usize),
96 };
97
98 reg_block.modify(|_, w| unsafe { w.funsel().bits(funsel as u8) });
99 Ok(())
100}
101
102pub trait SyscfgExt {
103 fn enable_peripheral_clock(&mut self, clock: PeripheralSelect);
104
105 fn disable_peripheral_clock(&mut self, clock: PeripheralSelect);
106
107 fn assert_periph_reset(&mut self, periph: PeripheralSelect);
108
109 fn deassert_periph_reset(&mut self, periph: PeripheralSelect);
110
111 fn reset_peripheral_reset_for_cycles(&mut self, periph: PeripheralSelect, cycles: usize);
112}
113
114impl SyscfgExt for pac::Sysconfig {
115 #[inline(always)]
116 fn enable_peripheral_clock(&mut self, clock: PeripheralSelect) {
117 enable_peripheral_clock(clock)
118 }
119
120 #[inline(always)]
121 fn disable_peripheral_clock(&mut self, clock: PeripheralSelect) {
122 disable_peripheral_clock(clock)
123 }
124
125 #[inline(always)]
126 fn assert_periph_reset(&mut self, clock: PeripheralSelect) {
127 assert_peripheral_reset(clock)
128 }
129
130 #[inline(always)]
131 fn deassert_periph_reset(&mut self, clock: PeripheralSelect) {
132 deassert_peripheral_reset(clock)
133 }
134
135 #[inline(always)]
136 fn reset_peripheral_reset_for_cycles(&mut self, periph: PeripheralSelect, cycles: usize) {
137 reset_peripheral_for_cycles(periph, cycles)
138 }
139}