#![cfg(feature = "rp2350")]
#![allow(unused)]
#[cfg(feature = "multicore")]
use embassy_rp::multicore::{Stack, spawn_core1};
use cyw43_pio::PioSpi;
use embassy_rp::{
Peri, bind_interrupts, dma, gpio,
gpio::{Input, Level, Output, Pull},
i2c,
i2c::{Async as I2cAsync, I2c},
peripherals,
peripherals::{
DMA_CH0, DMA_CH1, DMA_CH2, DMA_CH3, DMA_CH4, DMA_CH5, DMA_CH6, DMA_CH7, FLASH, I2C0, PIO0, SPI0, SPI1, UART0,
UART1,
},
pio,
pio::InterruptHandler as PioInterruptHandler,
spi::{Async as SpiAsync, Config as SpiConfig, Spi},
uart,
uart::{Async as UartAsync, Uart},
};
use embassy_time::Delay;
bind_interrupts!(pub struct Irqs {
DMA_IRQ_0 => dma::InterruptHandler<DMA_CH0>,
dma::InterruptHandler<DMA_CH1>,
dma::InterruptHandler<DMA_CH2>,
dma::InterruptHandler<DMA_CH3>,
dma::InterruptHandler<DMA_CH4>,
dma::InterruptHandler<DMA_CH5>,
dma::InterruptHandler<DMA_CH6>,
dma::InterruptHandler<DMA_CH7>;
PIO0_IRQ_0 => pio::InterruptHandler<PIO0>;
UART0_IRQ => uart::InterruptHandler<UART0>;
UART1_IRQ => uart::InterruptHandler<UART1>;
I2C0_IRQ => i2c::InterruptHandler<I2C0>;
});
use embedded_hal_bus::spi::ExclusiveDevice;
pub type GyroSpiDevice = ExclusiveDevice<Spi<'static, SPI0, SpiAsync>, Output<'static>, Delay>;
pub type GyroInterruptPin = Input<'static>;
pub type BlackboxSpiDevice = ExclusiveDevice<Spi<'static, SPI1, SpiAsync>, Output<'static>, Delay>;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BlackboxInitError {
FeatureDisabled,
}
pub type AuxiliaryPioSpiDevice = ExclusiveDevice<PioSpi<'static, PIO0, 0>, Output<'static>, Delay>;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AuxiliaryPioInitError {
FeatureDisabled,
}
pub type PrimaryUartDevice = Uart<'static, UartAsync>;
pub type SecondaryUartDevice = Uart<'static, UartAsync>;
pub type PrimaryI2cDevice = I2c<'static, I2C0, I2cAsync>;
#[cfg(feature = "max7456")]
pub type ConcreteSpi = embassy_rp::spi::Spi<'static, embassy_rp::peripherals::SPI0, embassy_rp::spi::Async>;
#[cfg(feature = "max7456")]
pub type SharedDisplay = Mutex<CriticalSectionRawMutex, DisplayPortMax7456<&'static mut ConcreteSpi>>;
pub fn init_rp() -> (
Result<GyroSpiDevice, core::convert::Infallible>,
GyroInterruptPin,
Result<BlackboxSpiDevice, BlackboxInitError>,
Result<AuxiliaryPioSpiDevice, AuxiliaryPioInitError>,
PrimaryUartDevice,
SecondaryUartDevice,
PrimaryI2cDevice,
Peri<'static, FLASH>,
) {
let peripherals = embassy_rp::init(Default::default());
let spi0_cs = peripherals.PIN_17;
let spi0_clk = peripherals.PIN_18;
let spi0_mosi = peripherals.PIN_19;
let spi0_miso = peripherals.PIN_16;
let spi0_tx_dma = peripherals.DMA_CH0;
let spi0_rx_dma = peripherals.DMA_CH1;
let pin_20 = peripherals.PIN_20;
let spi1_cs = peripherals.PIN_13;
let spi1_clk = peripherals.PIN_10;
let spi1_mosi = peripherals.PIN_11;
let spi1_miso = peripherals.PIN_12;
let spi1_tx_dma = peripherals.DMA_CH2;
let spi1_rx_dma = peripherals.DMA_CH3;
let uart0 = peripherals.UART0;
let uart0_tx = peripherals.PIN_0;
let uart0_rx = peripherals.PIN_1;
let uart0_tx_dma = peripherals.DMA_CH4;
let uart0_rx_dma = peripherals.DMA_CH5;
let uart1 = peripherals.UART1;
let uart1_tx = peripherals.PIN_4;
let uart1_rx = peripherals.PIN_5;
let uart1_tx_dma = peripherals.DMA_CH6;
let uart1_rx_dma = peripherals.DMA_CH7;
let i2c0 = peripherals.I2C0;
let i2c0_scl = peripherals.PIN_9;
let i2c0_sda = peripherals.PIN_8;
let gyro_spi: Result<
ExclusiveDevice<
Spi<'_, embassy_rp::peripherals::SPI0, embassy_rp::spi::Async>,
Output<'_>,
embassy_time::Delay,
>,
core::convert::Infallible,
> = {
let mut spi_config = SpiConfig::default();
spi_config.frequency = 10_000_000;
let spi_bus =
Spi::new(peripherals.SPI0, spi0_clk, spi0_mosi, spi0_miso, spi0_tx_dma, spi0_rx_dma, Irqs, spi_config);
let cs_pin = Output::new(spi0_cs, Level::High);
ExclusiveDevice::new(spi_bus, cs_pin, embassy_time::Delay)
};
let gyro_interrupt = Input::new(pin_20, embassy_rp::gpio::Pull::Up);
#[cfg(feature = "blackbox")]
let blackbox_spi = {
let mut spi_config = SpiConfig::default();
spi_config.frequency = 400_000;
let spi_bus =
Spi::new(peripherals.SPI1, spi1_clk, spi1_mosi, spi1_miso, spi1_tx_dma, spi1_rx_dma, Irqs, spi_config);
let cs_pin = Output::new(spi1_cs, Level::High);
ExclusiveDevice::new(spi_bus, cs_pin, embassy_time::Delay).map_err(|_| unreachable!())
};
#[cfg(not(feature = "blackbox"))]
let blackbox_spi = Err(BlackboxInitError::FeatureDisabled);
let aux_pio_spi = Err(AuxiliaryPioInitError::FeatureDisabled);
let primary_uart = {
let mut uart_config = embassy_rp::uart::Config::default();
uart_config.baudrate = 115_200; Uart::new(uart0, uart0_tx, uart0_rx, Irqs, uart0_tx_dma, uart0_rx_dma, uart_config)
};
let secondary_uart = {
let mut uart_config = embassy_rp::uart::Config::default();
uart_config.baudrate = 115_200;
Uart::new(uart1, uart1_tx, uart1_rx, Irqs, uart1_tx_dma, uart1_rx_dma, uart_config)
};
let primary_i2c = {
let mut i2c_config = embassy_rp::i2c::Config::default();
i2c_config.frequency = 400_000; I2c::new_async(i2c0, i2c0_scl, i2c0_sda, Irqs, i2c_config)
};
(gyro_spi, gyro_interrupt, blackbox_spi, aux_pio_spi, primary_uart, secondary_uart, primary_i2c, peripherals.FLASH)
}