Macro rp2040_hal::bsp_pins

source ·
macro_rules! bsp_pins {
    (
        $(
            $( #[$id_cfg:meta] )*
            $Id:ident {
                $( #[$name_doc:meta] )*
                name: $name:ident $(,)?
                $(
                    aliases: {
                        $(
                            $( #[$alias_cfg:meta] )*
                            $Function:ty, $PullType:ident: $Alias:ident
                        ),+
                    }
                )?
            } $(,)?
        )+
    ) => { ... };
    ( @aliases, $( $( $( #[$attr:meta] )* $Id:ident $Function:ident $PullType:ident $Alias:ident )+ )? ) => { ... };
}
Expand description

Helper macro to give meaningful names to GPIO pins

The normal Pins struct names each Pin according to its PinId. However, BSP authors would prefer to name each Pin according to its function. This macro defines a new Pins struct with custom field names for each Pin.

§Example

Calling the macro like this:

use rp2040_hal::bsp_pins;
bsp_pins! {
    #[cfg(feature = "gpio")]
    Gpio0 {
         /// Doc gpio0
         name: gpio0,
         aliases: { FunctionPio0, PullNone: PioPin }
    },
    Gpio1 {
         name: led,
         aliases: { FunctionPwm, PullDown: LedPwm }
     },
}

Is roughly equivalent to the following source code (excluding the docs strings below):

use ::rp2040_hal as hal;
use hal::gpio;
pub struct Pins {
    /// Doc gpio0
    #[cfg(feature = "gpio")]
    pub gpio0: gpio::Pin<
        gpio::bank0::Gpio0,
        <gpio::bank0::Gpio0 as gpio::DefaultTypeState>::Function,
        <gpio::bank0::Gpio0 as gpio::DefaultTypeState>::PullType,
    >,
    pub led: gpio::Pin<
        gpio::bank0::Gpio1,
        <gpio::bank0::Gpio1 as gpio::DefaultTypeState>::Function,
        <gpio::bank0::Gpio1 as gpio::DefaultTypeState>::PullType,
    >,
}
impl Pins {
    #[inline]
    pub fn new(
        io: hal::pac::IO_BANK0,
        pads: hal::pac::PADS_BANK0,
        sio: hal::sio::SioGpioBank0,
        reset: &mut hal::pac::RESETS,
    ) -> Self {
        let mut pins = gpio::Pins::new(io, pads, sio, reset);
        Self {
            #[cfg(feature = "gpio")]
            gpio0: pins.gpio0,
            led: pins.gpio1,
        }
    }
}
pub type PioPin = gpio::Pin<gpio::bank0::Gpio0, gpio::FunctionPio0, gpio::PullNone>;
pub type LedPwm = gpio::Pin<gpio::bank0::Gpio1, gpio::FunctionPwm, gpio::PullDown>;