driver.rs 3.9 KB

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