1 use alloc::{ 2 collections::BTreeMap, 3 string::{String, ToString}, 4 sync::Arc, 5 }; 6 7 use crate::{ 8 driver::base::map::{LockedDevsMap, LockedKObjMap}, 9 filesystem::{ 10 sysfs::{ 11 devices::{sys_device_register, sys_device_unregister}, 12 SYS_DEVICES_INODE, 13 }, 14 vfs::IndexNode, 15 }, 16 libs::spinlock::SpinLock, 17 syscall::SystemError, 18 }; 19 use core::{any::Any, fmt::Debug}; 20 21 use super::platform::CompatibleTable; 22 23 pub mod bus; 24 pub mod driver; 25 pub mod init; 26 27 lazy_static! { 28 pub static ref DEVICE_MANAGER: Arc<LockedDeviceManager> = Arc::new(LockedDeviceManager::new()); 29 } 30 lazy_static! { 31 // 全局字符设备号管理实例 32 pub static ref CHARDEVS: Arc<LockedDevsMap> = Arc::new(LockedDevsMap::default()); 33 34 // 全局块设备管理实例 35 pub static ref BLOCKDEVS: Arc<LockedDevsMap> = Arc::new(LockedDevsMap::default()); 36 37 // 全局设备管理实例 38 pub static ref DEVMAP: Arc<LockedKObjMap> = Arc::new(LockedKObjMap::default()); 39 40 } 41 42 pub trait KObject: Any + Send + Sync + Debug {} 43 /// @brief 设备应该实现的操作 44 /// @usage Device::read_at() 45 pub trait Device: KObject { 46 // TODO: 待实现 open, close 47 fn as_any_ref(&self) -> &dyn core::any::Any; 48 /// @brief: 获取设备类型 49 /// @parameter: None 50 /// @return: 实现该trait的设备所属类型 51 fn dev_type(&self) -> DeviceType; 52 53 /// @brief: 获取设备标识 54 /// @parameter: None 55 /// @return: 该设备唯一标识 56 fn id_table(&self) -> IdTable; 57 58 /// @brief: 设置sysfs info 59 /// @parameter: None 60 /// @return: 该设备唯一标识 61 fn set_sys_info(&self, _sys_info: Option<Arc<dyn IndexNode>>); 62 63 /// @brief: 获取设备的sys information 64 /// @parameter id_table: 设备标识符,用于唯一标识该设备 65 /// @return: 设备实例 66 fn sys_info(&self) -> Option<Arc<dyn IndexNode>>; 67 } 68 69 // 暂定是不可修改的,在初始化的时候就要确定。以后可能会包括例如硬件中断包含的信息 70 #[allow(dead_code)] 71 #[derive(Debug, Clone)] 72 pub struct DevicePrivateData { 73 id_table: IdTable, 74 resource: Option<DeviceResource>, 75 compatible_table: CompatibleTable, 76 state: DeviceState, 77 } 78 79 impl DevicePrivateData { 80 pub fn new( 81 id_table: IdTable, 82 resource: Option<DeviceResource>, 83 compatible_table: CompatibleTable, 84 state: DeviceState, 85 ) -> Self { 86 Self { 87 id_table, 88 resource, 89 compatible_table, 90 state, 91 } 92 } 93 94 pub fn id_table(&self) -> &IdTable { 95 &self.id_table 96 } 97 98 pub fn state(&self) -> DeviceState { 99 self.state 100 } 101 102 #[allow(dead_code)] 103 pub fn resource(&self) -> Option<&DeviceResource> { 104 self.resource.as_ref() 105 } 106 107 pub fn compatible_table(&self) -> &CompatibleTable { 108 &self.compatible_table 109 } 110 111 pub fn set_state(&mut self, state: DeviceState) { 112 self.state = state; 113 } 114 } 115 116 #[derive(Debug, Clone)] 117 pub struct DeviceResource { 118 //可能会用来保存例如 IRQ PWM 内存地址等需要申请的资源,将来由资源管理器+Framework框架进行管理。 119 } 120 121 impl Default for DeviceResource { 122 fn default() -> Self { 123 return Self {}; 124 } 125 } 126 127 int_like!(DeviceNumber, usize); 128 129 impl Default for DeviceNumber { 130 fn default() -> Self { 131 DeviceNumber(0) 132 } 133 } 134 135 impl From<usize> for DeviceNumber { 136 fn from(dev_t: usize) -> Self { 137 DeviceNumber(dev_t) 138 } 139 } 140 141 impl Into<usize> for DeviceNumber { 142 fn into(self) -> usize { 143 self.0 144 } 145 } 146 147 impl core::hash::Hash for DeviceNumber { 148 fn hash<H: core::hash::Hasher>(&self, state: &mut H) { 149 self.0.hash(state); 150 } 151 } 152 153 impl DeviceNumber { 154 /// @brief: 获取主设备号 155 /// @parameter: none 156 /// @return: 主设备号 157 pub fn major(&self) -> usize { 158 (self.0 >> 20) & 0xfff 159 } 160 161 /// @brief: 获取次设备号 162 /// @parameter: none 163 /// @return: 次设备号 164 pub fn minor(&self) -> usize { 165 self.0 & 0xfffff 166 } 167 168 pub fn from_major_minor(major: usize, minor: usize) -> usize { 169 ((major & 0xffffff) << 8) | (minor & 0xff) 170 } 171 } 172 173 /// @brief: 根据主次设备号创建设备号实例 174 /// @parameter: major: 主设备号 175 /// minor: 次设备号 176 /// @return: 设备号实例 177 pub fn mkdev(major: usize, minor: usize) -> DeviceNumber { 178 DeviceNumber(((major & 0xfff) << 20) | (minor & 0xfffff)) 179 } 180 181 /// @brief: 设备类型 182 #[allow(dead_code)] 183 #[derive(Debug, Eq, PartialEq)] 184 pub enum DeviceType { 185 Bus, 186 Net, 187 Gpu, 188 Input, 189 Block, 190 Rtc, 191 Serial, 192 Intc, 193 PlatformDev, 194 } 195 196 /// @brief: 设备标识符类型 197 #[derive(Debug, Clone, Hash, PartialOrd, PartialEq, Ord, Eq)] 198 pub struct IdTable(String, DeviceNumber); 199 200 /// @brief: 设备标识符操作方法集 201 impl IdTable { 202 /// @brief: 创建一个新的设备标识符 203 /// @parameter name: 设备名 204 /// @parameter id: 设备id 205 /// @return: 设备标识符 206 pub fn new(name: String, id: DeviceNumber) -> IdTable { 207 Self(name, id) 208 } 209 210 /// @brief: 将设备标识符转换成name 211 /// @parameter None 212 /// @return: 设备名 213 pub fn name(&self) -> String { 214 return format!("{}:{:?}", self.0, self.1 .0); 215 } 216 217 pub fn device_number(&self) -> DeviceNumber { 218 return self.1; 219 } 220 } 221 222 impl Default for IdTable { 223 fn default() -> Self { 224 IdTable("unknown".to_string(), DeviceNumber::new(0)) 225 } 226 } 227 228 // 以现在的模型,设备在加载到系统中就是已经初始化的状态了,因此可以考虑把这个删掉 229 /// @brief: 设备当前状态 230 #[derive(Debug, Clone, Copy)] 231 pub enum DeviceState { 232 NotInitialized = 0, 233 Initialized = 1, 234 UnDefined = 2, 235 } 236 237 /// @brief: 设备错误类型 238 #[allow(dead_code)] 239 #[derive(Debug, Copy, Clone)] 240 pub enum DeviceError { 241 DriverExists, // 设备已存在 242 DeviceExists, // 驱动已存在 243 InitializeFailed, // 初始化错误 244 NotInitialized, // 未初始化的设备 245 NoDeviceForDriver, // 没有合适的设备匹配驱动 246 NoDriverForDevice, // 没有合适的驱动匹配设备 247 RegisterError, // 注册失败 248 UnsupportedOperation, // 不支持的操作 249 } 250 251 impl Into<SystemError> for DeviceError { 252 fn into(self) -> SystemError { 253 match self { 254 DeviceError::DriverExists => SystemError::EEXIST, 255 DeviceError::DeviceExists => SystemError::EEXIST, 256 DeviceError::InitializeFailed => SystemError::EIO, 257 DeviceError::NotInitialized => SystemError::ENODEV, 258 DeviceError::NoDeviceForDriver => SystemError::ENODEV, 259 DeviceError::NoDriverForDevice => SystemError::ENODEV, 260 DeviceError::RegisterError => SystemError::EIO, 261 DeviceError::UnsupportedOperation => SystemError::EIO, 262 } 263 } 264 } 265 266 /// @brief: 将u32类型转换为设备状态类型 267 impl From<u32> for DeviceState { 268 fn from(state: u32) -> Self { 269 match state { 270 0 => DeviceState::NotInitialized, 271 1 => DeviceState::Initialized, 272 _ => todo!(), 273 } 274 } 275 } 276 277 /// @brief: 将设备状态转换为u32类型 278 impl From<DeviceState> for u32 { 279 fn from(state: DeviceState) -> Self { 280 match state { 281 DeviceState::NotInitialized => 0, 282 DeviceState::Initialized => 1, 283 DeviceState::UnDefined => 2, 284 } 285 } 286 } 287 288 /// @brief Device管理器(锁) 289 #[derive(Debug)] 290 pub struct LockedDeviceManager(SpinLock<DeviceManager>); 291 292 impl LockedDeviceManager { 293 fn new() -> LockedDeviceManager { 294 LockedDeviceManager(SpinLock::new(DeviceManager::new())) 295 } 296 297 /// @brief: 添加设备 298 /// @parameter id_table: 总线标识符,用于唯一标识该总线 299 /// @parameter dev: 设备实例 300 /// @return: None 301 #[inline] 302 #[allow(dead_code)] 303 pub fn add_device(&self, id_table: IdTable, dev: Arc<dyn Device>) { 304 let mut device_manager = self.0.lock(); 305 device_manager.devices.insert(id_table, dev); 306 } 307 308 /// @brief: 卸载设备 309 /// @parameter id_table: 总线标识符,用于唯一标识该设备 310 /// @return: None 311 #[inline] 312 #[allow(dead_code)] 313 pub fn remove_device(&self, id_table: &IdTable) { 314 let mut device_manager = self.0.lock(); 315 device_manager.devices.remove(id_table); 316 } 317 318 /// @brief: 获取设备 319 /// @parameter id_table: 设备标识符,用于唯一标识该设备 320 /// @return: 设备实例 321 #[inline] 322 #[allow(dead_code)] 323 pub fn get_device(&self, id_table: &IdTable) -> Option<Arc<dyn Device>> { 324 let device_manager = self.0.lock(); 325 device_manager.devices.get(id_table).cloned() 326 } 327 328 /// @brief: 获取设备管理器的sys information 329 /// @parameter id_table: 设备标识符,用于唯一标识该设备 330 /// @return: 设备实例 331 #[inline] 332 #[allow(dead_code)] 333 fn sys_info(&self) -> Option<Arc<dyn IndexNode>> { 334 return self.0.lock().sys_info.clone(); 335 } 336 } 337 338 /// @brief Device管理器 339 #[derive(Debug, Clone)] 340 pub struct DeviceManager { 341 devices: BTreeMap<IdTable, Arc<dyn Device>>, // 所有设备 342 sys_info: Option<Arc<dyn IndexNode>>, // sys information 343 } 344 345 impl DeviceManager { 346 /// @brief: 创建一个新的设备管理器 347 /// @parameter: None 348 /// @return: DeviceManager实体 349 #[inline] 350 fn new() -> DeviceManager { 351 DeviceManager { 352 devices: BTreeMap::new(), 353 sys_info: Some(SYS_DEVICES_INODE()), 354 } 355 } 356 } 357 358 /// @brief: 设备注册 359 /// @parameter: name: 设备名 360 /// @return: 操作成功,返回(),操作失败,返回错误码 361 pub fn device_register<T: Device>(device: Arc<T>) -> Result<(), DeviceError> { 362 DEVICE_MANAGER.add_device(device.id_table(), device.clone()); 363 match sys_device_register(&device.id_table().name()) { 364 Ok(sys_info) => { 365 device.set_sys_info(Some(sys_info)); 366 return Ok(()); 367 } 368 Err(_) => Err(DeviceError::RegisterError), 369 } 370 } 371 372 /// @brief: 设备卸载 373 /// @parameter: name: 设备名 374 /// @return: 操作成功,返回(),操作失败,返回错误码 375 pub fn device_unregister<T: Device>(device: Arc<T>) -> Result<(), DeviceError> { 376 DEVICE_MANAGER.add_device(device.id_table(), device.clone()); 377 match sys_device_unregister(&device.id_table().name()) { 378 Ok(_) => { 379 device.set_sys_info(None); 380 return Ok(()); 381 } 382 Err(_) => Err(DeviceError::RegisterError), 383 } 384 } 385