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