aboutsummaryrefslogtreecommitdiff
path: root/src/bringup/mod.rs
blob: 71c2d4b40d1e0c626fe9484a99d3f74d11b965d5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use molybdos::reexport::*;

use embassy_rp::{
    adc,
    adc::Adc,
    gpio::{
        Level,
        Output,
        Pin,
    },
    peripherals::{
        SPI0,
        SPI1,
        USB,
    },
    spi,
    spi::{
        Async,
        Spi,
    },
    watchdog::Watchdog,
};
use embassy_sync::{
    blocking_mutex::raw::{
        CriticalSectionRawMutex,
        RawMutex,
    },
    mutex::Mutex,
};
use static_cell::StaticCell;
use tap::Pipe;

use molybdos::pal::StaticOutput;

embassy_rp::bind_interrupts! {
    struct Irqs {
        USBCTRL_IRQ => embassy_rp::usb::InterruptHandler<USB>;
        ADC_IRQ_FIFO => adc::InterruptHandler;
    }
}

static BME_SPI: StaticCell<Mutex<CriticalSectionRawMutex, Spi<SPI1, Async>>> = StaticCell::new();
static SD_SPI: StaticCell<Mutex<CriticalSectionRawMutex, Spi<SPI0, Async>>> = StaticCell::new();
static ADC: StaticCell<Mutex<CriticalSectionRawMutex, Adc<adc::Async>>> = StaticCell::new();

pub struct Split<BmeSpi, BmeSpiMutex, SdSpi, SdSpiMutex>
where
    SdSpiMutex: RawMutex + 'static,
    SdSpi: 'static,
    BmeSpiMutex: RawMutex + 'static,
    BmeSpi: 'static,
{
    pub sd_spi:  &'static Mutex<SdSpiMutex, SdSpi>,
    pub sd_cs:   StaticOutput,
    pub bme_spi: &'static Mutex<BmeSpiMutex, BmeSpi>,
    pub bme_cs:  StaticOutput,
    pub wdt:     Watchdog,
    pub usb:     molybdos::pal::UsbDriver,

    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);

    let wdt = Watchdog::new(periphs.WATCHDOG);

    let bme_cs = periphs.PIN_5.degrade().pipe(|cs| Output::new(cs, Level::High));
    let bme_spi = {
        let sck = periphs.PIN_10;
        let mosi = periphs.PIN_11;
        let miso = periphs.PIN_8;

        let mut conf = spi::Config::default();
        conf.frequency = 1_000_000;

        let bme_spi =
            Spi::new(periphs.SPI1, sck, mosi, miso, periphs.DMA_CH0, periphs.DMA_CH1, conf)
                .pipe(Mutex::<CriticalSectionRawMutex, _>::new);
        BME_SPI.init(bme_spi)
    };

    let sd_cs = periphs.PIN_9.degrade().pipe(|cs| Output::new(cs, Level::High));
    let sd_spi = {
        let mosi = periphs.PIN_19;
        let sck = periphs.PIN_18;
        let miso = periphs.PIN_20;

        let mut conf = spi::Config::default();
        conf.frequency = 16_000_000;

        let sd_spi =
            Spi::new(periphs.SPI0, sck, mosi, miso, periphs.DMA_CH3, periphs.DMA_CH4, conf)
                .pipe(Mutex::new);

        SD_SPI.init(sd_spi)
    };

    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));

    Split {
        sd_spi,
        sd_cs,
        bme_spi,
        bme_cs,
        wdt,
        usb: usb_driver,

        adc,
    }
}