mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-18 20:36:31 +00:00
设备驱动模型:完善platform bus相关内容。并注册串口到sysfs (#403)
* 完成初始化platform bus * 删除旧的sysfs * 把uart驱动移动到tty/serial文件夹下 * 完成将串口挂载到sysfs * 修复vfs系统调用未能follow symlink的问题 * 修复shell未能正确获取pwd的问题
This commit is contained in:
9
kernel/src/arch/io.rs
Normal file
9
kernel/src/arch/io.rs
Normal file
@ -0,0 +1,9 @@
|
||||
/// 每个架构都需要实现的IO接口
|
||||
pub trait PortIOArch {
|
||||
unsafe fn in8(port: u16) -> u8;
|
||||
unsafe fn in16(port: u16) -> u16;
|
||||
unsafe fn in32(port: u16) -> u32;
|
||||
unsafe fn out8(port: u16, data: u8);
|
||||
unsafe fn out16(port: u16, data: u16);
|
||||
unsafe fn out32(port: u16, data: u32);
|
||||
}
|
@ -7,6 +7,8 @@ use crate::{
|
||||
mm::PhysAddr,
|
||||
};
|
||||
|
||||
pub mod io;
|
||||
|
||||
/// TraitPciArch Pci架构相关函数,任何架构都应独立实现trait里的函数
|
||||
pub trait TraitPciArch {
|
||||
/// @brief 读取寄存器值,x86_64架构通过读取两个特定io端口实现
|
||||
|
@ -1,2 +1,3 @@
|
||||
pub mod bitops;
|
||||
pub mod irqflags;
|
||||
pub mod pio;
|
||||
|
35
kernel/src/arch/x86_64/asm/pio.rs
Normal file
35
kernel/src/arch/x86_64/asm/pio.rs
Normal file
@ -0,0 +1,35 @@
|
||||
use crate::arch::io::PortIOArch;
|
||||
|
||||
pub struct X86_64PortIOArch;
|
||||
|
||||
impl PortIOArch for X86_64PortIOArch {
|
||||
#[inline(always)]
|
||||
unsafe fn in8(port: u16) -> u8 {
|
||||
x86::io::inb(port)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn in16(port: u16) -> u16 {
|
||||
x86::io::inw(port)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn in32(port: u16) -> u32 {
|
||||
x86::io::inl(port)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn out8(port: u16, data: u8) {
|
||||
x86::io::outb(port, data)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn out16(port: u16, data: u16) {
|
||||
x86::io::outw(port, data)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
unsafe fn out32(port: u16, data: u32) {
|
||||
x86::io::outl(port, data)
|
||||
}
|
||||
}
|
@ -5,7 +5,7 @@ use hashbrown::HashSet;
|
||||
use x86::time::rdtsc;
|
||||
use x86_64::registers::model_specific::EferFlags;
|
||||
|
||||
use crate::driver::uart::uart_device::c_uart_send_str;
|
||||
use crate::driver::tty::serial::serial8250::send_to_default_serial8250_port;
|
||||
use crate::include::bindings::bindings::{
|
||||
multiboot2_get_memory, multiboot2_iter, multiboot_mmap_entry_t,
|
||||
};
|
||||
@ -148,7 +148,7 @@ impl MemoryManagementArch for X86_64MMArch {
|
||||
// 初始化物理内存区域(从multiboot2中获取)
|
||||
let areas_count =
|
||||
Self::init_memory_area_from_multiboot2().expect("init memory area failed");
|
||||
c_uart_send_str(0x3f8, "x86 64 init end\n\0".as_ptr());
|
||||
send_to_default_serial8250_port("x86 64 init end\n\0".as_bytes());
|
||||
|
||||
return &PHYS_MEMORY_AREAS[0..areas_count];
|
||||
}
|
||||
@ -229,7 +229,7 @@ impl X86_64MMArch {
|
||||
unsafe fn init_memory_area_from_multiboot2() -> Result<usize, SystemError> {
|
||||
// 这个数组用来存放内存区域的信息(从C获取)
|
||||
let mut mb2_mem_info: [multiboot_mmap_entry_t; 512] = mem::zeroed();
|
||||
c_uart_send_str(0x3f8, "init_memory_area_from_multiboot2 begin\n\0".as_ptr());
|
||||
send_to_default_serial8250_port("init_memory_area_from_multiboot2 begin\n\0".as_bytes());
|
||||
|
||||
let mut mb2_count: u32 = 0;
|
||||
multiboot2_iter(
|
||||
@ -237,7 +237,7 @@ impl X86_64MMArch {
|
||||
&mut mb2_mem_info as *mut [multiboot_mmap_entry_t; 512] as usize as *mut c_void,
|
||||
&mut mb2_count,
|
||||
);
|
||||
c_uart_send_str(0x3f8, "init_memory_area_from_multiboot2 2\n\0".as_ptr());
|
||||
send_to_default_serial8250_port("init_memory_area_from_multiboot2 2\n\0".as_bytes());
|
||||
|
||||
let mb2_count = mb2_count as usize;
|
||||
let mut areas_count = 0usize;
|
||||
@ -255,7 +255,7 @@ impl X86_64MMArch {
|
||||
areas_count += 1;
|
||||
}
|
||||
}
|
||||
c_uart_send_str(0x3f8, "init_memory_area_from_multiboot2 end\n\0".as_ptr());
|
||||
send_to_default_serial8250_port("init_memory_area_from_multiboot2 end\n\0".as_bytes());
|
||||
kinfo!("Total memory size: {} MB, total areas from multiboot2: {mb2_count}, valid areas: {areas_count}", total_mem_size / 1024 / 1024);
|
||||
|
||||
return Ok(areas_count);
|
||||
@ -291,7 +291,7 @@ impl VirtAddr {
|
||||
|
||||
/// @brief 初始化内存管理模块
|
||||
pub fn mm_init() {
|
||||
c_uart_send_str(0x3f8, "mm_init\n\0".as_ptr());
|
||||
send_to_default_serial8250_port("mm_init\n\0".as_bytes());
|
||||
PrintkWriter
|
||||
.write_fmt(format_args!("mm_init() called\n"))
|
||||
.unwrap();
|
||||
@ -301,7 +301,7 @@ pub fn mm_init() {
|
||||
.compare_exchange(false, true, Ordering::SeqCst, Ordering::SeqCst)
|
||||
.is_err()
|
||||
{
|
||||
c_uart_send_str(0x3f8, "mm_init err\n\0".as_ptr());
|
||||
send_to_default_serial8250_port("mm_init err\n\0".as_bytes());
|
||||
panic!("mm_init() can only be called once");
|
||||
}
|
||||
|
||||
|
@ -20,3 +20,5 @@ pub use self::pci::pci::X86_64PciArch as PciArch;
|
||||
pub use self::mm::X86_64MMArch as MMArch;
|
||||
|
||||
pub use interrupt::X86_64InterruptArch as CurrentIrqArch;
|
||||
|
||||
pub use crate::arch::asm::pio::X86_64PortIOArch as CurrentPortIOArch;
|
||||
|
Reference in New Issue
Block a user