From 93a52f6452cf322bddac2edd8d279b375d8f8ac0 Mon Sep 17 00:00:00 2001 From: Brian Cully Date: Fri, 9 Aug 2019 19:48:52 -0400 Subject: =?UTF-8?q?Send=20keyboard=20reports=20over=20I=C2=B2C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.rs | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) mode change 100755 => 100644 src/main.rs diff --git a/src/main.rs b/src/main.rs old mode 100755 new mode 100644 index a89ac07..a7cfd8a --- 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>, > = 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> = unsafe { mem::transmute(LED) }; -- cgit v1.2.3