Format GPIO-related macros and their invocations to improve readability

This commit is contained in:
Jesse Braham 2022-01-06 09:34:32 -08:00
parent 34ca298698
commit b953041da0
3 changed files with 173 additions and 129 deletions

View File

@ -1,4 +1,3 @@
pub use crate::prelude::*;
pub use paste::paste;
#[macro_export]
@ -7,8 +6,8 @@ macro_rules! impl_output {
$gpio_function:ident,
$pxi:ident:
(
$pin_num:expr, $iomux_reg:expr, $bit:expr, $out_en_set:ident, $out_en_clear:ident,
$out_set:ident, $out_clear:ident, $out_reg:ident
$pin_num:expr, $iomux_reg:expr, $bit:expr, $out_en_set:ident,
$out_en_clear:ident, $out_set:ident, $out_clear:ident, $out_reg:ident
)
$( ,( $( $af_signal:ident: $af:ident ),* ))?
) => {
@ -84,8 +83,6 @@ macro_rules! impl_output {
.clear_bit()
});
}
}
pub fn into_push_pull_output(self) -> $pxi<Output<PushPull>> {
@ -240,11 +237,15 @@ macro_rules! impl_output {
#[macro_export]
macro_rules! impl_input {
($gpio_function:ident,
(
$gpio_function:ident,
$pxi:ident:
($pin_num:expr, $iomux_reg:expr, $bit:expr, $out_en_clear:ident, $reg:ident, $reader:ident,
$status_w1tc:ident, $pcpu_int:ident, $pcpu_nmi:ident, $acpu_int:ident, $acpu_nmi:ident
) $( ,( $( $af_signal:ident : $af:ident ),* ))?
(
$pin_num:expr, $iomux_reg:expr, $bit:expr, $out_en_clear:ident,
$reg:ident, $reader:ident, $status_w1tc:ident, $pcpu_int:ident,
$pcpu_nmi:ident, $acpu_int:ident, $acpu_nmi:ident
)
$( ,( $( $af_signal:ident : $af:ident ),* ))?
) => {
impl<MODE> embedded_hal::digital::v2::InputPin for $pxi<Input<MODE>> {
type Error = Infallible;
@ -263,14 +264,12 @@ macro_rules! impl_input {
let gpio = unsafe { &*GPIO::ptr() };
let iomux = unsafe { &*IO_MUX::ptr() };
gpio.$out_en_clear
.write(|w| unsafe { w.bits(1 << $bit) });
gpio.func_out_sel_cfg[$pin_num]
.modify(|_, w| unsafe { w.out_sel().bits(OutputSignal::GPIO as OutputSignalType) });
paste! {
iomux.$iomux_reg.modify(|_, w| unsafe {
w.mcu_sel()
@ -328,11 +327,9 @@ macro_rules! impl_input {
force_via_gpio_mux: bool,
) -> &mut Self {
let af = if force_via_gpio_mux
{
let af = if force_via_gpio_mux {
AlternateFunction::$gpio_function
}
else {
} else {
match signal {
$( $(
InputSignal::$af_signal => AlternateFunction::$af,
@ -430,8 +427,6 @@ macro_rules! impl_input {
}
fn enable_hold(&mut self, _on: bool) {
todo!();
}
}
@ -439,80 +434,127 @@ macro_rules! impl_input {
}
#[macro_export]
macro_rules! impl_pin_wrap {
($gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, $type:ident, Bank0, SingleCore
macro_rules! impl_input_wrap {
(
$gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, $type:ident, Bank0, SingleCore
$( ,( $( $af_input_signal:ident : $af_input:ident ),* ) )?
) => {
impl_input!($gpio_function, $pxi: ($pin_num, $iomux_reg, $pin_num % 32, enable_w1tc, in_, data_next,
status_w1tc, pcpu_int, pcpu_nmi_int, pcpu_int, pcpu_nmi_int)
$( ,( $( $af_input_signal: $af_input ),* ) )? );
};
($gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, $type:ident, Bank1, SingleCore
$( ,( $( $af_input_signal:ident : $af_input:ident ),* ) )?
) => {
impl_input!($gpio_function, $pxi: ($pin_num, $iomux_reg, $pin_num % 32, enable1_w1tc, in1, data_next,
status1_w1tc, pcpu_int1, pcpu_nmi_int1, pcpu_int1, pcpu_nmi_int1)
$( ,( $( $af_input_signal: $af_input ),* ) )? );
impl_input!(
$gpio_function,
$pxi:
(
$pin_num, $iomux_reg, $pin_num % 32, enable_w1tc, in_, data_next,
status_w1tc, pcpu_int, pcpu_nmi_int, pcpu_int, pcpu_nmi_int
)
$( ,( $( $af_input_signal: $af_input ),* ) )?
);
};
($gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, $type:ident, Bank0, DualCore
(
$gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, $type:ident, Bank1, SingleCore
$( ,( $( $af_input_signal:ident : $af_input:ident ),* ) )?
) => {
impl_input!($gpio_function, $pxi: ($pin_num, $iomux_reg, $pin_num % 32, enable_w1tc, in_, data_next,
status_w1tc, pcpu_int, pcpu_nmi_int, acpu_int, acpu_nmi_int)
$( ,( $( $af_input_signal: $af_input ),* ) )? );
impl_input!(
$gpio_function,
$pxi:
(
$pin_num, $iomux_reg, $pin_num % 32, enable1_w1tc, in1, data_next,
status1_w1tc, pcpu_int1, pcpu_nmi_int1, pcpu_int1, pcpu_nmi_int1
)
$( ,( $( $af_input_signal: $af_input ),* ) )?
);
};
($gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, $type:ident, Bank1, DualCore
(
$gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, $type:ident, Bank0, DualCore
$( ,( $( $af_input_signal:ident : $af_input:ident ),* ) )?
) => {
impl_input!($gpio_function, $pxi: ($pin_num, $iomux_reg, $pin_num % 32, enable1_w1tc, in1, data_next,
status1_w1tc, pcpu_int1, pcpu_nmi_int1, acpu_int1, acpu_nmi_int1)
$( ,( $( $af_input_signal: $af_input ),* ) )? );
impl_input!(
$gpio_function,
$pxi:
(
$pin_num, $iomux_reg, $pin_num % 32, enable_w1tc, in_, data_next,
status_w1tc, pcpu_int, pcpu_nmi_int, acpu_int, acpu_nmi_int
)
$( ,( $( $af_input_signal: $af_input ),* ) )?
);
};
(
$gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, $type:ident, Bank1, DualCore
$( ,( $( $af_input_signal:ident : $af_input:ident ),* ) )?
) => {
impl_input!(
$gpio_function,
$pxi:
(
$pin_num, $iomux_reg, $pin_num % 32, enable1_w1tc, in1, data_next,
status1_w1tc, pcpu_int1, pcpu_nmi_int1, acpu_int1, acpu_nmi_int1
)
$( ,( $( $af_input_signal: $af_input ),* ) )?
);
};
}
#[macro_export]
macro_rules! impl_output_wrap {
($gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, IO, Bank0
(
$gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, IO, Bank0
$( ,( $( $af_output_signal:ident : $af_output:ident ),* ))?
) => {
impl_output!($gpio_function, $pxi:
($pin_num, $iomux_reg, $pin_num % 32, enable_w1ts, enable_w1tc, out_w1ts, out_w1tc, out)
$( ,( $( $af_output_signal: $af_output ),* ) )? );
impl_output!(
$gpio_function,
$pxi:
(
$pin_num, $iomux_reg, $pin_num % 32, enable_w1ts, enable_w1tc,
out_w1ts, out_w1tc, out
)
$( ,( $( $af_output_signal: $af_output ),* ) )?
);
};
($gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, IO, Bank1
(
$gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, IO, Bank1
$( ,( $( $af_output_signal:ident : $af_output:ident ),* ))?
) => {
impl_output!($gpio_function, $pxi:
($pin_num, $iomux_reg, $pin_num % 32, enable1_w1ts, enable1_w1tc, out1_w1ts, out1_w1tc, out1)
$( ,( $( $af_output_signal: $af_output ),* ) )? );
impl_output!(
$gpio_function,
$pxi:
(
$pin_num, $iomux_reg, $pin_num % 32, enable1_w1ts, enable1_w1tc,
out1_w1ts, out1_w1tc, out1
)
$( ,( $( $af_output_signal: $af_output ),* ) )?
);
};
($gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, $type:ident, $bank:ident
(
$gpio_function:ident, $pxi:ident, $pin_num:expr, $iomux_reg:expr, $type:ident, $bank:ident
$( ,( $( $af_output_signal:ident : $af_output:ident ),* ))?
) => {
};
) => {};
}
#[macro_export]
macro_rules! gpio {
( $gpio_function:ident,
(
$gpio_function:ident,
$cores:ident,
$($pxi:ident: ($pname:ident, $pin_num:literal, $iomux_reg:expr, $type:ident, $rtc:tt, $bank:ident ),
$(
$pxi:ident:
(
$pname:ident, $pin_num:literal, $iomux_reg:expr, $type:ident,
$rtc:tt, $bank:ident
),
$(
( $( $af_input_signal:ident: $af_input:ident ),* ),
$(
( $( $af_output_signal:ident: $af_output:ident ),* ),
$( ( $( $af_output_signal:ident: $af_output:ident ),* ), )?
)?
)?
)+ ) => {
)+
) => {
use core::{convert::Infallible, marker::PhantomData};
use embedded_hal::digital::v2::{OutputPin as _, StatefulOutputPin as _};
use crate::pac::{GPIO, IO_MUX};
#[allow(dead_code)]
pub struct IO {
io_mux: IO_MUX,
pub pins: Pins,
@ -727,32 +769,32 @@ macro_rules! gpio {
}
}
pub struct Pins {
$(
pub $pname: $pxi<Unknown>,
)+
}
$(
pub struct $pxi<MODE> {
_mode: PhantomData<MODE>,
}
impl_pin_wrap!($gpio_function, $pxi, $pin_num, $iomux_reg, $type, $bank, $cores
$( ,( $( $af_input_signal: $af_input ),* ) )? );
impl_output_wrap!($gpio_function, $pxi, $pin_num, $iomux_reg, $type, $bank
$($( ,( $( $af_output_signal: $af_output ),* ) )? )? );
impl_input_wrap!(
$gpio_function, $pxi, $pin_num, $iomux_reg, $type, $bank, $cores
$( ,( $( $af_input_signal: $af_input ),* ) )?
);
impl_output_wrap!(
$gpio_function, $pxi, $pin_num, $iomux_reg, $type, $bank
$($( ,( $( $af_output_signal: $af_output ),* ) )? )?
);
)+
};
}
pub use gpio;
pub use impl_input;
pub use impl_input_wrap;
pub use impl_output;
pub use impl_output_wrap;
pub use impl_pin_wrap;

View File

@ -502,6 +502,7 @@ pub enum OutputSignal {
gpio! {
Function2,
DualCore,
Gpio0: ( gpio0, 0, gpio0, IO, RTC, Bank0), (EMAC_TX_CLK: Function5), (CLK_OUT1: Function1),
Gpio1: ( gpio1, 1, gpio1, IO, 0, Bank0), (EMAC_RXD2: Function5), (U0TXD: Function1, CLK_OUT3: Function1),
Gpio2: ( gpio2, 2, gpio2, IO, RTC, Bank0), (HSPIWP: Function1, HS2_DATA0: Function3, SD_DATA0: Function4), (HS2_DATA0: Function3, SD_DATA0: Function4),

View File

@ -140,6 +140,7 @@ pub enum OutputSignal {
gpio! {
Function1,
SingleCore,
Gpio0: ( gpio0, 0, gpio[0], IO, RTC, Bank0),
Gpio1: ( gpio1, 1, gpio[1], IO, RTC, Bank0),
Gpio2: ( gpio2, 2, gpio[2], IO, RTC, Bank0), (FSPIQ: Function2), (FSPIQ: Function2),