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