1pub enum Cmd {}
5pub enum Clk {}
7pub enum Wp {}
9pub enum CdB {}
11pub enum Data0 {}
13pub enum Data1 {}
15pub enum Data2 {}
17pub enum Data3 {}
19
20mod private {
22 pub trait Signal {}
23 impl Signal for super::Cmd {}
24 impl Signal for super::Clk {}
25 impl Signal for super::Wp {}
26 impl Signal for super::CdB {}
27 impl Signal for super::Data0 {}
28 impl Signal for super::Data1 {}
29 impl Signal for super::Data2 {}
30 impl Signal for super::Data3 {}
31}
32use private::Signal;
33
34use crate::Config;
35
36pub trait Pin: super::Iomuxc {
38 const ALT: u32;
40 const DAISY: Option<super::Daisy>;
42 const CONFIG: Config;
47 type Signal: Signal;
49 type Module: super::consts::Unsigned;
51}
52
53pub fn prepare<P: Pin>(pin: &mut P) {
64 super::alternate(pin, P::ALT);
65 super::set_sion(pin);
66 super::configure(pin, P::CONFIG);
67 if let Some(daisy) = P::DAISY {
68 unsafe { daisy.write() }
69 }
70}
71
72#[allow(unused)] macro_rules! usdhc {
74 (module: $module:ty, alt: $alt:expr, pad: $pad:ty, signal: $signal:ty, keeper: $keeper:expr, daisy: $daisy:expr) => {
75 impl Pin for $pad {
76 const ALT: u32 = $alt;
77 const DAISY: Option<Daisy> = $daisy;
78 const CONFIG: crate::Config = crate::Config::zero()
79 .set_speed(crate::Speed::Fast)
80 .set_drive_strength(crate::DriveStrength::R0_7)
81 .set_pull_keeper($keeper);
82 type Signal = $signal;
83 type Module = $module;
84 }
85 };
86}