xref: /DragonOS/kernel/src/driver/base/device/driver.rs (revision b087521e07f601b30e3d48df788fcc2f09f19566)
1*b087521eSChiichen use super::IdTable;
2*b087521eSChiichen use crate::{
3*b087521eSChiichen     driver::Driver, filesystem::vfs::IndexNode, libs::spinlock::SpinLock, syscall::SystemError,
4*b087521eSChiichen };
5e0de0fd6STingHuang use alloc::{collections::BTreeMap, sync::Arc};
60663027bSTingHuang use core::fmt::Debug;
72a7d773dSTingHuang 
8e0de0fd6STingHuang lazy_static! {
9e0de0fd6STingHuang     pub static ref DRIVER_MANAGER: Arc<LockedDriverManager> = Arc::new(LockedDriverManager::new());
10e0de0fd6STingHuang }
11e0de0fd6STingHuang 
122a7d773dSTingHuang /// @brief: Driver error
132a7d773dSTingHuang #[allow(dead_code)]
1478bf93f0SYJwu2023 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
152a7d773dSTingHuang pub enum DriverError {
16*b087521eSChiichen     ProbeError,            // 探测设备失败(该驱动不能初始化这个设备)
17*b087521eSChiichen     RegisterError,         // 设备注册失败
18*b087521eSChiichen     AllocateResourceError, // 获取设备所需资源失败
19*b087521eSChiichen     UnsupportedOperation,  // 不支持的操作
20*b087521eSChiichen     UnInitialized,         // 未初始化
212a7d773dSTingHuang }
222a7d773dSTingHuang 
23e0de0fd6STingHuang impl Into<SystemError> for DriverError {
24e0de0fd6STingHuang     fn into(self) -> SystemError {
25e0de0fd6STingHuang         match self {
26*b087521eSChiichen             DriverError::ProbeError => SystemError::ENODEV,
27*b087521eSChiichen             DriverError::RegisterError => SystemError::ENODEV,
28*b087521eSChiichen             DriverError::AllocateResourceError => SystemError::EIO,
29*b087521eSChiichen             DriverError::UnsupportedOperation => SystemError::EIO,
30*b087521eSChiichen             DriverError::UnInitialized => SystemError::ENODEV,
31e0de0fd6STingHuang         }
32e0de0fd6STingHuang     }
33e0de0fd6STingHuang }
34e0de0fd6STingHuang 
35e0de0fd6STingHuang /// @brief: 驱动管理器(锁)
36e0de0fd6STingHuang #[derive(Debug)]
37e0de0fd6STingHuang pub struct LockedDriverManager(SpinLock<DriverManager>);
38e0de0fd6STingHuang 
39e0de0fd6STingHuang impl LockedDriverManager {
40e0de0fd6STingHuang     /// @brief: 创建一个新的驱动管理器(锁)
41e0de0fd6STingHuang     /// @parameter None
42e0de0fd6STingHuang     /// @return: LockedDriverManager实体
43e0de0fd6STingHuang     #[inline]
44e0de0fd6STingHuang     fn new() -> LockedDriverManager {
45e0de0fd6STingHuang         LockedDriverManager(SpinLock::new(DriverManager::new()))
46e0de0fd6STingHuang     }
47e0de0fd6STingHuang 
48e0de0fd6STingHuang     /// @brief: 添加驱动
49e0de0fd6STingHuang     /// @parameter id_table: 驱动标识符,用于唯一标识该驱动
50e0de0fd6STingHuang     /// @parameter drv: 驱动实例
51e0de0fd6STingHuang     /// @return: None
52e0de0fd6STingHuang     #[inline]
53e0de0fd6STingHuang     #[allow(dead_code)]
54e0de0fd6STingHuang     pub fn add_driver(&self, id_table: IdTable, drv: Arc<dyn Driver>) {
55e0de0fd6STingHuang         let mut driver_manager = self.0.lock();
56e0de0fd6STingHuang         driver_manager.drivers.insert(id_table, drv);
57e0de0fd6STingHuang     }
58e0de0fd6STingHuang 
59e0de0fd6STingHuang     /// @brief: 卸载驱动
60e0de0fd6STingHuang     /// @parameter id_table: 驱动标识符,用于唯一标识该驱动
61e0de0fd6STingHuang     /// @return: None
62e0de0fd6STingHuang     #[inline]
63e0de0fd6STingHuang     #[allow(dead_code)]
64e0de0fd6STingHuang     pub fn remove_driver(&self, id_table: &IdTable) {
65e0de0fd6STingHuang         let mut driver_manager = self.0.lock();
66e0de0fd6STingHuang         driver_manager.drivers.remove(id_table);
67e0de0fd6STingHuang     }
68e0de0fd6STingHuang 
69e0de0fd6STingHuang     /// @brief: 获取驱动
70e0de0fd6STingHuang     /// @parameter id_table: 驱动标识符,用于唯一标识该驱动
71e0de0fd6STingHuang     /// @return: 驱动实例
72e0de0fd6STingHuang     #[inline]
73e0de0fd6STingHuang     #[allow(dead_code)]
74e0de0fd6STingHuang     pub fn get_driver(&self, id_table: &IdTable) -> Option<Arc<dyn Driver>> {
75e0de0fd6STingHuang         let driver_manager = self.0.lock();
76e0de0fd6STingHuang         driver_manager.drivers.get(id_table).cloned()
77e0de0fd6STingHuang     }
78e0de0fd6STingHuang 
79e0de0fd6STingHuang     /// @brief: 获取驱动管理器的sys information
80e0de0fd6STingHuang     /// @parameter id_table: 设备标识符,用于唯一标识该驱动
81e0de0fd6STingHuang     /// @return: 驱动实例
82e0de0fd6STingHuang     #[inline]
83e0de0fd6STingHuang     #[allow(dead_code)]
84e0de0fd6STingHuang     fn get_sys_info(&self) -> Option<Arc<dyn IndexNode>> {
85e0de0fd6STingHuang         return self.0.lock().sys_info.clone();
86e0de0fd6STingHuang     }
87e0de0fd6STingHuang }
88e0de0fd6STingHuang 
89e0de0fd6STingHuang /// @brief: 驱动管理器
90e0de0fd6STingHuang #[derive(Debug, Clone)]
91e0de0fd6STingHuang pub struct DriverManager {
92e0de0fd6STingHuang     drivers: BTreeMap<IdTable, Arc<dyn Driver>>, // 所有驱动
93e0de0fd6STingHuang     sys_info: Option<Arc<dyn IndexNode>>,        // sys information
94e0de0fd6STingHuang }
95e0de0fd6STingHuang 
96e0de0fd6STingHuang impl DriverManager {
97e0de0fd6STingHuang     /// @brief: 创建一个新的设备管理器
98e0de0fd6STingHuang     /// @parameter: None
99*b087521eSChiichen     /// @return: Manager实体
100e0de0fd6STingHuang     #[inline]
101e0de0fd6STingHuang     fn new() -> DriverManager {
102e0de0fd6STingHuang         DriverManager {
103e0de0fd6STingHuang             drivers: BTreeMap::new(),
104e0de0fd6STingHuang             sys_info: None,
105e0de0fd6STingHuang         }
106e0de0fd6STingHuang     }
107e0de0fd6STingHuang }
108e0de0fd6STingHuang 
109e0de0fd6STingHuang /// @brief: 驱动注册
110e0de0fd6STingHuang /// @parameter: name: 驱动名
111e0de0fd6STingHuang /// @return: 操作成功,返回(),操作失败,返回错误码
112*b087521eSChiichen pub fn driver_register(driver: Arc<dyn Driver>) -> Result<(), DriverError> {
1130663027bSTingHuang     DRIVER_MANAGER.add_driver(driver.id_table(), driver);
114e0de0fd6STingHuang     return Ok(());
115e0de0fd6STingHuang }
116e0de0fd6STingHuang 
117e0de0fd6STingHuang /// @brief: 驱动卸载
118e0de0fd6STingHuang /// @parameter: name: 驱动名
119e0de0fd6STingHuang /// @return: 操作成功,返回(),操作失败,返回错误码
120e0de0fd6STingHuang #[allow(dead_code)]
121*b087521eSChiichen pub fn driver_unregister(driver: Arc<dyn Driver>) -> Result<(), DriverError> {
1220663027bSTingHuang     DRIVER_MANAGER.add_driver(driver.id_table(), driver);
123e0de0fd6STingHuang     return Ok(());
1242a7d773dSTingHuang }
125