1#![macro_use]
2
3macro_rules! peri_trait {
4 (
5 $(irqs: [$($irq:ident),*],)?
6 ) => {
7 #[allow(private_interfaces)]
8 pub(crate) trait SealedInstance {
9 #[allow(unused)]
10 fn info() -> &'static Info;
11 #[allow(unused)]
12 fn state() -> &'static State;
13 }
14
15 /// Peripheral instance trait.
16 #[allow(private_bounds)]
17 pub trait Instance: crate::Peripheral<P = Self> + SealedInstance + crate::rcc::RccPeripheral {
18 $($(
19 /// Interrupt for this peripheral.
20 type $irq: crate::interrupt::typelevel::Interrupt;
21 )*)?
22 }
23 };
24}
25
26macro_rules! peri_trait_impl {
27 ($instance:ident, $info:expr) => {
28 #[allow(private_interfaces)]
29 impl SealedInstance for crate::peripherals::$instance {
30 fn info() -> &'static Info {
31 static INFO: Info = $info;
32 &INFO
33 }
34 fn state() -> &'static State {
35 static STATE: State = State::new();
36 &STATE
37 }
38 }
39 impl Instance for crate::peripherals::$instance {}
40 };
41}
42
43macro_rules! pin_trait {
44 ($signal:ident, $instance:path $(, $mode:path)?) => {
45 #[doc = concat!(stringify!($signal), " pin trait")]
46 pub trait $signal<T: $instance $(, M: $mode)?>: crate::gpio::Pin {
47 #[doc = concat!("Get the AF number needed to use this pin as ", stringify!($signal))]
48 fn af_num(&self) -> u8;
49 }
50 };
51}
52
53macro_rules! pin_trait_impl {
54 (crate::$mod:ident::$trait:ident$(<$mode:ident>)?, $instance:ident, $pin:ident, $af:expr) => {
55 impl crate::$mod::$trait<crate::peripherals::$instance $(, crate::$mod::$mode)?> for crate::peripherals::$pin {
56 fn af_num(&self) -> u8 {
57 $af
58 }
59 }
60 };
61}
62
63// ====================
64
65macro_rules! dma_trait {
66 ($signal:ident, $instance:path$(, $mode:path)?) => {
67 #[doc = concat!(stringify!($signal), " DMA request trait")]
68 pub trait $signal<T: $instance $(, M: $mode)?>: crate::dma::Channel {
69 #[doc = concat!("Get the DMA request number needed to use this channel as", stringify!($signal))]
70 /// Note: in some chips, ST calls this the "channel", and calls channels "streams".
71 /// `embassy-stm32` always uses the "channel" and "request number" names.
72 fn request(&self) -> crate::dma::Request;
73 }
74 };
75}
76
77#[allow(unused)]
78macro_rules! dma_trait_impl {
79 (crate::$mod:ident::$trait:ident$(<$mode:ident>)?, $instance:ident, $channel:ident, $request:expr) => {
80 impl crate::$mod::$trait<crate::peripherals::$instance $(, crate::$mod::$mode)?> for crate::peripherals::$channel {
81 fn request(&self) -> crate::dma::Request {
82 $request
83 }
84 }
85 };
86}
87
88macro_rules! new_dma {
89 ($name:ident) => {{
90 let dma = $name.into_ref();
91 let request = dma.request();
92 Some(crate::dma::ChannelAndRequest {
93 channel: dma.map_into(),
94 request,
95 })
96 }};
97}
98
99macro_rules! new_pin {
100 ($name:ident, $af_type:expr) => {{
101 let pin = $name.into_ref();
102 pin.set_as_af(pin.af_num(), $af_type);
103 Some(pin.map_into())
104 }};
105}
106