Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions kernel/src/driver/tty/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use thingbuf::mpsc::{
errors::{TryRecvError, TrySendError},
};

use crate::{libs::rwlock::RwLock, kdebug};
use crate::libs::rwlock::RwLock;

pub mod tty_device;

Expand Down Expand Up @@ -286,7 +286,7 @@ impl TtyCore {
pub fn disable_echo(&self) {
self.state.write().set(TtyCoreState::ECHO_ON, false);
}

/// @brief 判断当前tty核心,是否开启了输入回显
///
/// @return true 开启了输入回显
Expand Down
15 changes: 8 additions & 7 deletions kernel/src/driver/tty/tty_device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,9 @@ use crate::{
devfs::{devfs_register, DevFS, DeviceINode},
vfs::{file::FileMode, FilePrivateData, FileType, IndexNode, Metadata, ROOT_INODE},
},
include::bindings::bindings::{printk_color, textui_putchar, BLACK, WHITE},
kdebug, kerror,
include::bindings::bindings::{textui_putchar, BLACK, WHITE},
kerror,
libs::rwlock::RwLock,
print,
syscall::SystemError,
};

Expand Down Expand Up @@ -240,7 +239,7 @@ impl IndexNode for TtyDevice {

loop {
let mut buf = [0u8; 512];
let r: Result<usize, TtyError> = self.core.read_output(&mut buf[0..511], false);
let r: Result<usize, TtyError> = self.core.output(&mut buf[0..511], false);
let len;
match r {
Ok(x) => {
Expand All @@ -256,9 +255,11 @@ impl IndexNode for TtyDevice {
break;
}
// 输出到屏幕
print!("{}", unsafe {
core::str::from_utf8_unchecked(&buf[0..len])
});
unsafe {
for x in buf {
textui_putchar(x as u16, WHITE, BLACK);
}
}
}
return Ok(());
}
Expand Down
94 changes: 66 additions & 28 deletions kernel/src/libs/keyboard_parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -296,21 +296,15 @@ impl TypeOneFSMState {
) -> TypeOneFSMState {
// 判断按键是被按下还是抬起
let flag_make = if (scancode & (TYPE1_KEYCODE_FLAG_BREAK as u8)) > 0 {
false
false //up
} else {
true
true //down
};

// 计算扫描码位于码表的第几行
let mut col: usize = 0;
let mut col: bool = false;
let index = scancode & 0x7f;

// shift被按下
if scancode_status.shift_l || scancode_status.shift_r {
col = 1;
}

let ch = TYPE1_KEY_CODE_MAPTABLE[col + 2 * index as usize];
//kdebug!("in type3 ch is {:#x}\n",ch);
let mut key = KeyFlag::OtherKey; // 可视字符

Expand All @@ -328,7 +322,17 @@ impl TypeOneFSMState {
key = KeyFlag::NoneFlag;
}
0x38 => {
scancode_status.ctrl_r = flag_make;
scancode_status.alt_r = flag_make;
key = KeyFlag::NoneFlag;
}
0x3A => {
if scancode_status.caps_lock {
scancode_status.caps_lock = !flag_make;
}
//if caps_lock: true, flag_make: true => cap_lock: false
else {
scancode_status.caps_lock = flag_make;
} //else false => cap_lock: true
key = KeyFlag::NoneFlag;
}
_ => {
Expand All @@ -339,6 +343,23 @@ impl TypeOneFSMState {
}
}

// shift被按下
if scancode_status.shift_l || scancode_status.shift_r {
col = true;
}

if scancode_status.caps_lock {
if index >= 0x10 && index <= 0x19 {
col = !col;
} else if index >= 0x1e && index <= 0x26 {
col = !col;
} else if index >= 0x2c && index <= 0x32 {
col = !col;
}
}

let ch = TYPE1_KEY_CODE_MAPTABLE[col as usize + 2 * index as usize];

if key != KeyFlag::NoneFlag {
Self::emit(tty, ch);
}
Expand Down Expand Up @@ -411,6 +432,7 @@ impl TypeOneFSMState {

/// 按键状态
#[derive(Debug)]
#[allow(dead_code)]
pub struct ScanCodeStatus {
// Shift 按键
shift_l: bool,
Expand Down Expand Up @@ -441,6 +463,7 @@ pub struct ScanCodeStatus {
kp_forward_slash: bool,
// 回车
kp_enter: bool,
caps_lock: bool,
}

impl ScanCodeStatus {
Expand All @@ -467,6 +490,7 @@ impl ScanCodeStatus {
arrow_r: false,
kp_forward_slash: false,
kp_enter: false,
caps_lock: false,
}
}
}
Expand All @@ -481,27 +505,41 @@ const TYPE1_KEY_CODE_MAPTABLE: [u8; 256] = [
/*0x0c*/ '-' as u8, '_' as u8, /*0x0d*/ '=' as u8, '+' as u8,
/*0x0e \b */ 8 as u8, 8 as u8, // BACKSPACE
/*0x0f*/ '\t' as u8, '\t' as u8, // TAB
/*0x10*/ 'q' as u8, 'Q' as u8, /*0x11*/ 'w' as u8, 'W' as u8,
/*0x12*/ 'e' as u8, 'E' as u8, /*0x13*/ 'r' as u8, 'R' as u8,
/*0x14*/ 't' as u8, 'T' as u8, /*0x15*/ 'y' as u8, 'Y' as u8,
/*0x16*/ 'u' as u8, 'U' as u8, /*0x17*/ 'i' as u8, 'I' as u8,
/*0x18*/ 'o' as u8, 'O' as u8, /*0x19*/ 'p' as u8, 'P' as u8,
/*0x1a*/ '[' as u8, '{' as u8, /*0x1b*/ ']' as u8, '}' as u8,
/*0x1c*/ '\n' as u8, '\n' as u8, // ENTER
////////////////////////character///////////////////////////
/*0x10*/ 'q' as u8,
'Q' as u8, /*0x11*/ 'w' as u8, 'W' as u8, /*0x12*/ 'e' as u8, 'E' as u8,
/*0x13*/ 'r' as u8, 'R' as u8, /*0x14*/ 't' as u8, 'T' as u8,
/*0x15*/ 'y' as u8, 'Y' as u8, /*0x16*/ 'u' as u8, 'U' as u8,
/*0x17*/ 'i' as u8, 'I' as u8, /*0x18*/ 'o' as u8, 'O' as u8,
/*0x19*/ 'p' as u8, 'P' as u8,
////////////////////////character///////////////////////////

/*0x1a*/ '[' as u8,
'{' as u8, /*0x1b*/ ']' as u8, '}' as u8, /*0x1c*/ '\n' as u8,
'\n' as u8, // ENTER
/*0x1d*/ 0x1d, 0x1d, // CTRL Left
/*0x1e*/ 'a' as u8, 'A' as u8, /*0x1f*/ 's' as u8, 'S' as u8,
/*0x20*/ 'd' as u8, 'D' as u8, /*0x21*/ 'f' as u8, 'F' as u8,
/*0x22*/ 'g' as u8, 'G' as u8, /*0x23*/ 'h' as u8, 'H' as u8,
/*0x24*/ 'j' as u8, 'J' as u8, /*0x25*/ 'k' as u8, 'K' as u8,
/*0x26*/ 'l' as u8, 'L' as u8, /*0x27*/ ';' as u8, ':' as u8,
/*0x28*/ '\'' as u8, '"' as u8, /*0x29*/ '`' as u8, '~' as u8, /*0x2a*/ 0x2a,
0x2a, // SHIFT Left
/*0x2b*/ '\\' as u8, '|' as u8, /*0x2c*/ 'z' as u8, 'Z' as u8,
/*0x2d*/ 'x' as u8, 'X' as u8, /*0x2e*/ 'c' as u8, 'C' as u8,
////////////////////////character///////////////////////////
/*0x1e*/ 'a' as u8,
'A' as u8, /*0x1f*/ 's' as u8, 'S' as u8, /*0x20*/ 'd' as u8, 'D' as u8,
/*0x21*/ 'f' as u8, 'F' as u8, /*0x22*/ 'g' as u8, 'G' as u8,
/*0x23*/ 'h' as u8, 'H' as u8, /*0x24*/ 'j' as u8, 'J' as u8,
/*0x25*/ 'k' as u8, 'K' as u8, /*0x26*/ 'l' as u8, 'L' as u8,
////////////////////////character///////////////////////////

/*0x27*/ ';' as u8,
':' as u8, /*0x28*/ '\'' as u8, '"' as u8, /*0x29*/ '`' as u8, '~' as u8,
/*0x2a*/ 0x2a, 0x2a, // SHIFT Left
/*0x2b*/ '\\' as u8, '|' as u8,
////////////////////////character///////////////////////////
/*0x2c*/ 'z' as u8,
'Z' as u8, /*0x2d*/ 'x' as u8, 'X' as u8, /*0x2e*/ 'c' as u8, 'C' as u8,
/*0x2f*/ 'v' as u8, 'V' as u8, /*0x30*/ 'b' as u8, 'B' as u8,
/*0x31*/ 'n' as u8, 'N' as u8, /*0x32*/ 'm' as u8, 'M' as u8,
/*0x33*/ ',' as u8, '<' as u8, /*0x34*/ '.' as u8, '>' as u8,
/*0x35*/ '/' as u8, '?' as u8, /*0x36*/ 0x36, 0x36, // SHIFT Right
////////////////////////character///////////////////////////

/*0x33*/ ',' as u8,
'<' as u8, /*0x34*/ '.' as u8, '>' as u8, /*0x35*/ '/' as u8, '?' as u8,
/*0x36*/ 0x36, 0x36, // SHIFT Right
/*0x37*/ '*' as u8, '*' as u8, /*0x38*/ 0x38, 0x38, // ALT Left
/*0x39*/ ' ' as u8, ' ' as u8, /*0x3a*/ 0, 0, // CAPS LOCK
/*0x3b*/ 0, 0, // F1
Expand Down