fix: 修复了ps2和tty初始化顺序的错误 (#497)

* 修复了ps2和tty初始化顺序的错误
This commit is contained in:
Chiichen
2024-01-21 01:38:45 +08:00
committed by GitHub
parent 74ffde667e
commit 3e3c6316aa
3 changed files with 35 additions and 28 deletions

View File

@ -23,14 +23,12 @@
#include "driver/acpi/acpi.h"
#include "driver/disk/ata.h"
#include "driver/keyboard/ps2_keyboard.h"
#include "driver/mouse/ps2_mouse.h"
#include "driver/multiboot2/multiboot2.h"
#include <time/timer.h>
#include <arch/x86_64/driver/apic/apic_timer.h>
#include <virt/kvm/kvm.h>
#include <debug/bug.h>
#include <virt/kvm/kvm.h>
extern int rs_driver_init();
extern void rs_softirq_init();
@ -56,8 +54,7 @@ ul bsp_idt_size, bsp_gdt_size;
struct gdtr gdtp;
struct idtr idtp;
ul _stack_start;
void reload_gdt()
{
void reload_gdt() {
gdtp.size = bsp_gdt_size - 1;
gdtp.gdt_vaddr = (ul)phys_2_virt((ul)&GDT_Table);
@ -65,8 +62,7 @@ void reload_gdt()
asm volatile("lgdt (%0) \n\t" ::"r"(&gdtp) : "memory");
}
void reload_idt()
{
void reload_idt() {
idtp.size = bsp_idt_size - 1;
idtp.idt_vaddr = (ul)phys_2_virt((ul)&IDT_Table);
@ -77,8 +73,7 @@ void reload_idt()
}
// 初始化系统各模块
void system_initialize()
{
void system_initialize() {
rs_init_before_mem_init();
_stack_start =
@ -147,7 +142,6 @@ void system_initialize()
cpu_init();
ps2_keyboard_init();
io_mfence();
rs_pci_init();
@ -179,8 +173,7 @@ void system_initialize()
}
// 操作系统内核从这里开始执行
void Start_Kernel(void)
{
void Start_Kernel(void) {
// 获取multiboot2的信息
uint64_t mb2_info, mb2_magic;
@ -201,16 +194,12 @@ void Start_Kernel(void)
io_mfence();
// idle
while (1)
{
while (1) {
// 如果调用的时候启用了中断则hlt。否则认为是bug
if (get_rflags() & 0x200)
{
if (get_rflags() & 0x200) {
// kdebug("hlt");
hlt();
}
else
{
} else {
BUG_ON(1);
pause();
}

View File

@ -1,2 +1,24 @@
use crate::init::initcall::INITCALL_LATE;
use core::ffi::c_void;
use system_error::SystemError;
use unified_init::macros::unified_init;
pub mod ps2_keyboard;
// pub mod ps2_keyboard_inode;
extern "C" {
fn ps2_keyboard_init() -> c_void;
}
/// 初始化ps2键盘
///
/// todo: 将ps2键盘适配到设备驱动模型后把初始化时机改为INITCALL_DEVICE
///
/// 当前是LATE的原因是键盘驱动的TypeOneFSM需要在tty设备初始化之后才能工作。
#[unified_init(INITCALL_LATE)]
fn rs_ps2_keyboard_init() -> Result<(), SystemError> {
unsafe {
ps2_keyboard_init();
}
return Ok(());
}

View File

@ -19,24 +19,20 @@
// ========= 检测键盘控制器输入/输出缓冲区是否已满
#define PS2_KEYBOARD_FLAG_OUTBUF_FULL 0x01 // 键盘的输出缓冲区已满标志位
#define PS2_KEYBOARD_FLAG_INBUF_FULL 0x02 // 键盘的输入缓冲区已满标志位
#define PS2_KEYBOARD_FLAG_INBUF_FULL 0x02 // 键盘的输入缓冲区已满标志位
// 等待向键盘控制器写入信息完成
// todo: bugfix:在不包含ps2键盘控制器的机器上这里会卡死
#define wait_ps2_keyboard_write() while (io_in8(PORT_PS2_KEYBOARD_STATUS) & PS2_KEYBOARD_FLAG_INBUF_FULL)
#define wait_ps2_keyboard_write() \
while (io_in8(PORT_PS2_KEYBOARD_STATUS) & PS2_KEYBOARD_FLAG_INBUF_FULL)
// #define wait_ps2_keyboard_write() (1)
// 等待从键盘控制器读取信息完成
#define wait_ps2_keyboard_read() while (io_in8(PORT_PS2_KEYBOARD_STATUS) & PS2_KEYBOARD_FLAG_OUTBUF_FULL)
#define wait_ps2_keyboard_read() \
while (io_in8(PORT_PS2_KEYBOARD_STATUS) & PS2_KEYBOARD_FLAG_OUTBUF_FULL)
// #define wait_ps2_keyboard_read() (1)
extern struct vfs_file_operations_t ps2_keyboard_fops;
/**
* @brief 初始化键盘驱动程序的函数
*
*/
void ps2_keyboard_init();
/**
* @brief 键盘驱动卸载函数
*