feat: kernel/plat/generate_driver: make required packages self-contained

This commit is contained in:
Paul Pan 2024-08-23 10:18:06 +08:00
parent 6577c5614e
commit 871a028ecf
2 changed files with 9 additions and 11 deletions

View File

@ -1,9 +1,6 @@
use super::utils::generate_driver;
use crate::arch::EarlyConsole;
use crate::drivers::serial::{Uart16550, UartSifive};
use crate::drivers::Driver;
use fdt::{node::FdtNode, Fdt};
use log::debug;
use spin::Mutex;
generate_driver!(

View File

@ -1,14 +1,14 @@
macro_rules! generate_driver {
(
$name:ident {
($($dynamic_driver:ident),+),($($static_driver:ident),+)
($($dynamic_driver:ident),*),($($static_driver:ident),*)
} : $trait:ident {
$(fn $fn_name:ident (&mut self $(, $arg_name:ident : $arg_ty:ty)*) -> $ret_ty:ty;)+
}
) => {
pub enum $name {
$($dynamic_driver($dynamic_driver),)+
$($static_driver($static_driver),)+
$($dynamic_driver($dynamic_driver),)*
$($static_driver($static_driver),)*
}
pub trait $trait {
@ -16,17 +16,18 @@ macro_rules! generate_driver {
}
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 compatible
.all()
.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)));
}
)+
)*
}
None
}
@ -35,8 +36,8 @@ macro_rules! generate_driver {
macro_rules! expand_driver {
($$self:ident, $$fn_name:ident, $$($$arg:ident),*) => {
match $$self {
$(Self::$dynamic_driver(driver) => driver.$$fn_name($$($$arg),*),)+
$(Self::$static_driver(driver) => driver.$$fn_name($$($$arg),*),)+
$(Self::$dynamic_driver(driver) => driver.$$fn_name($$($$arg),*),)*
$(Self::$static_driver(driver) => driver.$$fn_name($$($$arg),*),)*
}
};
}