mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-22 15:23:23 +00:00
@ -23,14 +23,12 @@
|
|||||||
|
|
||||||
#include "driver/acpi/acpi.h"
|
#include "driver/acpi/acpi.h"
|
||||||
#include "driver/disk/ata.h"
|
#include "driver/disk/ata.h"
|
||||||
#include "driver/keyboard/ps2_keyboard.h"
|
|
||||||
#include "driver/mouse/ps2_mouse.h"
|
|
||||||
#include "driver/multiboot2/multiboot2.h"
|
#include "driver/multiboot2/multiboot2.h"
|
||||||
#include <time/timer.h>
|
#include <time/timer.h>
|
||||||
|
|
||||||
#include <arch/x86_64/driver/apic/apic_timer.h>
|
#include <arch/x86_64/driver/apic/apic_timer.h>
|
||||||
#include <virt/kvm/kvm.h>
|
|
||||||
#include <debug/bug.h>
|
#include <debug/bug.h>
|
||||||
|
#include <virt/kvm/kvm.h>
|
||||||
|
|
||||||
extern int rs_driver_init();
|
extern int rs_driver_init();
|
||||||
extern void rs_softirq_init();
|
extern void rs_softirq_init();
|
||||||
@ -56,8 +54,7 @@ ul bsp_idt_size, bsp_gdt_size;
|
|||||||
struct gdtr gdtp;
|
struct gdtr gdtp;
|
||||||
struct idtr idtp;
|
struct idtr idtp;
|
||||||
ul _stack_start;
|
ul _stack_start;
|
||||||
void reload_gdt()
|
void reload_gdt() {
|
||||||
{
|
|
||||||
|
|
||||||
gdtp.size = bsp_gdt_size - 1;
|
gdtp.size = bsp_gdt_size - 1;
|
||||||
gdtp.gdt_vaddr = (ul)phys_2_virt((ul)&GDT_Table);
|
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");
|
asm volatile("lgdt (%0) \n\t" ::"r"(&gdtp) : "memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
void reload_idt()
|
void reload_idt() {
|
||||||
{
|
|
||||||
|
|
||||||
idtp.size = bsp_idt_size - 1;
|
idtp.size = bsp_idt_size - 1;
|
||||||
idtp.idt_vaddr = (ul)phys_2_virt((ul)&IDT_Table);
|
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();
|
rs_init_before_mem_init();
|
||||||
|
|
||||||
_stack_start =
|
_stack_start =
|
||||||
@ -147,7 +142,6 @@ void system_initialize()
|
|||||||
|
|
||||||
cpu_init();
|
cpu_init();
|
||||||
|
|
||||||
ps2_keyboard_init();
|
|
||||||
io_mfence();
|
io_mfence();
|
||||||
|
|
||||||
rs_pci_init();
|
rs_pci_init();
|
||||||
@ -179,8 +173,7 @@ void system_initialize()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 操作系统内核从这里开始执行
|
// 操作系统内核从这里开始执行
|
||||||
void Start_Kernel(void)
|
void Start_Kernel(void) {
|
||||||
{
|
|
||||||
|
|
||||||
// 获取multiboot2的信息
|
// 获取multiboot2的信息
|
||||||
uint64_t mb2_info, mb2_magic;
|
uint64_t mb2_info, mb2_magic;
|
||||||
@ -201,16 +194,12 @@ void Start_Kernel(void)
|
|||||||
io_mfence();
|
io_mfence();
|
||||||
|
|
||||||
// idle
|
// idle
|
||||||
while (1)
|
while (1) {
|
||||||
{
|
|
||||||
// 如果调用的时候,启用了中断,则hlt。否则认为是bug
|
// 如果调用的时候,启用了中断,则hlt。否则认为是bug
|
||||||
if (get_rflags() & 0x200)
|
if (get_rflags() & 0x200) {
|
||||||
{
|
|
||||||
// kdebug("hlt");
|
// kdebug("hlt");
|
||||||
hlt();
|
hlt();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
BUG_ON(1);
|
BUG_ON(1);
|
||||||
pause();
|
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;
|
||||||
// pub mod ps2_keyboard_inode;
|
// 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_OUTBUF_FULL 0x01 // 键盘的输出缓冲区已满标志位
|
||||||
#define PS2_KEYBOARD_FLAG_INBUF_FULL 0x02 // 键盘的输入缓冲区已满标志位
|
#define PS2_KEYBOARD_FLAG_INBUF_FULL 0x02 // 键盘的输入缓冲区已满标志位
|
||||||
|
|
||||||
// 等待向键盘控制器写入信息完成
|
// 等待向键盘控制器写入信息完成
|
||||||
// todo: bugfix:在不包含ps2键盘控制器的机器上,这里会卡死
|
// 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_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)
|
// #define wait_ps2_keyboard_read() (1)
|
||||||
|
|
||||||
extern struct vfs_file_operations_t ps2_keyboard_fops;
|
extern struct vfs_file_operations_t ps2_keyboard_fops;
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 初始化键盘驱动程序的函数
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void ps2_keyboard_init();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 键盘驱动卸载函数
|
* @brief 键盘驱动卸载函数
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user