drone-nrf91-dso 0.14.0

Nordic Semi nRF91 DSO implementation for Drone, an Embedded Operating System.
use core::mem::MaybeUninit;
use drone_nrf_map::periph::uarte::UarteMap;

pub(crate) struct Periph<T: UarteMap> {
    pub uarte_tasks_startrx: T::UUarteTasksStartrx,
    pub uarte_tasks_stoprx: T::UUarteTasksStoprx,
    pub uarte_tasks_starttx: T::UUarteTasksStarttx,
    pub uarte_tasks_stoptx: T::UUarteTasksStoptx,
    pub uarte_tasks_flushrx: T::UUarteTasksFlushrx,
    pub uarte_subscribe_startrx: T::UUarteSubscribeStartrx,
    pub uarte_subscribe_stoprx: T::UUarteSubscribeStoprx,
    pub uarte_subscribe_starttx: T::UUarteSubscribeStarttx,
    pub uarte_subscribe_stoptx: T::UUarteSubscribeStoptx,
    pub uarte_subscribe_flushrx: T::UUarteSubscribeFlushrx,
    pub uarte_events_cts: T::UUarteEventsCts,
    pub uarte_events_ncts: T::UUarteEventsNcts,
    pub uarte_events_rxdrdy: T::UUarteEventsRxdrdy,
    pub uarte_events_endrx: T::UUarteEventsEndrx,
    pub uarte_events_txdrdy: T::UUarteEventsTxdrdy,
    pub uarte_events_endtx: T::UUarteEventsEndtx,
    pub uarte_events_error: T::UUarteEventsError,
    pub uarte_events_rxto: T::UUarteEventsRxto,
    pub uarte_events_rxstarted: T::UUarteEventsRxstarted,
    pub uarte_events_txstarted: T::UUarteEventsTxstarted,
    pub uarte_events_txstopped: T::UUarteEventsTxstopped,
    pub uarte_publish_cts: T::UUartePublishCts,
    pub uarte_publish_ncts: T::UUartePublishNcts,
    pub uarte_publish_rxdrdy: T::UUartePublishRxdrdy,
    pub uarte_publish_endrx: T::UUartePublishEndrx,
    pub uarte_publish_txdrdy: T::UUartePublishTxdrdy,
    pub uarte_publish_endtx: T::UUartePublishEndtx,
    pub uarte_publish_error: T::UUartePublishError,
    pub uarte_publish_rxto: T::UUartePublishRxto,
    pub uarte_publish_rxstarted: T::UUartePublishRxstarted,
    pub uarte_publish_txstarted: T::UUartePublishTxstarted,
    pub uarte_publish_txstopped: T::UUartePublishTxstopped,
    pub uarte_shorts: T::UUarteShorts,
    pub uarte_inten: T::UUarteInten,
    pub uarte_intenset: T::UUarteIntenset,
    pub uarte_intenclr: T::UUarteIntenclr,
    pub uarte_errorsrc: T::UUarteErrorsrc,
    pub uarte_enable: T::UUarteEnable,
    pub uarte_psel_rts: T::UUartePselRts,
    pub uarte_psel_txd: T::UUartePselTxd,
    pub uarte_psel_cts: T::UUartePselCts,
    pub uarte_psel_rxd: T::UUartePselRxd,
    pub uarte_baudrate: T::UUarteBaudrate,
    pub uarte_rxd_ptr: T::UUarteRxdPtr,
    pub uarte_rxd_maxcnt: T::UUarteRxdMaxcnt,
    pub uarte_rxd_amount: T::UUarteRxdAmount,
    pub uarte_txd_ptr: T::UUarteTxdPtr,
    pub uarte_txd_maxcnt: T::UUarteTxdMaxcnt,
    pub uarte_txd_amount: T::UUarteTxdAmount,
    pub uarte_config: T::UUarteConfig,
}

impl<T: UarteMap> Periph<T> {
    #[allow(clippy::uninit_assumed_init)]
    pub(crate) fn summon() -> Self {
        unsafe { MaybeUninit::uninit().assume_init() }
    }
}

#[doc(hidden)]
#[must_use]
pub const fn baud_rate(baud_rate: u32) -> u32 {
    match baud_rate {
        1_200 => 0x0004_F000,
        2_400 => 0x0009_D000,
        4_800 => 0x0013_B000,
        9_600 => 0x0027_5000,
        14_400 => 0x003A_F000,
        19_200 => 0x004E_A000,
        28_800 => 0x0075_C000,
        31_250 => 0x0080_0000,
        38_400 => 0x009D_0000,
        56_000 => 0x00E5_0000,
        57_600 => 0x00EB_0000,
        76_800 => 0x013A_9000,
        115_200 => 0x01D6_0000,
        230_400 => 0x03B0_0000,
        250_000 => 0x0400_0000,
        460_800 => 0x0740_0000,
        921_600 => 0x0F00_0000,
        1_000_000 => 0x1000_0000,
        _ => panic!("Unsupported UARTE baud rate"),
    }
}

#[doc(hidden)]
#[macro_export]
macro_rules! uarte_assert_taken {
    (Uarte0Ns) => {
        $crate::uarte_assert_taken!("uarte0_ns");
    };
    (Uarte0S) => {
        $crate::uarte_assert_taken!("uarte0_ns");
    };
    (Uarte1Ns) => {
        $crate::uarte_assert_taken!("uarte1_ns");
    };
    (Uarte1S) => {
        $crate::uarte_assert_taken!("uarte1_ns");
    };
    (Uarte2Ns) => {
        $crate::uarte_assert_taken!("uarte2_ns");
    };
    (Uarte2S) => {
        $crate::uarte_assert_taken!("uarte2_ns");
    };
    (Uarte3Ns) => {
        $crate::uarte_assert_taken!("uarte3_ns");
    };
    (Uarte3S) => {
        $crate::uarte_assert_taken!("uarte3_ns");
    };
    ($uarte:ident) => {
        compile_error!("Unsupported peripheral");
    };
    ($uarte:literal) => {
        reg::assert_taken!(concat!($uarte, "_tasks_startrx"));
        reg::assert_taken!(concat!($uarte, "_tasks_stoprx"));
        reg::assert_taken!(concat!($uarte, "_tasks_starttx"));
        reg::assert_taken!(concat!($uarte, "_tasks_stoptx"));
        reg::assert_taken!(concat!($uarte, "_tasks_flushrx"));
        reg::assert_taken!(concat!($uarte, "_subscribe_startrx"));
        reg::assert_taken!(concat!($uarte, "_subscribe_stoprx"));
        reg::assert_taken!(concat!($uarte, "_subscribe_starttx"));
        reg::assert_taken!(concat!($uarte, "_subscribe_stoptx"));
        reg::assert_taken!(concat!($uarte, "_subscribe_flushrx"));
        reg::assert_taken!(concat!($uarte, "_events_cts"));
        reg::assert_taken!(concat!($uarte, "_events_ncts"));
        reg::assert_taken!(concat!($uarte, "_events_rxdrdy"));
        reg::assert_taken!(concat!($uarte, "_events_endrx"));
        reg::assert_taken!(concat!($uarte, "_events_txdrdy"));
        reg::assert_taken!(concat!($uarte, "_events_endtx"));
        reg::assert_taken!(concat!($uarte, "_events_error"));
        reg::assert_taken!(concat!($uarte, "_events_rxto"));
        reg::assert_taken!(concat!($uarte, "_events_rxstarted"));
        reg::assert_taken!(concat!($uarte, "_events_txstarted"));
        reg::assert_taken!(concat!($uarte, "_events_txstopped"));
        reg::assert_taken!(concat!($uarte, "_publish_cts"));
        reg::assert_taken!(concat!($uarte, "_publish_ncts"));
        reg::assert_taken!(concat!($uarte, "_publish_rxdrdy"));
        reg::assert_taken!(concat!($uarte, "_publish_endrx"));
        reg::assert_taken!(concat!($uarte, "_publish_txdrdy"));
        reg::assert_taken!(concat!($uarte, "_publish_endtx"));
        reg::assert_taken!(concat!($uarte, "_publish_error"));
        reg::assert_taken!(concat!($uarte, "_publish_rxto"));
        reg::assert_taken!(concat!($uarte, "_publish_rxstarted"));
        reg::assert_taken!(concat!($uarte, "_publish_txstarted"));
        reg::assert_taken!(concat!($uarte, "_publish_txstopped"));
        reg::assert_taken!(concat!($uarte, "_shorts"));
        reg::assert_taken!(concat!($uarte, "_inten"));
        reg::assert_taken!(concat!($uarte, "_intenset"));
        reg::assert_taken!(concat!($uarte, "_intenclr"));
        reg::assert_taken!(concat!($uarte, "_errorsrc"));
        reg::assert_taken!(concat!($uarte, "_enable"));
        reg::assert_taken!(concat!($uarte, "_psel_rts"));
        reg::assert_taken!(concat!($uarte, "_psel_txd"));
        reg::assert_taken!(concat!($uarte, "_psel_cts"));
        reg::assert_taken!(concat!($uarte, "_psel_rxd"));
        reg::assert_taken!(concat!($uarte, "_baudrate"));
        reg::assert_taken!(concat!($uarte, "_rxd_ptr"));
        reg::assert_taken!(concat!($uarte, "_rxd_maxcnt"));
        reg::assert_taken!(concat!($uarte, "_rxd_amount"));
        reg::assert_taken!(concat!($uarte, "_txd_ptr"));
        reg::assert_taken!(concat!($uarte, "_txd_maxcnt"));
        reg::assert_taken!(concat!($uarte, "_txd_amount"));
        reg::assert_taken!(concat!($uarte, "_config"));
    };
}