xref: /DragonOS/kernel/src/driver/base/device/driver.rs (revision 8d94ea66a3eb3e02039730c8d08e9bead8c344b8)
1 use super::{IdTable, KObject};
2 use crate::{filesystem::vfs::IndexNode, libs::spinlock::SpinLock, syscall::SystemError};
3 use alloc::{collections::BTreeMap, sync::Arc};
4 use core::fmt::Debug;
5 
6 lazy_static! {
7     pub static ref DRIVER_MANAGER: Arc<LockedDriverManager> = Arc::new(LockedDriverManager::new());
8 }
9 
10 /// @brief: Driver error
11 #[allow(dead_code)]
12 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
13 pub enum DriverError {
14     ProbeError,
15     RegisterError,
16 }
17 
18 impl Into<SystemError> for DriverError {
19     fn into(self) -> SystemError {
20         match self {
21             DriverError::ProbeError => SystemError::EIO,
22             DriverError::RegisterError => SystemError::EIO,
23         }
24     }
25 }
26 
27 /// @brief: 所有驱动驱动都应该实现该trait
28 pub trait Driver: KObject {
29     /// @brief: 本函数用于实现动态转换
30     /// @parameter: None
31     /// @return: any
32     fn as_any_ref(&'static self) -> &'static dyn core::any::Any;
33 
34     /// @brief: 获取驱动驱动标识符
35     /// @parameter: None
36     /// @return: 该驱动驱动唯一标识符
37     fn id_table(&self) -> IdTable;
38 
39     /// @brief: 设置驱动的sys information
40     /// @parameter id_table: 驱动标识符,用于唯一标识该驱动
41     /// @return: 驱动实例
42     fn set_sys_info(&self, sys_info: Option<Arc<dyn IndexNode>>);
43 
44     /// @brief: 获取驱动的sys information
45     /// @parameter id_table: 驱动标识符,用于唯一标识该驱动
46     /// @return: 驱动实例
47     fn sys_info(&self) -> Option<Arc<dyn IndexNode>>;
48 }
49 
50 /// @brief: 驱动管理器(锁)
51 #[derive(Debug)]
52 pub struct LockedDriverManager(SpinLock<DriverManager>);
53 
54 impl LockedDriverManager {
55     /// @brief: 创建一个新的驱动管理器(锁)
56     /// @parameter None
57     /// @return: LockedDriverManager实体
58     #[inline]
59     fn new() -> LockedDriverManager {
60         LockedDriverManager(SpinLock::new(DriverManager::new()))
61     }
62 
63     /// @brief: 添加驱动
64     /// @parameter id_table: 驱动标识符,用于唯一标识该驱动
65     /// @parameter drv: 驱动实例
66     /// @return: None
67     #[inline]
68     #[allow(dead_code)]
69     pub fn add_driver(&self, id_table: IdTable, drv: Arc<dyn Driver>) {
70         let mut driver_manager = self.0.lock();
71         driver_manager.drivers.insert(id_table, drv);
72     }
73 
74     /// @brief: 卸载驱动
75     /// @parameter id_table: 驱动标识符,用于唯一标识该驱动
76     /// @return: None
77     #[inline]
78     #[allow(dead_code)]
79     pub fn remove_driver(&self, id_table: &IdTable) {
80         let mut driver_manager = self.0.lock();
81         driver_manager.drivers.remove(id_table);
82     }
83 
84     /// @brief: 获取驱动
85     /// @parameter id_table: 驱动标识符,用于唯一标识该驱动
86     /// @return: 驱动实例
87     #[inline]
88     #[allow(dead_code)]
89     pub fn get_driver(&self, id_table: &IdTable) -> Option<Arc<dyn Driver>> {
90         let driver_manager = self.0.lock();
91         driver_manager.drivers.get(id_table).cloned()
92     }
93 
94     /// @brief: 获取驱动管理器的sys information
95     /// @parameter id_table: 设备标识符,用于唯一标识该驱动
96     /// @return: 驱动实例
97     #[inline]
98     #[allow(dead_code)]
99     fn get_sys_info(&self) -> Option<Arc<dyn IndexNode>> {
100         return self.0.lock().sys_info.clone();
101     }
102 }
103 
104 /// @brief: 驱动管理器
105 #[derive(Debug, Clone)]
106 pub struct DriverManager {
107     drivers: BTreeMap<IdTable, Arc<dyn Driver>>, // 所有驱动
108     sys_info: Option<Arc<dyn IndexNode>>,        // sys information
109 }
110 
111 impl DriverManager {
112     /// @brief: 创建一个新的设备管理器
113     /// @parameter: None
114     /// @return: DeviceManager实体
115     #[inline]
116     fn new() -> DriverManager {
117         DriverManager {
118             drivers: BTreeMap::new(),
119             sys_info: None,
120         }
121     }
122 }
123 
124 /// @brief: 驱动注册
125 /// @parameter: name: 驱动名
126 /// @return: 操作成功,返回(),操作失败,返回错误码
127 pub fn driver_register<T: Driver>(driver: Arc<T>) -> Result<(), DriverError> {
128     DRIVER_MANAGER.add_driver(driver.id_table(), driver);
129     return Ok(());
130 }
131 
132 /// @brief: 驱动卸载
133 /// @parameter: name: 驱动名
134 /// @return: 操作成功,返回(),操作失败,返回错误码
135 #[allow(dead_code)]
136 pub fn driver_unregister<T: Driver>(driver: Arc<T>) -> Result<(), DriverError> {
137     DRIVER_MANAGER.add_driver(driver.id_table(), driver);
138     return Ok(());
139 }
140