use super::gpio::{
DisplayPins, MicrophonePins, BTN_A, BTN_B, EDGE00, EDGE01, EDGE02, EDGE08, EDGE09, EDGE12,
EDGE16, INT_SCL, INT_SDA, SCL, SDA, UART_RX, UART_TX,
};
use crate::{
hal::{
gpio::{p0, p1, Disconnected, Level, OpenDrainConfig::Disconnect0HighDrive1},
twim, twis, uarte,
},
pac,
};
#[allow(non_snake_case)]
pub struct Board {
pub pins: Pins,
pub edge: Edge,
pub display_pins: DisplayPins,
pub buttons: Buttons,
pub speaker_pin: p0::P0_00<Disconnected>,
pub microphone_pins: MicrophonePins,
pub i2c_internal: I2CInternalPins,
pub i2c_external: I2CExternalPins,
pub uart: UartPins,
pub CBP: pac::CBP,
pub CPUID: pac::CPUID,
pub DCB: pac::DCB,
pub DWT: pac::DWT,
pub FPB: pac::FPB,
pub FPU: pac::FPU,
pub ITM: pac::ITM,
pub MPU: pac::MPU,
pub NVIC: pac::NVIC,
pub SCB: pac::SCB,
pub SYST: pac::SYST,
pub TPIU: pac::TPIU,
pub CLOCK: pac::CLOCK,
pub FICR: pac::FICR,
pub GPIOTE: pac::GPIOTE,
pub PPI: pac::PPI,
pub PWM0: pac::PWM0,
pub PWM1: pac::PWM1,
pub PWM2: pac::PWM2,
pub PWM3: pac::PWM3,
pub RADIO: pac::RADIO,
pub RNG: pac::RNG,
pub RTC0: pac::RTC0,
pub RTC1: pac::RTC1,
pub RTC2: pac::RTC2,
pub TEMP: pac::TEMP,
pub TIMER0: pac::TIMER0,
pub TIMER1: pac::TIMER1,
pub TIMER2: pac::TIMER2,
pub TIMER3: pac::TIMER3,
pub TIMER4: pac::TIMER4,
pub TWIM0: pac::TWIM0,
pub TWIS0: pac::TWIS0,
pub UARTE0: pac::UARTE0,
pub UARTE1: pac::UARTE1,
pub ADC: pac::SAADC,
pub POWER: pac::POWER,
pub SPI0: pac::SPI0,
pub SPI1: pac::SPI1,
pub SPI2: pac::SPI2,
pub UART0: pac::UART0,
pub TWI0: pac::TWI0,
pub TWI1: pac::TWI1,
pub SPIS1: pac::SPIS1,
pub ECB: pac::ECB,
pub AAR: pac::AAR,
pub CCM: pac::CCM,
pub WDT: pac::WDT,
pub QDEC: pac::QDEC,
pub LPCOMP: pac::LPCOMP,
pub NVMC: pac::NVMC,
pub UICR: pac::UICR,
}
impl Board {
pub fn take() -> Option<Self> {
Some(Self::new(
pac::Peripherals::take()?,
pac::CorePeripherals::take()?,
))
}
pub fn new(p: pac::Peripherals, cp: pac::CorePeripherals) -> Self {
let p0parts = p0::Parts::new(p.P0);
let p1parts = p1::Parts::new(p.P1);
Self {
pins: Pins {
p0_01: p0parts.p0_01,
p0_07: p0parts.p0_07,
p0_13: p0parts.p0_13,
p0_17: p0parts.p0_17,
p0_18: p0parts.p0_18,
p0_25: p0parts.p0_25,
p0_27: p0parts.p0_27,
p0_29: p0parts.p0_29,
p1_01: p1parts.p1_01,
p1_03: p1parts.p1_03,
p1_04: p1parts.p1_04,
p1_06: p1parts.p1_06,
p1_07: p1parts.p1_07,
p1_09: p1parts.p1_09,
},
edge: Edge {
e00: p0parts.p0_02,
e01: p0parts.p0_03,
e02: p0parts.p0_04,
e08: p0parts.p0_10,
e09: p0parts.p0_09,
e12: p0parts.p0_12,
e16: p1parts.p1_02,
},
display_pins: DisplayPins {
col1: p0parts.p0_28.into_push_pull_output(Level::High),
col2: p0parts.p0_11.into_push_pull_output(Level::High),
col3: p0parts.p0_31.into_push_pull_output(Level::High),
col4: p1parts.p1_05.into_push_pull_output(Level::High),
col5: p0parts.p0_30.into_push_pull_output(Level::High),
row1: p0parts.p0_21.into_push_pull_output(Level::Low),
row2: p0parts.p0_22.into_push_pull_output(Level::Low),
row3: p0parts.p0_15.into_push_pull_output(Level::Low),
row4: p0parts.p0_24.into_push_pull_output(Level::Low),
row5: p0parts.p0_19.into_push_pull_output(Level::Low),
},
buttons: Buttons {
button_a: p0parts.p0_14.into_floating_input(),
button_b: p0parts.p0_23.into_floating_input(),
},
speaker_pin: p0parts.p0_00,
microphone_pins: MicrophonePins {
mic_in: p0parts.p0_05.into_floating_input(),
mic_run: p0parts
.p0_20
.into_open_drain_output(Disconnect0HighDrive1, Level::Low),
},
i2c_internal: I2CInternalPins {
scl: p0parts.p0_08.into_floating_input(),
sda: p0parts.p0_16.into_floating_input(),
},
i2c_external: I2CExternalPins {
scl: p0parts.p0_26.into_floating_input(),
sda: p1parts.p1_00.into_floating_input(),
},
uart: UartPins {
tx: p0parts.p0_06.into_push_pull_output(Level::High),
rx: p1parts.p1_08.into_floating_input(),
},
CBP: cp.CBP,
CPUID: cp.CPUID,
DCB: cp.DCB,
DWT: cp.DWT,
FPB: cp.FPB,
FPU: cp.FPU,
ITM: cp.ITM,
MPU: cp.MPU,
NVIC: cp.NVIC,
SCB: cp.SCB,
SYST: cp.SYST,
TPIU: cp.TPIU,
CLOCK: p.CLOCK,
FICR: p.FICR,
GPIOTE: p.GPIOTE,
PPI: p.PPI,
PWM0: p.PWM0,
PWM1: p.PWM1,
PWM2: p.PWM2,
PWM3: p.PWM3,
RADIO: p.RADIO,
RNG: p.RNG,
RTC0: p.RTC0,
RTC1: p.RTC1,
RTC2: p.RTC2,
TEMP: p.TEMP,
TIMER0: p.TIMER0,
TIMER1: p.TIMER1,
TIMER2: p.TIMER2,
TIMER3: p.TIMER3,
TIMER4: p.TIMER4,
TWIM0: p.TWIM0,
TWIS0: p.TWIS0,
UARTE0: p.UARTE0,
UARTE1: p.UARTE1,
ADC: p.SAADC,
SPI0: p.SPI0,
SPI1: p.SPI1,
SPI2: p.SPI2,
POWER: p.POWER,
UART0: p.UART0,
TWI0: p.TWI0,
TWI1: p.TWI1,
SPIS1: p.SPIS1,
ECB: p.ECB,
AAR: p.AAR,
CCM: p.CCM,
WDT: p.WDT,
QDEC: p.QDEC,
LPCOMP: p.LPCOMP,
NVMC: p.NVMC,
UICR: p.UICR,
}
}
}
#[allow(missing_docs)]
pub struct Pins {
pub p0_01: p0::P0_01<Disconnected>,
pub p0_07: p0::P0_07<Disconnected>,
pub p0_13: p0::P0_13<Disconnected>,
pub p0_17: p0::P0_17<Disconnected>,
pub p0_18: p0::P0_18<Disconnected>,
pub p0_25: p0::P0_25<Disconnected>,
pub p0_27: p0::P0_27<Disconnected>,
pub p0_29: p0::P0_29<Disconnected>,
pub p1_01: p1::P1_01<Disconnected>,
pub p1_03: p1::P1_03<Disconnected>,
pub p1_04: p1::P1_04<Disconnected>,
pub p1_06: p1::P1_06<Disconnected>,
pub p1_07: p1::P1_07<Disconnected>,
pub p1_09: p1::P1_09<Disconnected>,
}
#[allow(missing_docs)]
pub struct Edge {
pub e00: EDGE00<Disconnected>, pub e01: EDGE01<Disconnected>, pub e08: EDGE08<Disconnected>,
pub e09: EDGE09<Disconnected>,
pub e12: EDGE12<Disconnected>,
pub e02: EDGE02<Disconnected>, pub e16: EDGE16<Disconnected>,
}
pub struct Buttons {
pub button_a: BTN_A,
pub button_b: BTN_B,
}
pub struct I2CInternalPins {
pub scl: INT_SCL,
pub sda: INT_SDA,
}
impl From<I2CInternalPins> for twim::Pins {
fn from(pins: I2CInternalPins) -> Self {
Self {
scl: pins.scl.degrade(),
sda: pins.sda.degrade(),
}
}
}
impl From<I2CInternalPins> for twis::Pins {
fn from(pins: I2CInternalPins) -> Self {
Self {
scl: pins.scl.degrade(),
sda: pins.sda.degrade(),
}
}
}
pub struct I2CExternalPins {
pub scl: SCL,
pub sda: SDA,
}
impl From<I2CExternalPins> for twim::Pins {
fn from(pins: I2CExternalPins) -> Self {
Self {
scl: pins.scl.degrade(),
sda: pins.sda.degrade(),
}
}
}
impl From<I2CExternalPins> for twis::Pins {
fn from(pins: I2CExternalPins) -> Self {
Self {
scl: pins.scl.degrade(),
sda: pins.sda.degrade(),
}
}
}
pub struct UartPins {
tx: UART_TX,
rx: UART_RX,
}
impl From<UartPins> for uarte::Pins {
fn from(pins: UartPins) -> Self {
Self {
txd: pins.tx.degrade(),
rxd: pins.rx.degrade(),
cts: None,
rts: None,
}
}
}