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