Browse Source

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

* 修复了ps2和tty初始化顺序的错误
Chiichen 1 year ago
parent
commit
3e3c6316aa

+ 8 - 19
kernel/src/arch/x86_64/init/main.c

@@ -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();
     }

+ 22 - 0
kernel/src/driver/keyboard/mod.rs

@@ -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(());
+}

+ 5 - 9
kernel/src/driver/keyboard/ps2_keyboard.h

@@ -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 键盘驱动卸载函数
  *