aboutsummaryrefslogtreecommitdiff
path: root/src/bringup/mod.rs
diff options
context:
space:
mode:
authorNathan Perry <np@nathanperry.dev>2024-09-24 00:13:11 -0400
committerNathan Perry <np@nathanperry.dev>2024-09-26 06:50:09 -0400
commitc15509282eeb620b6ce70059ea10c4657cff7474 (patch)
tree361ab3803fdd0748565f69b5a56824ac84f2e23c /src/bringup/mod.rs
parent34f44829237f33a9940c12f57126a53f2a9c23f3 (diff)
pio i2s
Diffstat (limited to 'src/bringup/mod.rs')
-rw-r--r--src/bringup/mod.rs85
1 files changed, 74 insertions, 11 deletions
diff --git a/src/bringup/mod.rs b/src/bringup/mod.rs
index 71c2d4b..e59e8c3 100644
--- a/src/bringup/mod.rs
+++ b/src/bringup/mod.rs
@@ -8,7 +8,12 @@ use embassy_rp::{
Output,
Pin,
},
+ i2c::{
+ self,
+ I2c,
+ },
peripherals::{
+ I2C0,
SPI0,
SPI1,
USB,
@@ -27,48 +32,87 @@ use embassy_sync::{
},
mutex::Mutex,
};
+use molybdos::embassy_rp::peripherals::{
+ DMA_CH5,
+ I2C1,
+ PIO0,
+};
use static_cell::StaticCell;
use tap::Pipe;
+use crate::SensorI2c;
use molybdos::pal::StaticOutput;
+pub mod i2s;
+
+pub use i2s::{
+ StaticI2S,
+ I2S,
+};
+
embassy_rp::bind_interrupts! {
struct Irqs {
USBCTRL_IRQ => embassy_rp::usb::InterruptHandler<USB>;
ADC_IRQ_FIFO => adc::InterruptHandler;
+ I2C0_IRQ => i2c::InterruptHandler<I2C0>;
+ I2C1_IRQ => i2c::InterruptHandler<I2C1>;
+ PIO0_IRQ_0 => embassy_rp::pio::InterruptHandler<PIO0>;
}
}
-static BME_SPI: StaticCell<Mutex<CriticalSectionRawMutex, Spi<SPI1, Async>>> = StaticCell::new();
-static SD_SPI: StaticCell<Mutex<CriticalSectionRawMutex, Spi<SPI0, Async>>> = StaticCell::new();
+static BME_SPI: StaticCell<Mutex<CriticalSectionRawMutex, spi::Spi<SPI1, Async>>> =
+ StaticCell::new();
+static SD_SPI: StaticCell<Mutex<CriticalSectionRawMutex, spi::Spi<SPI0, Async>>> =
+ StaticCell::new();
static ADC: StaticCell<Mutex<CriticalSectionRawMutex, Adc<adc::Async>>> = StaticCell::new();
+static SENSOR_I2C: StaticCell<Mutex<CriticalSectionRawMutex, SensorI2c>> = StaticCell::new();
+
+static PIO0: StaticCell<embassy_rp::pio::Pio<'static, PIO0>> = StaticCell::new();
-pub struct Split<BmeSpi, BmeSpiMutex, SdSpi, SdSpiMutex>
-where
+pub struct Split<
+ BmeSpi,
+ BmeSpiMutex,
+ SdSpi,
+ SdSpiMutex,
+ // SensorI2c,
+ // SensorI2cMutex,
+> where
SdSpiMutex: RawMutex + 'static,
SdSpi: 'static,
BmeSpiMutex: RawMutex + 'static,
BmeSpi: 'static,
+ // SensorI2cMutex: RawMutex + 'static,
+ // SensorI2c: 'static,
{
pub sd_spi: &'static Mutex<SdSpiMutex, SdSpi>,
pub sd_cs: StaticOutput,
pub bme_spi: &'static Mutex<BmeSpiMutex, BmeSpi>,
pub bme_cs: StaticOutput,
+ // pub sensor_i2c: &'static Mutex<SensorI2cMutex, SensorI2c>,
pub wdt: Watchdog,
pub usb: molybdos::pal::UsbDriver,
- pub adc: &'static Mutex<CriticalSectionRawMutex, Adc<'static, adc::Async>>,
+ pub i2s: i2s::I2S<'static, 'static, embassy_rp::peripherals::PIO0, 0>,
+ pub i2s_dma: DMA_CH5,
+ pub adc: &'static Mutex<CriticalSectionRawMutex, Adc<'static, adc::Async>>,
// pub leds: [StaticOutput; crate::N_LED],
}
pub fn split(
config: embassy_rp::config::Config,
-) -> Split<crate::BMESpi, CriticalSectionRawMutex, crate::SdSpi, CriticalSectionRawMutex> {
- let periphs = embassy_rp::init(config);
+) -> Split<
+ crate::BMESpi,
+ CriticalSectionRawMutex,
+ crate::SdSpi,
+ CriticalSectionRawMutex,
+ // crate::SensorI2c,
+ // CriticalSectionRawMutex,
+> {
+ let mut periphs = embassy_rp::init(config);
let wdt = Watchdog::new(periphs.WATCHDOG);
- let bme_cs = periphs.PIN_5.degrade().pipe(|cs| Output::new(cs, Level::High));
+ let bme_cs = periphs.PIN_13.degrade().pipe(|cs| Output::new(cs, Level::High));
let bme_spi = {
let sck = periphs.PIN_10;
let mosi = periphs.PIN_11;
@@ -83,7 +127,7 @@ pub fn split(
BME_SPI.init(bme_spi)
};
- let sd_cs = periphs.PIN_9.degrade().pipe(|cs| Output::new(cs, Level::High));
+ let sd_cs = periphs.PIN_17.degrade().pipe(|cs| Output::new(cs, Level::High));
let sd_spi = {
let mosi = periphs.PIN_19;
let sck = periphs.PIN_18;
@@ -99,20 +143,39 @@ pub fn split(
SD_SPI.init(sd_spi)
};
+ // let i2c = {
+ // let mut conf = i2c::Config::default();
+ // conf.frequency = 400_000;
+ //
+ // let i2c = SensorI2c::new_async(periphs.I2C1, periphs.PIN_23, periphs.PIN_22, Irqs, conf)
+ // .pipe(Mutex::new);
+ // SENSOR_I2C.init(i2c)
+ // };
+
let usb_driver = embassy_rp::usb::Driver::new(periphs.USB, Irqs);
let adc = Adc::new(periphs.ADC, Irqs, adc::Config::default());
-
let adc = ADC.init(Mutex::new(adc));
+ // {
+ // StaticOutput::new(periphs.PIN_24, Level::High);
+ // }
+
+ let pio0 = embassy_rp::pio::Pio::new(periphs.PIO0, Irqs);
+ let pio = PIO0.init(pio0);
+
+ let i2s = i2s::I2S::new(pio, periphs.PIN_24, periphs.PIN_23, periphs.PIN_25);
+
Split {
sd_spi,
sd_cs,
bme_spi,
bme_cs,
wdt,
+ // sensor_i2c: i2c,
usb: usb_driver,
-
+ i2s,
+ i2s_dma: periphs.DMA_CH5,
adc,
}
}