use atsamd_hal_macros::hal_cfg;
use core::ops::Deref;
use crate::pac;
use pac::sercom0;
#[hal_cfg("sercom0-d5x")]
use pac::MCLK as APB_CLK_CTRL;
#[hal_cfg(any("sercom0-d11", "sercom0-d21"))]
use pac::PM as APB_CLK_CTRL;
#[cfg(feature = "dma")]
use crate::dmac::TriggerSource;
use crate::typelevel::Sealed;
pub mod pad;
pub use pad::*;
pub mod i2c;
pub mod spi;
pub mod spi_future;
pub mod uart;
#[cfg(feature = "dma")]
pub mod dma;
pub trait Sercom: Sealed + Deref<Target = sercom0::RegisterBlock> {
const NUM: usize;
#[cfg(feature = "dma")]
const DMA_RX_TRIGGER: TriggerSource;
#[cfg(feature = "dma")]
const DMA_TX_TRIGGER: TriggerSource;
fn enable_apb_clock(&mut self, ctrl: &APB_CLK_CTRL);
}
macro_rules! sercom {
( $apbmask:ident, $N:expr, $alias:ident, $pac_type:ident, $pac_rx:ident, $pac_tx:ident, $pac_modify:ident) => {
use pac::$pac_type;
pub type $alias = $pac_type;
impl Sealed for $alias {}
impl Sercom for $alias {
const NUM: usize = $N;
#[cfg(feature = "dma")]
const DMA_RX_TRIGGER: TriggerSource = TriggerSource::$pac_rx;
#[cfg(feature = "dma")]
const DMA_TX_TRIGGER: TriggerSource = TriggerSource::$pac_tx;
#[inline]
fn enable_apb_clock(&mut self, ctrl: &APB_CLK_CTRL) {
ctrl.$apbmask.modify(|_, w| w.$pac_modify().set_bit());
}
}
};
}
#[hal_cfg(any("sercom0-d11", "sercom0-d21"))]
sercom!(apbcmask, 0, Sercom0, SERCOM0, SERCOM0_RX, SERCOM0_TX, sercom0_);
#[hal_cfg(any("sercom1-d11", "sercom1-d21"))]
sercom!(apbcmask, 1, Sercom1, SERCOM1, SERCOM1_RX, SERCOM1_TX, sercom1_);
#[hal_cfg(any("sercom2-d11", "sercom2-d21"))]
sercom!(apbcmask, 2, Sercom2, SERCOM2, SERCOM2_RX, SERCOM2_TX, sercom2_);
#[hal_cfg("sercom3-d21")]
sercom!(apbcmask, 3, Sercom3, SERCOM3, SERCOM3_RX, SERCOM3_TX, sercom3_);
#[hal_cfg("sercom4-d21")]
sercom!(apbcmask, 4, Sercom4, SERCOM4, SERCOM4_RX, SERCOM4_TX, sercom4_);
#[hal_cfg("sercom5-d21")]
sercom!(apbcmask, 5, Sercom5, SERCOM5, SERCOM5_RX, SERCOM5_TX, sercom5_);
#[hal_cfg("sercom0-d5x")]
sercom!(apbamask, 0, Sercom0, SERCOM0, SERCOM0_RX, SERCOM0_TX, sercom0_);
#[hal_cfg("sercom1-d5x")]
sercom!(apbamask, 1, Sercom1, SERCOM1, SERCOM1_RX, SERCOM1_TX, sercom1_);
#[hal_cfg("sercom2-d5x")]
sercom!(apbbmask, 2, Sercom2, SERCOM2, SERCOM2_RX, SERCOM2_TX, sercom2_);
#[hal_cfg("sercom3-d5x")]
sercom!(apbbmask, 3, Sercom3, SERCOM3, SERCOM3_RX, SERCOM3_TX, sercom3_);
#[hal_cfg("sercom4-d5x")]
sercom!(apbdmask, 4, Sercom4, SERCOM4, SERCOM4_RX, SERCOM4_TX, sercom4_);
#[hal_cfg("sercom5-d5x")]
sercom!(apbdmask, 5, Sercom5, SERCOM5, SERCOM5_RX, SERCOM5_TX, sercom5_);
#[hal_cfg("sercom6-d5x")]
sercom!(apbdmask, 6, Sercom6, SERCOM6, SERCOM6_RX, SERCOM6_TX, sercom6_);
#[hal_cfg("sercom7-d5x")]
sercom!(apbdmask, 7, Sercom7, SERCOM7, SERCOM7_RX, SERCOM7_TX, sercom7_);