mirror of
https://github.com/panpaul/tiny_os
synced 2024-09-20 09:45:19 +08:00
chore: kernel: driver: update api, pass fdt header
This commit is contained in:
parent
a2c5ba1494
commit
392d5ce59e
5
Cargo.lock
generated
5
Cargo.lock
generated
@ -83,9 +83,8 @@ checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fdt"
|
name = "fdt"
|
||||||
version = "0.1.5"
|
version = "0.2.0-alpha1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/panpaul/fdt.git#f913f139d02c936bbdea99371d9f1347e52b4953"
|
||||||
checksum = "784a4df722dc6267a04af36895398f59d21d07dce47232adf31ec0ff2fa45e67"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flate2"
|
name = "flate2"
|
||||||
|
@ -29,7 +29,7 @@ utils = { path = "../lib/utils", default-features = false }
|
|||||||
bitflags = "2.5"
|
bitflags = "2.5"
|
||||||
cfg-if = "1.0"
|
cfg-if = "1.0"
|
||||||
elf = { version = "0.7", default-features = false }
|
elf = { version = "0.7", default-features = false }
|
||||||
fdt = "0.1"
|
fdt = { git = "https://github.com/panpaul/fdt.git" } # fork from upstream
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
num-derive = "0.4"
|
num-derive = "0.4"
|
||||||
num-traits = { version = "0.2", default-features = false }
|
num-traits = { version = "0.2", default-features = false }
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
|
|
||||||
pub mod serial;
|
pub mod serial;
|
||||||
|
|
||||||
use fdt::node::FdtNode;
|
use fdt::{node::FdtNode, Fdt};
|
||||||
|
|
||||||
pub trait Driver {
|
pub trait Driver {
|
||||||
fn compatible() -> &'static [&'static str];
|
fn compatible() -> &'static [&'static str];
|
||||||
fn setup(_: FdtNode) -> Self;
|
fn setup(_: FdtNode, _: &Fdt) -> Self;
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,7 @@ use crate::drivers::serial::SerialDriver;
|
|||||||
use crate::drivers::Driver;
|
use crate::drivers::Driver;
|
||||||
use crate::plat::console::ConsoleDevice;
|
use crate::plat::console::ConsoleDevice;
|
||||||
use core::sync::atomic::{AtomicPtr, Ordering};
|
use core::sync::atomic::{AtomicPtr, Ordering};
|
||||||
use fdt::node::FdtNode;
|
use fdt::{node::FdtNode, Fdt};
|
||||||
use utils::addr::PhysAddr;
|
use utils::addr::PhysAddr;
|
||||||
|
|
||||||
// https://static.dev.sifive.com/FU540-C000-v1.0.pdf
|
// https://static.dev.sifive.com/FU540-C000-v1.0.pdf
|
||||||
@ -122,8 +122,8 @@ impl Driver for UartSifive {
|
|||||||
&["sifive,uart0"]
|
&["sifive,uart0"]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(fdt: FdtNode) -> Self {
|
fn setup(node: FdtNode, _: &Fdt) -> Self {
|
||||||
let addr = fdt.reg().unwrap().next().unwrap().starting_address;
|
let addr = node.reg().unwrap().next().unwrap().starting_address;
|
||||||
let addr = unsafe { mmap_phys_to_virt(PhysAddr::from(addr)) };
|
let addr = unsafe { mmap_phys_to_virt(PhysAddr::from(addr)) };
|
||||||
let addr: *mut u32 = addr.into();
|
let addr: *mut u32 = addr.into();
|
||||||
let uart = unsafe {
|
let uart = unsafe {
|
||||||
|
@ -3,6 +3,7 @@ use crate::drivers::serial::SerialDriver;
|
|||||||
use crate::drivers::Driver;
|
use crate::drivers::Driver;
|
||||||
use crate::plat::console::ConsoleDevice;
|
use crate::plat::console::ConsoleDevice;
|
||||||
use fdt::node::FdtNode;
|
use fdt::node::FdtNode;
|
||||||
|
use fdt::Fdt;
|
||||||
use uart_16550::MmioSerialPort;
|
use uart_16550::MmioSerialPort;
|
||||||
use utils::addr::PhysAddr;
|
use utils::addr::PhysAddr;
|
||||||
|
|
||||||
@ -17,8 +18,8 @@ impl Driver for Uart16550 {
|
|||||||
&["ns16550", "ns16550a"]
|
&["ns16550", "ns16550a"]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(fdt: FdtNode) -> Self {
|
fn setup(node: FdtNode, _: &Fdt) -> Self {
|
||||||
let addr = fdt.reg().unwrap().next().unwrap().starting_address;
|
let addr = node.reg().unwrap().next().unwrap().starting_address;
|
||||||
let addr = unsafe { mmap_phys_to_virt(PhysAddr::from(addr)) };
|
let addr = unsafe { mmap_phys_to_virt(PhysAddr::from(addr)) };
|
||||||
let mut serial_port = unsafe { MmioSerialPort::new(addr.into()) };
|
let mut serial_port = unsafe { MmioSerialPort::new(addr.into()) };
|
||||||
serial_port.init();
|
serial_port.init();
|
||||||
|
@ -49,7 +49,11 @@ pub fn rust_main() -> ! {
|
|||||||
|
|
||||||
fn setup_console(fdt: &Fdt) {
|
fn setup_console(fdt: &Fdt) {
|
||||||
// NOTE: ignore stdin: both stdin and stdout will go through stdout device
|
// NOTE: ignore stdin: both stdin and stdout will go through stdout device
|
||||||
match fdt.chosen().stdout().and_then(|stdout| ConsoleDriver::new(stdout)) {
|
match fdt
|
||||||
|
.chosen()
|
||||||
|
.stdout()
|
||||||
|
.and_then(|stdout| ConsoleDriver::new(stdout.node(), fdt))
|
||||||
|
{
|
||||||
None => warn!("No stdout device found or no compatible drivers found, falling back to platform default"),
|
None => warn!("No stdout device found or no compatible drivers found, falling back to platform default"),
|
||||||
Some(driver) => set_console(driver),
|
Some(driver) => set_console(driver),
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use crate::arch::EarlyConsole;
|
use crate::arch::EarlyConsole;
|
||||||
use crate::drivers::serial::{Uart16550, UartSifive};
|
use crate::drivers::serial::{Uart16550, UartSifive};
|
||||||
use crate::drivers::Driver;
|
use crate::drivers::Driver;
|
||||||
use fdt::node::FdtNode;
|
use fdt::{node::FdtNode, Fdt};
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use spin::Mutex;
|
use spin::Mutex;
|
||||||
|
|
||||||
@ -14,15 +14,15 @@ macro_rules! create_console_driver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ConsoleDriver {
|
impl ConsoleDriver {
|
||||||
pub fn new(fdt: FdtNode) -> Option<Self> {
|
pub fn new(node: FdtNode, fdt: &Fdt) -> Option<Self> {
|
||||||
if let Some(compatible) = fdt.compatible() {
|
if let Some(compatible) = node.compatible() {
|
||||||
$(
|
$(
|
||||||
if compatible
|
if compatible
|
||||||
.all()
|
.all()
|
||||||
.any(|s| $dynamic_driver::compatible().contains(&s))
|
.any(|s| $dynamic_driver::compatible().contains(&s))
|
||||||
{
|
{
|
||||||
debug!("Console: Using driver: {}", stringify!($dynamic_driver));
|
debug!("Console: Using driver: {}", stringify!($dynamic_driver));
|
||||||
return Some(ConsoleDriver::$dynamic_driver($dynamic_driver::setup(fdt)));
|
return Some(ConsoleDriver::$dynamic_driver($dynamic_driver::setup(node, fdt)));
|
||||||
}
|
}
|
||||||
)+
|
)+
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user