#![no_std]
pub extern crate lpc55s6x_pac as raw;
pub mod prelude;
#[macro_use]
pub mod macros;
pub mod time;
pub mod traits;
pub mod typestates;
pub mod peripherals;
pub use peripherals::{
anactrl::Anactrl,
casper::Casper,
flash::Flash,
flexcomm::Flexcomm,
gpio::Gpio,
iocon::Iocon,
pmc::Pmc,
rng::Rng,
syscon::Syscon,
usbfs::Usbfs,
utick::Utick,
};
pub mod drivers;
pub use drivers::{
ClockRequirements,
I2cMaster,
SpiMaster,
Pin,
Pins,
UsbBus,
};
pub fn new() -> Peripherals {
Peripherals::from((
raw::Peripherals::take().expect("raw device peripherals already taken elsewhere"),
raw::CorePeripherals::take().expect("raw core peripherals already taken elsewhere"),
))
}
#[allow(non_snake_case)]
pub struct Peripherals {
pub anactrl: Anactrl,
pub casper: Casper,
pub flash: Flash,
pub flexcomm: Flexcomm,
pub gpio: Gpio,
pub iocon: Iocon,
pub pmc: Pmc,
pub syscon: Syscon,
pub usbfs: Usbfs,
pub utick: Utick,
pub ADC0: raw::ADC0,
pub CRC_ENGINE: raw::CRC_ENGINE,
pub CTIMER0: raw::CTIMER0,
pub SCT0: raw::SCT0,
pub CPUID: raw::CPUID,
pub DCB: raw::DCB,
pub DWT: raw::DWT,
pub MPU: raw::MPU,
pub NVIC: raw::NVIC,
pub SCB: raw::SCB,
pub SYST: raw::SYST,
}
impl Peripherals {
fn new(p: raw::Peripherals, cp: raw::CorePeripherals) -> Self {
Peripherals {
anactrl: Anactrl::from(p.ANACTRL),
casper: Casper::from(p.CASPER),
flash: Flash::from(p.FLASH),
flexcomm: (
peripherals::flexcomm::Flexcomm0::from((p.FLEXCOMM0, p.I2C0, p.I2S0, p.SPI0, p.USART0)),
peripherals::flexcomm::Flexcomm1::from((p.FLEXCOMM1, p.I2C1, p.I2S1, p.SPI1, p.USART1)),
peripherals::flexcomm::Flexcomm2::from((p.FLEXCOMM2, p.I2C2, p.I2S2, p.SPI2, p.USART2)),
peripherals::flexcomm::Flexcomm3::from((p.FLEXCOMM3, p.I2C3, p.I2S3, p.SPI3, p.USART3)),
peripherals::flexcomm::Flexcomm4::from((p.FLEXCOMM4, p.I2C4, p.I2S4, p.SPI4, p.USART4)),
peripherals::flexcomm::Flexcomm5::from((p.FLEXCOMM5, p.I2C5, p.I2S5, p.SPI5, p.USART5)),
peripherals::flexcomm::Flexcomm6::from((p.FLEXCOMM6, p.I2C6, p.I2S6, p.SPI6, p.USART6)),
peripherals::flexcomm::Flexcomm7::from((p.FLEXCOMM7, p.I2C7, p.I2S7, p.SPI7, p.USART7)),
peripherals::flexcomm::Flexcomm8::from((p.FLEXCOMM8, p.SPI8)),
),
gpio: Gpio::from(p.GPIO),
iocon: Iocon::from(p.IOCON),
pmc: Pmc::from(p.PMC),
syscon: Syscon::from(p.SYSCON),
usbfs: Usbfs::from((p.USB0, p.USBFSH)),
utick: Utick::from(p.UTICK0),
ADC0: p.ADC0,
CRC_ENGINE: p.CRC_ENGINE,
CTIMER0: p.CTIMER0,
SCT0: p.SCT0,
CPUID: cp.CPUID,
DCB: cp.DCB,
DWT: cp.DWT,
MPU: cp.MPU,
NVIC: cp.NVIC,
SCB: cp.SCB,
SYST: cp.SYST,
}
}
pub fn take() -> Option<Self> {
Some(Self::new(
raw::Peripherals::take()?,
raw::CorePeripherals::take()?,
))
}
pub unsafe fn steal() -> Self {
Self::new(raw::Peripherals::steal(), raw::CorePeripherals::steal())
}
}
impl From<(raw::Peripherals, raw::CorePeripherals)> for Peripherals {
fn from(raw: (raw::Peripherals, raw::CorePeripherals)) -> Self {
Peripherals::new(raw.0, raw.1)
}
}
pub fn enable_cycle_counter() {
unsafe { &mut raw::CorePeripherals::steal().DWT }.enable_cycle_counter();
}
pub fn get_cycle_count() -> u32 {
raw::DWT::get_cycle_count()
}
pub fn wait_at_least(delay_usecs: u32) {
enable_cycle_counter();
let max_cpu_speed = 150_000_000;
let period = max_cpu_speed / 1_000_000;
let current = get_cycle_count() as u64;
let mut target = current + period as u64 * delay_usecs as u64;
if target > 0xFFFF_FFFF {
target -= 0xFFFF_FFFF;
while target < get_cycle_count() as u64 { continue; }
}
while target > get_cycle_count() as u64 { continue; }
}