summaryrefslogtreecommitdiff
path: root/firmware/rust
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/rust')
-rw-r--r--firmware/rust/Cargo.lock99
-rw-r--r--firmware/rust/Cargo.toml2
-rw-r--r--firmware/rust/src/main.rs165
3 files changed, 118 insertions, 148 deletions
diff --git a/firmware/rust/Cargo.lock b/firmware/rust/Cargo.lock
index eb2f956..4764d91 100644
--- a/firmware/rust/Cargo.lock
+++ b/firmware/rust/Cargo.lock
@@ -18,18 +18,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0ffd3d69bd89910509a5d31d1f1353f38ccffdd116dd0099bbd6627f7bd8ad8"
[[package]]
-name = "as-slice"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45403b49e3954a4b8428a0ac21a4b7afadccf92bfd96273f1a58cd4812496ae0"
-dependencies = [
- "generic-array 0.12.4",
- "generic-array 0.13.3",
- "generic-array 0.14.5",
- "stable_deref_trait",
-]
-
-[[package]]
name = "atomic-polyfill"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -146,23 +134,26 @@ dependencies = [
[[package]]
name = "cortex-m-rtic"
-version = "0.5.9"
+version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb77bb72c171d0aa52a2954d8dc7e3f0800ab54b8df7d826f138abbea9eb2794"
+checksum = "c6b82f1c39acd6c3a35c2013b6110c20f5bc534522791fabadeed49ccada2dce"
dependencies = [
+ "bare-metal 1.0.0",
"cortex-m",
"cortex-m-rtic-macros",
- "heapless 0.6.1",
+ "heapless",
"rtic-core",
+ "rtic-monotonic",
"version_check",
]
[[package]]
name = "cortex-m-rtic-macros"
-version = "0.5.3"
+version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cc874eda99515b15e67f03562726a530388f454431096d30131051b52b840559"
+checksum = "9e8e9645ef54bec1cf70ac33e9bf9566e6507ab5b41ae6baf3735662194e8607"
dependencies = [
+ "proc-macro-error",
"proc-macro2",
"quote",
"rtic-syntax",
@@ -198,43 +189,6 @@ dependencies = [
]
[[package]]
-name = "generic-array"
-version = "0.12.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
-dependencies = [
- "typenum",
-]
-
-[[package]]
-name = "generic-array"
-version = "0.13.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f797e67af32588215eaaab8327027ee8e71b9dd0b2b26996aedf20c030fce309"
-dependencies = [
- "typenum",
-]
-
-[[package]]
-name = "generic-array"
-version = "0.14.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803"
-dependencies = [
- "typenum",
- "version_check",
-]
-
-[[package]]
-name = "hash32"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4041af86e63ac4298ce40e5cca669066e75b6f1aa3390fe2561ffa5e1d9f4cc"
-dependencies = [
- "byteorder",
-]
-
-[[package]]
name = "hash32"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -251,24 +205,12 @@ checksum = "607c8a29735385251a339424dd462993c0fed8fa09d378f259377df08c126022"
[[package]]
name = "heapless"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634bd4d29cbf24424d0a4bfcbf80c6960129dc24424752a7d1d1390607023422"
-dependencies = [
- "as-slice",
- "generic-array 0.14.5",
- "hash32 0.1.1",
- "stable_deref_trait",
-]
-
-[[package]]
-name = "heapless"
version = "0.7.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f6733da246dc2af610133c8be0667170fd68e8ca5630936b520300eee8846f9"
dependencies = [
"atomic-polyfill",
- "hash32 0.2.1",
+ "hash32",
"rustc_version 0.4.0",
"spin",
"stable_deref_trait",
@@ -292,7 +234,7 @@ dependencies = [
"arraydeque",
"either",
"embedded-hal",
- "heapless 0.7.15",
+ "heapless",
"keyberon-macros",
"usb-device",
]
@@ -458,18 +400,25 @@ dependencies = [
[[package]]
name = "rtic-core"
-version = "0.3.1"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9369355b04d06a3780ec0f51ea2d225624db777acbc60abd8ca4832da5c1a42"
+
+[[package]]
+name = "rtic-monotonic"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8bd58a6949de8ff797a346a28d9f13f7b8f54fa61bb5e3cb0985a4efb497a5ef"
+checksum = "fb8b0b822d1a366470b9cea83a1d4e788392db763539dc4ba022bcc787fece82"
[[package]]
name = "rtic-syntax"
-version = "0.4.0"
+version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8152fcaa845720d61e6cc570548b89144c2c307f18a480bbd97e55e9f6eeff04"
+checksum = "3ad3ae243dd8d0a1b064615f664d4fa7e63929939074c564cbe5efdc4c503065"
dependencies = [
"indexmap",
"proc-macro2",
+ "quote",
"syn",
]
@@ -602,12 +551,6 @@ dependencies = [
]
[[package]]
-name = "typenum"
-version = "1.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
-
-[[package]]
name = "unicode-ident"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/firmware/rust/Cargo.toml b/firmware/rust/Cargo.toml
index 54f44cc..870f048 100644
--- a/firmware/rust/Cargo.toml
+++ b/firmware/rust/Cargo.toml
@@ -11,7 +11,7 @@ cortex-m = "0.7"
cortex-m-rt = { version = "0.7", features = ["device"] }
panic-halt = "0.2"
keyberon = { git = "https://github.com/TeXiToi/keyberon" }
-cortex-m-rtic = { version = "0.5", default-features = false, features = ["cortex-m-7"] }
+cortex-m-rtic = "1.0.0"
embedded-hal = "0.2"
usb-device = "0.2"
nb = "1.0"
diff --git a/firmware/rust/src/main.rs b/firmware/rust/src/main.rs
index 523ece9..20d232a 100644
--- a/firmware/rust/src/main.rs
+++ b/firmware/rust/src/main.rs
@@ -5,17 +5,18 @@
use panic_halt as _;
use core::convert::Infallible;
-use keyberon::action::{k, l, m, Action::*, HoldTapConfig};
+use keyberon::action::{k, l, Action::*, HoldTapConfig};
use keyberon::key_code::KeyCode::*;
-
+use keyberon::layout::{Event, Layout};
type Action = keyberon::action::Action<CustomActions>;
-use keyberon::layout::Layout;
+
use keyberon::matrix::Matrix;
use rtic::app;
use stm32f0xx_hal as hal;
use usb_device::bus::UsbBusAllocator;
use usb_device::class::UsbClass as _;
+use usb_device::device::UsbDeviceState;
extern crate smart_leds;
extern crate ws2812_spi;
@@ -37,7 +38,6 @@ use hal::{
use keyberon::debounce::Debouncer;
use keyberon::key_code::KbHidReport;
-use keyberon::key_code::KeyCode;
type Spi = hal::spi::Spi<
stm32::SPI1,
@@ -367,22 +367,33 @@ impl Backlight {
}
}
-#[app(device = crate::hal::pac, peripherals = true)]
-const APP: () = {
- struct Resources {
+
+#[app(device = crate::hal::pac, peripherals = true, dispatchers = [CEC_CAN])]
+mod app {
+ use super::*;
+
+ #[shared]
+ struct Shared {
usb_dev: UsbDevice,
usb_class: UsbClass,
- matrix: Matrix<Pin<Input<PullUp>>, Pin<Output<PushPull>>, 12, 5>,
- debouncer: Debouncer<[[bool; 12]; 5]>,
+
+ #[lock_free]
layout: Layout<12, 5, 2, CustomActions>,
- timer: timers::Timer<stm32::TIM3>,
+ #[lock_free]
backlight: Backlight,
}
- #[init]
- fn init(mut c: init::Context) -> init::LateResources {
- static mut USB_BUS: Option<UsbBusAllocator<usb::UsbBusType>> = None;
+ #[local]
+ struct Local {
+ matrix: Matrix<Pin<Input<PullUp>>, Pin<Output<PushPull>>, 12, 5>,
+ debouncer: Debouncer<[[bool; 12]; 5]>,
+ timer: timers::Timer<stm32::TIM3>,
+ }
+
+ #[init(local = [bus: Option<UsbBusAllocator<usb::UsbBusType>> = None])]
+ fn init(mut c: init::Context) -> (Shared, Local, init::Monotonics) {
+
let mut rcc = c
.device
.RCC
@@ -401,8 +412,9 @@ const APP: () = {
pin_dm: gpioa.pa11,
pin_dp: gpioa.pa12,
};
- *USB_BUS = Some(usb::UsbBusType::new(usb));
- let usb_bus = USB_BUS.as_ref().unwrap();
+
+ *c.local.bus = Some(usb::UsbBusType::new(usb));
+ let usb_bus = c.local.bus.as_ref().unwrap();
// Handling of ws2812 leds
@@ -485,51 +497,51 @@ const APP: () = {
],
)});
- init::LateResources {
- usb_dev,
- usb_class,
- timer,
- debouncer: Debouncer::new([[false; 12]; 5], [[false; 12]; 5], 5),
- matrix: matrix.get(),
- layout: Layout::new(&LAYERS),
-
- backlight: Backlight {
- mode: BacklightMode::Off,
- brightness: 8,
+ (
+ Shared {
+ usb_dev,
+ usb_class,
+ layout: Layout::new(&LAYERS),
+ backlight: Backlight {
+ mode: BacklightMode::Off,
+ brightness: 8,
+ },
},
- }
+
+ Local {
+ timer,
+ debouncer: Debouncer::new([[false; 12]; 5], [[false; 12]; 5], 5),
+ matrix: matrix.get(),
+ },
+ init::Monotonics(),
+ )
}
- #[task(binds = USB, priority = 4, resources = [usb_dev, usb_class])]
+ #[task(binds = USB, priority = 3, shared = [usb_dev, usb_class])]
fn usb_rx(c: usb_rx::Context) {
- if c.resources.usb_dev.poll(&mut [c.resources.usb_class]) {
- c.resources.usb_class.poll();
- }
+ (c.shared.usb_dev, c.shared.usb_class).lock(|usb_dev, usb_class| {
+ if usb_dev.poll(&mut [usb_class]) {
+ usb_class.poll();
+ }
+ });
}
- #[task(
- binds = TIM3,
- priority = 2,
- resources = [matrix, debouncer, timer, layout, usb_class, backlight],
- )]
- fn tick(c: tick::Context) {
- c.resources.timer.wait().ok();
-
- for event in c
- .resources
- .debouncer
- .events(c.resources.matrix.get().unwrap())
- {
- c.resources.layout.event(event);
+ #[task(priority = 2, shared = [usb_dev, usb_class, layout, backlight])]
+ fn tick_keyberon(mut c: tick_keyberon::Context) {
+ let tick = c.shared.layout.tick();
+ if c.shared.usb_dev.lock(|d| d.state()) != UsbDeviceState::Configured {
+ return;
}
- let mut usb_class = c.resources.usb_class;
- let backlight = c.resources.backlight;
+ // match tick {
+ // CustomEvent::Release(()) => unsafe { cortex_m::asm::bootload(0x1FFFC800 as _) },
+ // _ => (),
+ // }
- match c.resources.layout.tick() {
+ match tick {
keyberon::layout::CustomEvent::Release(CustomActions::LightUp) => {
- let bl_val = &mut backlight.brightness;
+ let bl_val = &mut c.shared.backlight.brightness;
*bl_val = if *bl_val == 100 { 100 } else { *bl_val + 1 };
- usb_class.lock(|k| {
+ c.shared.usb_class.lock(|k| {
let leds = k.device_mut().leds_mut();
if leds.ws
.write(brightness(leds.leds.iter().cloned(), *bl_val)).is_err() {
@@ -538,9 +550,9 @@ const APP: () = {
});
}
keyberon::layout::CustomEvent::Release(CustomActions::LightDown) => {
- let bl_val = &mut backlight.brightness;
+ let bl_val = &mut c.shared.backlight.brightness;
*bl_val = if *bl_val == 0 { 0 } else { *bl_val - 1 };
- usb_class.lock(|k| {
+ c.shared.usb_class.lock(|k| {
let leds = k.device_mut().leds_mut();
if leds.ws
.write(brightness(leds.leds.iter().cloned(), *bl_val)).is_err() {
@@ -549,37 +561,52 @@ const APP: () = {
});
}
keyberon::layout::CustomEvent::Release(CustomActions::ColorCycle) => {
- backlight.next_color();
+ c.shared.backlight.next_color();
}
keyberon::layout::CustomEvent::Release(CustomActions::ModeCycle) => {
- backlight.next_mode();
+ c.shared.backlight.next_mode();
}
keyberon::layout::CustomEvent::Release(CustomActions::FreqUp) => {
- backlight.change_freq(true);
+ c.shared.backlight.change_freq(true);
}
keyberon::layout::CustomEvent::Release(CustomActions::FreqDown) => {
- backlight.change_freq(false);
+ c.shared.backlight.change_freq(false);
}
_ => (),
}
- usb_class.lock(|k| {
- backlight.refresh_leds(k.device_mut().leds_mut());
- });
- c.resources.layout.tick();
- send_report(c.resources.layout.keycodes(), &mut usb_class);
+ let report: KbHidReport = c.shared.layout.keycodes().collect();
+ if !c
+ .shared
+ .usb_class
+ .lock(|k| k.device_mut().set_keyboard_report(report.clone()))
+ {
+ return;
+ }
+ while let Ok(0) = c.shared.usb_class.lock(|k| k.write(report.as_bytes())) {}
}
- extern "C" {
- fn CEC_CAN();
+ #[task(priority = 2, capacity = 8, shared = [layout])]
+ fn handle_event(c: handle_event::Context, event: Event) {
+ c.shared.layout.event(event)
}
-};
-fn send_report(iter: impl Iterator<Item = KeyCode>, usb_class: &mut resources::usb_class<'_>) {
- use rtic::Mutex;
- let report: KbHidReport = iter.collect();
- if usb_class.lock(|k| k.device_mut().set_keyboard_report(report.clone())) {
- while let Ok(0) = usb_class.lock(|k| k.write(report.as_bytes())) {}
+ #[task(
+ binds = TIM3,
+ priority = 1,
+ local = [matrix, debouncer, timer],
+ )]
+ fn tick(c: tick::Context) {
+ c.local.timer.wait().ok();
+
+ for event in c
+ .local
+ .debouncer
+ .events(c.local.matrix.get().get())
+ {
+ handle_event::spawn(event).unwrap();
+ }
+ tick_keyberon::spawn().unwrap();
}
}