diff options
author | Brian Cully <bjc@kublai.com> | 2019-08-09 19:48:52 -0400 |
---|---|---|
committer | Brian Cully <bjc@kublai.com> | 2019-08-09 19:48:52 -0400 |
commit | 93a52f6452cf322bddac2edd8d279b375d8f8ac0 (patch) | |
tree | 0f26939aa5124ba00a527eeef7ed83e2e72de04b | |
parent | 97adac62ea8f62b1de5e777889f309486e337dc3 (diff) | |
download | bleusb-93a52f6452cf322bddac2edd8d279b375d8f8ac0.tar.gz bleusb-93a52f6452cf322bddac2edd8d279b375d8f8ac0.zip |
Send keyboard reports over I²C.
-rw-r--r--[-rwxr-xr-x] | src/main.rs | 34 |
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) }; |