forked from HaoboGu/rmk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathperipheral.rs
More file actions
120 lines (104 loc) · 4.13 KB
/
Copy pathperipheral.rs
File metadata and controls
120 lines (104 loc) · 4.13 KB
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
119
120
#![no_std]
#![no_main]
#[macro_use]
mod macros;
use bt_hci::controller::ExternalController;
use cyw43::aligned_bytes;
use cyw43_pio::PioSpi;
use defmt_rtt as _;
use embassy_executor::Spawner;
use embassy_rp::bind_interrupts;
use embassy_rp::clocks::RoscRng;
use embassy_rp::flash::{Async, Flash};
use embassy_rp::gpio::{Input, Level, Output};
use embassy_rp::peripherals::{DMA_CH0, DMA_CH1, PIO0};
use embassy_rp::pio::{self, Pio};
use embassy_time as _;
use panic_probe as _;
use rand::SeedableRng;
use rmk::ble::build_ble_stack;
use rmk::config::StorageConfig;
use rmk::debounce::default_debouncer::DefaultDebouncer;
use rmk::futures::future::join;
use rmk::matrix::Matrix;
use rmk::split::peripheral::run_rmk_split_peripheral;
use rmk::storage::new_storage_for_split_peripheral;
use rmk::watchdog::Rp2040Watchdog;
use rmk::{HostResources, run_all};
use static_cell::StaticCell;
bind_interrupts!(struct Irqs {
PIO0_IRQ_0 => pio::InterruptHandler<PIO0>;
DMA_IRQ_0 => embassy_rp::dma::InterruptHandler<DMA_CH0>, embassy_rp::dma::InterruptHandler<DMA_CH1>;
});
#[embassy_executor::task]
async fn cyw43_task(runner: cyw43::Runner<'static, cyw43::SpiBus<Output<'static>, PioSpi<'static, PIO0, 0>>>) -> ! {
runner.run().await
}
const FLASH_SIZE: usize = 2 * 1024 * 1024;
#[embassy_executor::main]
async fn main(spawner: Spawner) {
let p = embassy_rp::init(Default::default());
#[cfg(feature = "skip-cyw43-firmware")]
let (fw, clm, btfw, nvram) = {
static EMPTY: &cyw43::Aligned<cyw43::A4, [u8]> = &cyw43::Aligned([0u8; 0]);
(EMPTY, &[] as &[u8], EMPTY, EMPTY)
};
#[cfg(not(feature = "skip-cyw43-firmware"))]
let (fw, clm, btfw, nvram) = {
// IMPORTANT
//
// Download and make sure these files from https://github.com/embassy-rs/embassy/tree/main/cyw43-firmware
// are available in `./examples/rp-pico-w`. (should be automatic)
//
// IMPORTANT
let fw = aligned_bytes!("../cyw43-firmware/43439A0.bin");
let clm = aligned_bytes!("../cyw43-firmware/43439A0_clm.bin");
let btfw = aligned_bytes!("../cyw43-firmware/43439A0_btfw.bin");
let nvram = aligned_bytes!("../cyw43-firmware/nvram_rp2040.bin");
(fw, clm, btfw, nvram)
};
let pwr = Output::new(p.PIN_23, Level::Low);
let cs = Output::new(p.PIN_25, Level::High);
let mut pio = Pio::new(p.PIO0, Irqs);
let spi = PioSpi::new(
&mut pio.common,
pio.sm0,
cyw43_pio::DEFAULT_CLOCK_DIVIDER,
pio.irq0,
cs,
p.PIN_24,
p.PIN_29,
embassy_rp::dma::Channel::new(p.DMA_CH0, Irqs),
);
static STATE: StaticCell<cyw43::State> = StaticCell::new();
let state = STATE.init(cyw43::State::new());
let (_net_device, bt_device, mut control, runner) =
cyw43::new_with_bluetooth(state, pwr, spi, fw, btfw, nvram).await;
spawner.spawn(cyw43_task(runner).unwrap());
control.init(clm).await;
let controller: ExternalController<_, 10> = ExternalController::new(bt_device);
// Storage config
let flash = Flash::<_, Async, FLASH_SIZE>::new(p.FLASH, p.DMA_CH1, Irqs);
let storage_config = StorageConfig {
start_addr: 0x100000, // Start from 1M
num_sectors: 32,
..Default::default()
};
let mut storage = new_storage_for_split_peripheral(flash, storage_config).await;
// Pin config
let (row_pins, col_pins) = config_matrix_pins_rp!(peripherals: p, input: [PIN_6, PIN_7], output: [PIN_19, PIN_20]);
let debouncer = DefaultDebouncer::new();
let mut matrix = Matrix::<_, _, _, 2, 2, true>::new(row_pins, col_pins, debouncer);
let ble_addr = [0x7e, 0xfe, 0x73, 0x9e, 0x66, 0xe3];
let mut host_resources = HostResources::new();
let mut rosc_rng = RoscRng {};
let mut rng = rand_chacha::ChaCha12Rng::from_rng(&mut rosc_rng).unwrap();
let stack = build_ble_stack(controller, ble_addr, &mut rng, &mut host_resources).await;
let mut watchdog_runner = Rp2040Watchdog::default_runner(embassy_rp::watchdog::Watchdog::new(p.WATCHDOG));
// Start
join(
run_all!(matrix, storage, watchdog_runner),
run_rmk_split_peripheral(0, &stack),
)
.await;
}