xref: /DragonOS/kernel/src/driver/mod.rs (revision b087521e07f601b30e3d48df788fcc2f09f19566)
1 pub mod acpi;
2 pub mod base;
3 pub mod disk;
4 pub mod keyboard;
5 pub mod net;
6 pub mod pci;
7 pub mod timers;
8 pub mod tty;
9 pub mod uart;
10 pub mod video;
11 pub mod virtio;
12 
13 use core::fmt::Debug;
14 
15 use alloc::sync::Arc;
16 
17 use crate::filesystem::vfs::IndexNode;
18 
19 use self::base::{
20     device::{driver::DriverError, Device, DevicePrivateData, DeviceResource, IdTable},
21     platform::CompatibleTable,
22 };
23 pub trait Driver: Sync + Send + Debug {
24     fn as_any_ref(&'static self) -> &'static dyn core::any::Any;
25 
26     //对于不需要匹配,在系统初始化的时候就生成的设备,例如 PlatformBus 就不需要匹配表
27 
28     /// @brief: 获取驱动匹配表
29     /// @parameter: None
30     /// @return: 驱动匹配表
31     fn compatible_table(&self) -> CompatibleTable {
32         //TODO 要完善每个 CompatibleTable ,将来要把这个默认实现删除
33         return CompatibleTable::new(vec!["unknown"]);
34     }
35 
36     /// @brief 添加可支持的设备
37     /// @parameter: device 新增的匹配项
38     fn append_compatible_table(&self, _device: &CompatibleTable) -> Result<(), DriverError> {
39         Err(DriverError::UnsupportedOperation)
40     }
41 
42     /// @brief 探测设备
43     /// @param data 设备初始拥有的基本信息
44     fn probe(&self, data: &DevicePrivateData) -> Result<(), DriverError>;
45 
46     /// @brief 加载设备,包括检查资源可用性,和注册到相应的管理器中。
47     /// @param data 设备初始拥有的信息
48     /// @param resource 设备可能申请的资源(或者像伪设备不需要就为None)
49     fn load(
50         &self,
51         data: DevicePrivateData,
52         resource: Option<DeviceResource>,
53     ) -> Result<Arc<dyn Device>, DriverError>;
54 
55     /// @brief: 获取驱动标识符
56     /// @parameter: None
57     /// @return: 该驱动驱动唯一标识符
58     fn id_table(&self) -> IdTable;
59 
60     // 考虑到很多驱动并不需要存储在系统中,只需要当工具人就可以了,因此 SysINode 是可选的
61     /// @brief: 设置驱动的sys information
62     /// @parameter id_table: 驱动标识符,用于唯一标识该驱动
63     /// @return: 驱动实例
64     fn set_sys_info(&self, sys_info: Option<Arc<dyn IndexNode>>);
65 
66     /// @brief: 获取驱动的sys information
67     /// @parameter id_table: 驱动标识符,用于唯一标识该驱动
68     /// @return: 驱动实例
69     fn sys_info(&self) -> Option<Arc<dyn IndexNode>>;
70 }
71