summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Cully <bjc@kublai.com>2019-08-09 19:48:52 -0400
committerBrian Cully <bjc@kublai.com>2019-08-09 19:48:52 -0400
commit93a52f6452cf322bddac2edd8d279b375d8f8ac0 (patch)
tree0f26939aa5124ba00a527eeef7ed83e2e72de04b
parent97adac62ea8f62b1de5e777889f309486e337dc3 (diff)
downloadbleusb-93a52f6452cf322bddac2edd8d279b375d8f8ac0.tar.gz
bleusb-93a52f6452cf322bddac2edd8d279b375d8f8ac0.zip
Send keyboard reports over I²C.
-rw-r--r--[-rwxr-xr-x]src/main.rs34
1 files changed, 22 insertions, 12 deletions
diff --git a/src/main.rs b/src/main.rs
index a89ac07..a7cfd8a 100755..100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,3 +1,5 @@
+//! Take USB keyboard reports and echo them over I²C.
+
#![no_std]
#![no_main]
@@ -28,11 +30,14 @@ use trinket_m0::{
};
use usb_host::Driver;
+// A very unsafe copy of an LED to turn on when things go really, really wrong.
static mut LED: usize = 0;
-static HANDLERS: HandlerArray = HandlerArray::new();
+// I²C address to send keyboard reports to.
+const NRF_WIREADDR: u8 = 4;
-const NRF_WIREADDR: u8 = 10;
+// Interrupt handler table.
+static HANDLERS: HandlerArray = HandlerArray::new();
#[entry]
fn main() -> ! {
@@ -101,7 +106,7 @@ fn main() -> ! {
Pa10<Output<OpenDrain>>,
> = unsafe { mem::transmute(&logger) };
unsafe { log::set_logger_racy(logger_ref).expect("couldn't set logger") };
- log::set_max_level(LevelFilter::Trace);
+ log::set_max_level(LevelFilter::Info);
let mut rtc_handler = rtc::setup(dp.RTC, &mut clocks);
@@ -117,7 +122,12 @@ fn main() -> ! {
&rtc::millis,
);
- let mut bootkbd = BootKeyboard::new();
+ let mut bootkbd = BootKeyboard::new(|addr, buf| {
+ info!("{}: {:?}", addr, buf);
+ let hdr: [u8; 2] = [I2CMessageType::Keyboard as u8, buf.len() as u8];
+ i2c_master.write(NRF_WIREADDR, &hdr).ok();
+ i2c_master.write(NRF_WIREADDR, &buf).ok();
+ });
let mut drivers: [&mut dyn Driver; 1] = [&mut bootkbd];
HANDLERS.with_overrides(|hs| {
@@ -131,15 +141,7 @@ fn main() -> ! {
info!("Bootstrap complete.");
- let mut last_tick = 0;
loop {
- let tick = rtc::millis();
- if tick >= last_tick + 1000 {
- last_tick = tick;
- let t: [u8; 4] = unsafe { core::mem::transmute(tick) };
- i2c_master.write(NRF_WIREADDR, &t).ok();
- }
-
usb_host.task(&mut drivers[..]);
wfi()
}
@@ -147,6 +149,14 @@ fn main() -> ! {
unreachable!();
}
+#[allow(unused)]
+#[repr(u8)]
+enum I2CMessageType {
+ Debug = 0x00,
+ Keyboard = 0x01,
+ Invalid = 0xff,
+}
+
#[panic_handler]
fn panic_handler(pi: &PanicInfo) -> ! {
let red_led: &mut Pa10<Output<OpenDrain>> = unsafe { mem::transmute(LED) };