setup basic file structure

This commit is contained in:
2025-07-19 23:15:27 -06:00
parent 2d31e62d82
commit 0f4b4f8ffc
15 changed files with 362 additions and 275 deletions

View File

@@ -0,0 +1,59 @@
use crate::peripherals::PERIPHERAL_BUS;
pub use shared::keyboard::{KeyCode, KeyEvent, KeyState, Modifiers};
const REG_ID_KEY: u8 = 0x04;
const REG_ID_FIF: u8 = 0x09;
const KEY_CAPSLOCK: u8 = 1 << 5;
const KEY_NUMLOCK: u8 = 1 << 6;
const KEY_COUNT_MASK: u8 = 0x1F; // 0x1F == 31
pub async fn read_keyboard_fifo() -> Option<KeyEvent> {
let mut i2c = PERIPHERAL_BUS.get().lock().await;
let i2c = i2c.as_mut().unwrap();
let mut key_status = [0_u8; 1];
if i2c
.write_read_async(super::MCU_ADDR, [REG_ID_KEY], &mut key_status)
.await
.is_ok()
{
let _caps = key_status[0] & KEY_CAPSLOCK == KEY_CAPSLOCK;
let _num = key_status[0] & KEY_NUMLOCK == KEY_NUMLOCK;
let fifo_count = key_status[0] & KEY_COUNT_MASK;
if fifo_count >= 1 {
let mut event = [0_u8; 2];
if i2c
.write_read_async(super::MCU_ADDR, [REG_ID_FIF], &mut event)
.await
.is_ok()
{
return Some(KeyEvent {
state: KeyState::from(event[0]),
key: KeyCode::from(event[1]),
mods: Modifiers::NONE,
});
}
}
}
None
}
const REG_ID_DEB: u8 = 0x06;
const REG_ID_FRQ: u8 = 0x07;
pub async fn configure_keyboard(debounce: u8, poll_freq: u8) {
let mut i2c = PERIPHERAL_BUS.get().lock().await;
let i2c = i2c.as_mut().unwrap();
let _ = i2c
.write_read_async(super::MCU_ADDR, [REG_ID_DEB], &mut [debounce])
.await;
let _ = i2c
.write_read_async(super::MCU_ADDR, [REG_ID_FRQ], &mut [poll_freq])
.await;
}

View File

@@ -0,0 +1,98 @@
//! handles all the peripherals exposed by mcu through i2c (keyboard & battery registers)
//!
use embassy_rp::{
i2c::{Async, I2c},
peripherals::I2C1,
};
use embassy_sync::{blocking_mutex::raw::NoopRawMutex, lazy_lock::LazyLock, mutex::Mutex};
use embassy_time::Timer;
pub mod keyboard;
use crate::peripherals::keyboard::{configure_keyboard, read_keyboard_fifo};
const MCU_ADDR: u8 = 0x1F;
type I2CBUS = I2c<'static, I2C1, Async>;
pub static PERIPHERAL_BUS: LazyLock<Mutex<NoopRawMutex, Option<I2CBUS>>> =
LazyLock::new(|| Mutex::new(None));
const REG_ID_VER: u8 = 0x01;
const REG_ID_RST: u8 = 0x08;
const REG_ID_INT: u8 = 0x03;
pub async fn conf_peripherals(i2c: I2CBUS) {
Timer::after(embassy_time::Duration::from_millis(100)).await;
PERIPHERAL_BUS.get().lock().await.replace(i2c);
configure_keyboard(200, 100).await;
// empty keys
while read_keyboard_fifo().await.is_some() {}
// set_lcd_backlight(255).await;
set_key_backlight(0).await;
}
/// return major & minor mcu version
async fn get_version() -> (u8, u8) {
let mut i2c = PERIPHERAL_BUS.get().lock().await;
let i2c = i2c.as_mut().unwrap();
let mut ver = [0_u8; 1];
let _ = i2c.write_read_async(MCU_ADDR, [REG_ID_VER], &mut ver).await;
(ver[0] >> 4, ver[0] & 0x0F)
}
const REG_ID_BKL: u8 = 0x05;
pub async fn set_lcd_backlight(brightness: u8) {
let mut i2c = PERIPHERAL_BUS.get().lock().await;
let i2c = i2c.as_mut().unwrap();
let _ = i2c
.write_read_async(MCU_ADDR, [REG_ID_BKL], &mut [brightness])
.await;
}
pub async fn get_lcd_backlight() -> u8 {
let mut i2c = PERIPHERAL_BUS.get().lock().await;
let i2c = i2c.as_mut().unwrap();
let mut buf = [0_u8; 2];
let _ = i2c.write_read_async(MCU_ADDR, [REG_ID_BKL], &mut buf).await;
buf[1]
}
const REG_ID_BK2: u8 = 0x0A;
pub async fn set_key_backlight(brightness: u8) {
let mut i2c = PERIPHERAL_BUS.get().lock().await;
let i2c = i2c.as_mut().unwrap();
let _ = i2c
.write_read_async(MCU_ADDR, [REG_ID_BK2], &mut [brightness])
.await;
}
pub async fn get_key_backlight() -> u8 {
let mut i2c = PERIPHERAL_BUS.get().lock().await;
let i2c = i2c.as_mut().unwrap();
let mut buf = [0_u8; 2];
let _ = i2c.write_read_async(MCU_ADDR, [REG_ID_BK2], &mut buf).await;
buf[1]
}
const REG_ID_BAT: u8 = 0x0b;
pub async fn get_battery() -> u8 {
let mut i2c = PERIPHERAL_BUS.get().lock().await;
let i2c = i2c.as_mut().unwrap();
let mut buf = [0_u8; 2];
let _ = i2c.write_read_async(MCU_ADDR, [REG_ID_BAT], &mut buf).await;
buf[1]
}