use mkl25z4::{GPIOA, GPIOB, GPIOC, GPIOD, GPIOE, SIM, SPI0, SPI1}; use mkl25z4_hal::gpio::{self, gpioa, gpiob, gpioc, gpiod, gpioe, GpioExt}; use mkl25z4_hal::spi::{self, Phase, Polarity, Spi}; pub struct Pins { /// 5V supply for the LED (active high). pub enable_5v: gpioa::PA1>, /// Red display frontlight LEDs (active high). pub red: gpioe::PE29>, /// Green display frontlight LEDs (active high). pub green: gpioe::PE30>, /// Blue display frontlight LEDs (active high). pub blue: gpioe::PE31>, /// Top switch (active low). pub top_switch: gpioc::PC1>, /// Left switches (top to bottom, active low). pub left_switches: ( gpiod::PD1>, gpiod::PD2>, gpiod::PD3>, gpiod::PD4>, ), /// Right switches (top to bottom, active low). pub right_switches: ( gpioa::PA13>, gpioa::PA12>, gpioa::PA5>, gpioa::PA4>, ), /// Ambient light sensor enable (active high). pub als_en: gpioe::PE20>, // TODO: ADC for the ambient light sensor. /// Ambient light sensor. pub als: gpioe::PE21>, // TODO: PWM for the buzzer. /// Buzzer (active high). pub buzzer: gpioc::PC3>, /// NRF IRQ line (active low). pub nrf_irq: gpiob::PB0>, /// NRF chip select (active low). pub nrf_cs: gpiob::PB1>, /// NRF chip enable. pub nrf_ce: gpiob::PB2>, /// NRF supply voltage enable (active low). pub nrf_pwr: gpiob::PB3>, /// SPI for the NRF module. pub nrf_spi: Spi< SPI1, gpiob::PB16, gpiob::PB17, gpiod::PD5, >, /// BME280 chip select (active low). pub bme_cs: gpioc::PC2>, /// Display busy (active low). pub display_busy: gpioc::PC4>, /// Display chip select (active low). pub display_cs: gpioc::PC8>, /// Display data/command. pub display_dc: gpioc::PC9>, /// Display reset (active low). pub display_rst: gpioc::PC10>, /// Display supply voltage enable (active low). pub display_pwr: gpioc::PC11>, /// SPI for both display and BME280. pub display_bme_spi: Spi< SPI0, gpioc::PC7, gpioc::PC6, gpioc::PC5, >, } impl Pins { pub fn configure( sim: &mut SIM, gpioa: GPIOA, gpiob: GPIOB, gpioc: GPIOC, gpiod: GPIOD, gpioe: GPIOE, spi0: SPI0, spi1: SPI1, ) -> Pins { let mut gpioa = gpioa.split(sim); let mut gpiob = gpiob.split(sim); let mut gpioc = gpioc.split(sim); let mut gpiod = gpiod.split(sim); let mut gpioe = gpioe.split(sim); // SPI0 for the display/BME module. let mosi = gpioc.pc7.into_alternate(&mut gpioc.pddr); let miso = gpioc.pc6.into_alternate(&mut gpioc.pddr); let sck = gpioc.pc5.into_alternate(&mut gpioc.pddr); let mode = spi::Mode { polarity: Polarity::IdleLow, phase: Phase::CaptureOnFirstTransition, }; let spi0 = Spi::spi0(spi0, mosi, miso, sck, mode, sim); // SPI1 for the NRF module. let mosi = gpiob.pb16.into_alternate(&mut gpiob.pddr); let miso = gpiob.pb17.into_alternate(&mut gpiob.pddr); let sck = gpiod.pd5.into_alternate(&mut gpiod.pddr); let mode = spi::Mode { polarity: Polarity::IdleLow, phase: Phase::CaptureOnFirstTransition, }; let spi1 = Spi::spi1(spi1, mosi, miso, sck, mode, sim); Pins { enable_5v: gpioa.pa1.into_push_pull_output(&mut gpioa.pddr), red: gpioe.pe29.into_push_pull_output(&mut gpioe.pddr), green: gpioe.pe30.into_push_pull_output(&mut gpioe.pddr), blue: gpioe.pe31.into_push_pull_output(&mut gpioe.pddr), top_switch: gpioc.pc1.into_pull_up_input(&mut gpioc.pddr), left_switches: ( gpiod.pd1.into_pull_up_input(&mut gpiod.pddr), gpiod.pd2.into_pull_up_input(&mut gpiod.pddr), gpiod.pd3.into_pull_up_input(&mut gpiod.pddr), gpiod.pd4.into_pull_up_input(&mut gpiod.pddr), ), right_switches: ( gpioa.pa13.into_pull_up_input(&mut gpioa.pddr), gpioa.pa12.into_pull_up_input(&mut gpioa.pddr), gpioa.pa5.into_pull_up_input(&mut gpioa.pddr), gpioa.pa4.into_pull_up_input(&mut gpioa.pddr), ), als_en: gpioe.pe20.into_push_pull_output(&mut gpioe.pddr), als: gpioe.pe21.into_floating_input(&mut gpioe.pddr), buzzer: gpioc.pc3.into_push_pull_output(&mut gpioc.pddr), nrf_irq: gpiob.pb0.into_pull_up_input(&mut gpiob.pddr), nrf_cs: gpiob.pb1.into_push_pull_output(&mut gpiob.pddr), nrf_ce: gpiob.pb2.into_push_pull_output(&mut gpiob.pddr), nrf_pwr: gpiob.pb3.into_push_pull_output(&mut gpiob.pddr), nrf_spi: spi1, bme_cs: gpioc.pc2.into_push_pull_output(&mut gpioc.pddr), display_busy: gpioc.pc4.into_pull_up_input(&mut gpioc.pddr), display_cs: gpioc.pc8.into_push_pull_output(&mut gpioc.pddr), display_dc: gpioc.pc9.into_push_pull_output(&mut gpioc.pddr), display_rst: gpioc.pc10.into_push_pull_output(&mut gpioc.pddr), display_pwr: gpioc.pc11.into_push_pull_output(&mut gpioc.pddr), display_bme_spi: spi0, } } }