mirror of
https://github.com/panpaul/tiny_os
synced 2024-09-20 09:45:19 +08:00
feat: kernel/plat/generate_driver: make required packages self-contained
This commit is contained in:
parent
6577c5614e
commit
871a028ecf
@ -1,9 +1,6 @@
|
|||||||
use super::utils::generate_driver;
|
use super::utils::generate_driver;
|
||||||
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 fdt::{node::FdtNode, Fdt};
|
|
||||||
use log::debug;
|
|
||||||
use spin::Mutex;
|
use spin::Mutex;
|
||||||
|
|
||||||
generate_driver!(
|
generate_driver!(
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
macro_rules! generate_driver {
|
macro_rules! generate_driver {
|
||||||
(
|
(
|
||||||
$name:ident {
|
$name:ident {
|
||||||
($($dynamic_driver:ident),+),($($static_driver:ident),+)
|
($($dynamic_driver:ident),*),($($static_driver:ident),*)
|
||||||
} : $trait:ident {
|
} : $trait:ident {
|
||||||
$(fn $fn_name:ident (&mut self $(, $arg_name:ident : $arg_ty:ty)*) -> $ret_ty:ty;)+
|
$(fn $fn_name:ident (&mut self $(, $arg_name:ident : $arg_ty:ty)*) -> $ret_ty:ty;)+
|
||||||
}
|
}
|
||||||
) => {
|
) => {
|
||||||
pub enum $name {
|
pub enum $name {
|
||||||
$($dynamic_driver($dynamic_driver),)+
|
$($dynamic_driver($dynamic_driver),)*
|
||||||
$($static_driver($static_driver),)+
|
$($static_driver($static_driver),)*
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait $trait {
|
pub trait $trait {
|
||||||
@ -16,17 +16,18 @@ macro_rules! generate_driver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl $name {
|
impl $name {
|
||||||
pub fn new(node: FdtNode, fdt: &Fdt) -> Option<Self> {
|
pub fn new(node: fdt::node::FdtNode, fdt: &fdt::Fdt) -> Option<Self> {
|
||||||
|
use $crate::drivers::Driver;
|
||||||
if let Some(compatible) = node.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!("{}: using driver: {}", stringify!($name), stringify!($dynamic_driver));
|
log::debug!("{}: using driver: {}", stringify!($name), stringify!($dynamic_driver));
|
||||||
return Some($name::$dynamic_driver($dynamic_driver::setup(node, fdt)));
|
return Some($name::$dynamic_driver($dynamic_driver::setup(node, fdt)));
|
||||||
}
|
}
|
||||||
)+
|
)*
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
@ -35,8 +36,8 @@ macro_rules! generate_driver {
|
|||||||
macro_rules! expand_driver {
|
macro_rules! expand_driver {
|
||||||
($$self:ident, $$fn_name:ident, $$($$arg:ident),*) => {
|
($$self:ident, $$fn_name:ident, $$($$arg:ident),*) => {
|
||||||
match $$self {
|
match $$self {
|
||||||
$(Self::$dynamic_driver(driver) => driver.$$fn_name($$($$arg),*),)+
|
$(Self::$dynamic_driver(driver) => driver.$$fn_name($$($$arg),*),)*
|
||||||
$(Self::$static_driver(driver) => driver.$$fn_name($$($$arg),*),)+
|
$(Self::$static_driver(driver) => driver.$$fn_name($$($$arg),*),)*
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user