mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-19 17:26:31 +00:00
@ -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();
|
||||
}
|
||||
|
@ -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(());
|
||||
}
|
||||
|
@ -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 键盘驱动卸载函数
|
||||
*
|
||||
|
Reference in New Issue
Block a user