1 use alloc::{ 2 string::{String, ToString}, 3 sync::{Arc, Weak}, 4 }; 5 use intertrait::cast::CastArc; 6 7 use crate::{ 8 driver::{ 9 acpi::glue::acpi_device_notify, 10 base::map::{LockedDevsMap, LockedKObjMap}, 11 }, 12 exception::irqdata::IrqHandlerData, 13 filesystem::{ 14 sysfs::{ 15 file::sysfs_emit_str, sysfs_instance, Attribute, AttributeGroup, SysFSOps, 16 SysFSOpsSupport, 17 }, 18 vfs::syscall::ModeType, 19 }, 20 }; 21 22 use core::fmt::Debug; 23 use core::intrinsics::unlikely; 24 use system_error::SystemError; 25 26 use self::{ 27 bus::{bus_add_device, bus_probe_device, Bus}, 28 device_number::{DeviceNumber, Major}, 29 driver::Driver, 30 }; 31 32 use super::{ 33 class::Class, 34 kobject::{KObjType, KObject, KObjectManager, KObjectState}, 35 kset::KSet, 36 swnode::software_node_notify, 37 }; 38 39 pub mod bus; 40 pub mod dd; 41 pub mod device_number; 42 pub mod driver; 43 pub mod init; 44 45 static mut DEVICE_MANAGER: Option<DeviceManager> = None; 46 47 #[inline(always)] 48 pub fn device_manager() -> &'static DeviceManager { 49 unsafe { DEVICE_MANAGER.as_ref().unwrap() } 50 } 51 52 lazy_static! { 53 // 全局字符设备号管理实例 54 pub static ref CHARDEVS: Arc<LockedDevsMap> = Arc::new(LockedDevsMap::default()); 55 56 // 全局块设备管理实例 57 pub static ref BLOCKDEVS: Arc<LockedDevsMap> = Arc::new(LockedDevsMap::default()); 58 59 // 全局设备管理实例 60 pub static ref DEVMAP: Arc<LockedKObjMap> = Arc::new(LockedKObjMap::default()); 61 62 } 63 64 /// `/sys/devices` 的 kset 实例 65 static mut DEVICES_KSET_INSTANCE: Option<Arc<KSet>> = None; 66 /// `/sys/dev` 的 kset 实例 67 static mut DEV_KSET_INSTANCE: Option<Arc<KSet>> = None; 68 /// `/sys/dev/block` 的 kset 实例 69 static mut DEV_BLOCK_KSET_INSTANCE: Option<Arc<KSet>> = None; 70 /// `/sys/dev/char` 的 kset 实例 71 static mut DEV_CHAR_KSET_INSTANCE: Option<Arc<KSet>> = None; 72 73 /// `/sys/devices/virtual` 的 kset 实例 74 static mut DEVICES_VIRTUAL_KSET_INSTANCE: Option<Arc<KSet>> = None; 75 76 /// 获取`/sys/devices`的kset实例 77 #[inline(always)] 78 pub(super) fn sys_devices_kset() -> Arc<KSet> { 79 unsafe { DEVICES_KSET_INSTANCE.as_ref().unwrap().clone() } 80 } 81 82 /// 获取`/sys/dev`的kset实例 83 #[inline(always)] 84 pub(super) fn sys_dev_kset() -> Arc<KSet> { 85 unsafe { DEV_KSET_INSTANCE.as_ref().unwrap().clone() } 86 } 87 88 /// 获取`/sys/dev/block`的kset实例 89 #[inline(always)] 90 #[allow(dead_code)] 91 pub fn sys_dev_block_kset() -> Arc<KSet> { 92 unsafe { DEV_BLOCK_KSET_INSTANCE.as_ref().unwrap().clone() } 93 } 94 95 /// 获取`/sys/dev/char`的kset实例 96 #[inline(always)] 97 pub fn sys_dev_char_kset() -> Arc<KSet> { 98 unsafe { DEV_CHAR_KSET_INSTANCE.as_ref().unwrap().clone() } 99 } 100 101 unsafe fn set_sys_dev_block_kset(kset: Arc<KSet>) { 102 DEV_BLOCK_KSET_INSTANCE = Some(kset); 103 } 104 105 unsafe fn set_sys_dev_char_kset(kset: Arc<KSet>) { 106 DEV_CHAR_KSET_INSTANCE = Some(kset); 107 } 108 109 /// 获取`/sys/devices/virtual`的kset实例 110 pub fn sys_devices_virtual_kset() -> Arc<KSet> { 111 unsafe { DEVICES_VIRTUAL_KSET_INSTANCE.as_ref().unwrap().clone() } 112 } 113 114 unsafe fn set_sys_devices_virtual_kset(kset: Arc<KSet>) { 115 DEVICES_VIRTUAL_KSET_INSTANCE = Some(kset); 116 } 117 118 /// 设备应该实现的操作 119 /// 120 /// ## 注意 121 /// 122 /// 由于设备驱动模型需要从Arc<dyn KObject>转换为Arc<dyn Device>, 123 /// 因此,所有的实现了Device trait的结构体,都应该在结构体上方标注`#[cast_to([sync] Device)]`, 124 /// 125 /// 否则在释放设备资源的时候,会由于无法转换为Arc<dyn Device>而导致资源泄露,并且release回调函数也不会被调用。 126 pub trait Device: KObject { 127 // TODO: 待实现 open, close 128 129 /// @brief: 获取设备类型 130 /// @parameter: None 131 /// @return: 实现该trait的设备所属类型 132 fn dev_type(&self) -> DeviceType; 133 134 /// @brief: 获取设备标识 135 /// @parameter: None 136 /// @return: 该设备唯一标识 137 fn id_table(&self) -> IdTable; 138 139 /// 设备释放时的回调函数 140 fn release(&self) { 141 let name = self.name(); 142 kwarn!( 143 "device {} does not have a release() function, it is broken and must be fixed.", 144 name 145 ); 146 } 147 148 /// 获取当前设备所属的总线 149 fn bus(&self) -> Option<Weak<dyn Bus>> { 150 return None; 151 } 152 153 /// 设置当前设备所属的总线 154 /// 155 /// (一定要传入Arc,因为bus的subsysprivate里面存储的是Device的Arc指针) 156 /// 157 /// 注意,如果实现了当前方法,那么必须实现`bus()`方法 158 fn set_bus(&self, bus: Option<Weak<dyn Bus>>); 159 160 /// 获取当前设备所属的类 161 fn class(&self) -> Option<Arc<dyn Class>> { 162 return None; 163 } 164 165 /// 设置当前设备所属的类 166 /// 167 /// 注意,如果实现了当前方法,那么必须实现`class()`方法 168 fn set_class(&self, class: Option<Weak<dyn Class>>); 169 170 /// 返回已经与当前设备匹配好的驱动程序 171 fn driver(&self) -> Option<Arc<dyn Driver>>; 172 173 fn set_driver(&self, driver: Option<Weak<dyn Driver>>); 174 175 /// 当前设备是否已经挂掉了 176 fn is_dead(&self) -> bool; 177 178 /// 当前设备是否处于可以被匹配的状态 179 /// 180 /// The device has matched with a driver at least once or it is in 181 /// a bus (like AMBA) which can't check for matching drivers until 182 /// other devices probe successfully. 183 fn can_match(&self) -> bool; 184 185 fn set_can_match(&self, can_match: bool); 186 187 /// The hardware state of this device has been synced to match 188 /// the software state of this device by calling the driver/bus 189 /// sync_state() callback. 190 fn state_synced(&self) -> bool; 191 192 fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> { 193 None 194 } 195 } 196 197 impl dyn Device { 198 #[inline(always)] 199 pub fn is_registered(&self) -> bool { 200 self.kobj_state().contains(KObjectState::IN_SYSFS) 201 } 202 } 203 204 /// 实现了Device trait的设备需要拥有的数据 205 #[derive(Debug)] 206 pub struct DeviceCommonData { 207 pub bus: Option<Weak<dyn Bus>>, 208 pub class: Option<Weak<dyn Class>>, 209 pub driver: Option<Weak<dyn Driver>>, 210 pub dead: bool, 211 pub can_match: bool, 212 } 213 214 impl Default for DeviceCommonData { 215 fn default() -> Self { 216 Self { 217 bus: None, 218 class: None, 219 driver: None, 220 dead: false, 221 can_match: true, 222 } 223 } 224 } 225 226 impl DeviceCommonData { 227 /// 获取bus字段 228 /// 229 /// 当weak指针的strong count为0的时候,清除弱引用 230 pub fn get_bus_weak_or_clear(&mut self) -> Option<Weak<dyn Bus>> { 231 driver_base_macros::get_weak_or_clear!(self.bus) 232 } 233 234 /// 获取class字段 235 /// 236 /// 当weak指针的strong count为0的时候,清除弱引用 237 pub fn get_class_weak_or_clear(&mut self) -> Option<Weak<dyn Class>> { 238 driver_base_macros::get_weak_or_clear!(self.class) 239 } 240 241 /// 获取driver字段 242 /// 243 /// 当weak指针的strong count为0的时候,清除弱引用 244 pub fn get_driver_weak_or_clear(&mut self) -> Option<Weak<dyn Driver>> { 245 driver_base_macros::get_weak_or_clear!(self.driver) 246 } 247 } 248 249 // 暂定是不可修改的,在初始化的时候就要确定。以后可能会包括例如硬件中断包含的信息 250 #[allow(dead_code)] 251 #[derive(Debug, Clone)] 252 pub struct DevicePrivateData { 253 id_table: IdTable, 254 state: DeviceState, 255 } 256 257 #[allow(dead_code)] 258 impl DevicePrivateData { 259 pub fn new(id_table: IdTable, state: DeviceState) -> Self { 260 Self { id_table, state } 261 } 262 263 pub fn id_table(&self) -> &IdTable { 264 &self.id_table 265 } 266 267 pub fn state(&self) -> DeviceState { 268 self.state 269 } 270 271 pub fn set_state(&mut self, state: DeviceState) { 272 self.state = state; 273 } 274 } 275 276 /// @brief: 设备类型 277 #[allow(dead_code)] 278 #[derive(Debug, Eq, PartialEq)] 279 pub enum DeviceType { 280 Bus, 281 Net, 282 Gpu, 283 Input, 284 Block, 285 Rtc, 286 Serial, 287 Intc, 288 PlatformDev, 289 Char, 290 } 291 292 /// @brief: 设备标识符类型 293 #[derive(Debug, Clone, Hash, PartialOrd, PartialEq, Ord, Eq)] 294 pub struct IdTable { 295 basename: String, 296 id: Option<DeviceNumber>, 297 } 298 299 /// @brief: 设备标识符操作方法集 300 impl IdTable { 301 /// @brief: 创建一个新的设备标识符 302 /// @parameter name: 设备名 303 /// @parameter id: 设备id 304 /// @return: 设备标识符 305 pub fn new(basename: String, id: Option<DeviceNumber>) -> IdTable { 306 return IdTable { basename, id }; 307 } 308 309 /// @brief: 将设备标识符转换成name 310 /// @parameter None 311 /// @return: 设备名 312 pub fn name(&self) -> String { 313 if self.id.is_none() { 314 return self.basename.clone(); 315 } else { 316 let id = self.id.unwrap(); 317 return format!("{}:{}", id.major().data(), id.minor()); 318 } 319 } 320 321 pub fn device_number(&self) -> DeviceNumber { 322 return self.id.unwrap_or_default(); 323 } 324 } 325 326 impl Default for IdTable { 327 fn default() -> Self { 328 IdTable::new("unknown".to_string(), None) 329 } 330 } 331 332 // 以现在的模型,设备在加载到系统中就是已经初始化的状态了,因此可以考虑把这个删掉 333 /// @brief: 设备当前状态 334 #[derive(Debug, Clone, Copy, Eq, PartialEq)] 335 pub enum DeviceState { 336 NotInitialized = 0, 337 Initialized = 1, 338 UnDefined = 2, 339 } 340 341 /// @brief: 设备错误类型 342 #[allow(dead_code)] 343 #[derive(Debug, Copy, Clone)] 344 pub enum DeviceError { 345 DriverExists, // 设备已存在 346 DeviceExists, // 驱动已存在 347 InitializeFailed, // 初始化错误 348 NotInitialized, // 未初始化的设备 349 NoDeviceForDriver, // 没有合适的设备匹配驱动 350 NoDriverForDevice, // 没有合适的驱动匹配设备 351 RegisterError, // 注册失败 352 UnsupportedOperation, // 不支持的操作 353 } 354 355 impl From<DeviceError> for SystemError { 356 fn from(value: DeviceError) -> Self { 357 match value { 358 DeviceError::DriverExists => SystemError::EEXIST, 359 DeviceError::DeviceExists => SystemError::EEXIST, 360 DeviceError::InitializeFailed => SystemError::EIO, 361 DeviceError::NotInitialized => SystemError::ENODEV, 362 DeviceError::NoDeviceForDriver => SystemError::ENODEV, 363 DeviceError::NoDriverForDevice => SystemError::ENODEV, 364 DeviceError::RegisterError => SystemError::EIO, 365 DeviceError::UnsupportedOperation => SystemError::EIO, 366 } 367 } 368 } 369 370 /// @brief: 将u32类型转换为设备状态类型 371 impl From<u32> for DeviceState { 372 fn from(state: u32) -> Self { 373 match state { 374 0 => DeviceState::NotInitialized, 375 1 => DeviceState::Initialized, 376 _ => todo!(), 377 } 378 } 379 } 380 381 /// @brief: 将设备状态转换为u32类型 382 impl From<DeviceState> for u32 { 383 fn from(state: DeviceState) -> Self { 384 match state { 385 DeviceState::NotInitialized => 0, 386 DeviceState::Initialized => 1, 387 DeviceState::UnDefined => 2, 388 } 389 } 390 } 391 392 #[derive(Debug)] 393 pub struct DeviceKObjType; 394 395 impl KObjType for DeviceKObjType { 396 // https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c#2307 397 fn release(&self, kobj: Arc<dyn KObject>) { 398 let dev = kobj.cast::<dyn Device>().unwrap(); 399 /* 400 * Some platform devices are driven without driver attached 401 * and managed resources may have been acquired. Make sure 402 * all resources are released. 403 * 404 * Drivers still can add resources into device after device 405 * is deleted but alive, so release devres here to avoid 406 * possible memory leak. 407 */ 408 409 // todo: 在引入devres之后再实现 410 // devres_release_all(kobj); 411 dev.release(); 412 } 413 414 fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> { 415 None 416 } 417 418 fn sysfs_ops(&self) -> Option<&dyn SysFSOps> { 419 Some(&DeviceSysFSOps) 420 } 421 } 422 423 #[derive(Debug)] 424 pub(super) struct DeviceSysFSOps; 425 426 impl SysFSOps for DeviceSysFSOps { 427 fn store( 428 &self, 429 kobj: Arc<dyn KObject>, 430 attr: &dyn Attribute, 431 buf: &[u8], 432 ) -> Result<usize, SystemError> { 433 return attr.store(kobj, buf); 434 } 435 436 fn show( 437 &self, 438 kobj: Arc<dyn KObject>, 439 attr: &dyn Attribute, 440 buf: &mut [u8], 441 ) -> Result<usize, SystemError> { 442 return attr.show(kobj, buf); 443 } 444 } 445 446 /// @brief Device管理器 447 #[derive(Debug)] 448 pub struct DeviceManager; 449 450 impl DeviceManager { 451 /// @brief: 创建一个新的设备管理器 452 /// @parameter: None 453 /// @return: DeviceManager实体 454 #[inline] 455 const fn new() -> DeviceManager { 456 return Self; 457 } 458 459 pub fn register(&self, device: Arc<dyn Device>) -> Result<(), SystemError> { 460 self.device_default_initialize(&device); 461 return self.add_device(device); 462 } 463 464 /// @brief: 添加设备 465 /// @parameter id_table: 总线标识符,用于唯一标识该总线 466 /// @parameter dev: 设备实例 467 /// @return: None 468 /// 469 /// https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c#3398 470 /// 471 /// todo: 完善错误处理逻辑:如果添加失败,需要将之前添加的内容全部回滚 472 #[inline(never)] 473 #[allow(dead_code)] 474 pub fn add_device(&self, device: Arc<dyn Device>) -> Result<(), SystemError> { 475 // 在这里处理与parent相关的逻辑 476 477 let current_parent = device 478 .parent() 479 .and_then(|x| x.upgrade()) 480 .and_then(|x| x.arc_any().cast::<dyn Device>().ok()); 481 482 let actual_parent = self.get_device_parent(&device, current_parent)?; 483 if let Some(actual_parent) = actual_parent { 484 // kdebug!( 485 // "device '{}' parent is '{}', strong_count: {}", 486 // device.name().to_string(), 487 // actual_parent.name(), 488 // Arc::strong_count(&actual_parent) 489 // ); 490 device.set_parent(Some(Arc::downgrade(&actual_parent))); 491 } 492 493 KObjectManager::add_kobj(device.clone() as Arc<dyn KObject>, None).map_err(|e| { 494 kerror!("add device '{:?}' failed: {:?}", device.name(), e); 495 e 496 })?; 497 498 self.device_platform_notify(&device); 499 500 self.add_class_symlinks(&device)?; 501 502 self.add_attrs(&device)?; 503 504 bus_add_device(&device)?; 505 506 if device.id_table().device_number().major() != Major::UNNAMED_MAJOR { 507 self.create_file(&device, &DeviceAttrDev)?; 508 509 self.create_sys_dev_entry(&device)?; 510 } 511 512 // 通知客户端有关设备添加的信息。此调用必须在 dpm_sysfs_add() 之后且在 kobject_uevent() 之前执行。 513 if let Some(bus) = device.bus().and_then(|bus| bus.upgrade()) { 514 bus.subsystem().bus_notifier().call_chain( 515 bus::BusNotifyEvent::AddDevice, 516 Some(&device), 517 None, 518 ); 519 } 520 521 // todo: 发送uevent: KOBJ_ADD 522 523 // probe drivers for a new device 524 bus_probe_device(&device); 525 526 if let Some(class) = device.class() { 527 class.subsystem().add_device_to_vec(&device)?; 528 529 for class_interface in class.subsystem().interfaces() { 530 class_interface.add_device(&device).ok(); 531 } 532 } 533 534 return Ok(()); 535 } 536 537 /// 获取设备真实的parent kobject 538 /// 539 /// ## 参数 540 /// 541 /// - `device`: 设备 542 /// - `current_parent`: 当前的parent kobject 543 /// 544 /// ## 返回值 545 /// 546 /// - `Ok(Some(kobj))`: 如果找到了真实的parent kobject,那么返回它 547 /// - `Ok(None)`: 如果没有找到真实的parent kobject,那么返回None 548 /// - `Err(e)`: 如果发生错误,那么返回错误 549 fn get_device_parent( 550 &self, 551 device: &Arc<dyn Device>, 552 current_parent: Option<Arc<dyn Device>>, 553 ) -> Result<Option<Arc<dyn KObject>>, SystemError> { 554 // kdebug!("get_device_parent() device:{:?}", device.name()); 555 if device.class().is_some() { 556 let parent_kobj: Arc<dyn KObject>; 557 // kdebug!("current_parent:{:?}", current_parent); 558 if let Some(cp) = current_parent { 559 if cp.class().is_some() { 560 return Ok(Some(cp.clone() as Arc<dyn KObject>)); 561 } else { 562 parent_kobj = cp.clone() as Arc<dyn KObject>; 563 } 564 } else { 565 parent_kobj = sys_devices_virtual_kset() as Arc<dyn KObject>; 566 } 567 568 // 是否需要glue dir? 569 570 return Ok(Some(parent_kobj)); 571 } 572 573 // subsystems can specify a default root directory for their devices 574 if current_parent.is_none() { 575 if let Some(bus) = device.bus().and_then(|bus| bus.upgrade()) { 576 if let Some(root) = bus.root_device().and_then(|x| x.upgrade()) { 577 return Ok(Some(root as Arc<dyn KObject>)); 578 } 579 } 580 } 581 582 if let Some(current_parent) = current_parent { 583 return Ok(Some(current_parent as Arc<dyn KObject>)); 584 } 585 586 return Ok(None); 587 } 588 589 /// @brief: 卸载设备 590 /// @parameter id_table: 总线标识符,用于唯一标识该设备 591 /// @return: None 592 /// 593 /// ## 注意 594 /// 该函数已废弃,不再使用 595 #[inline] 596 #[allow(dead_code)] 597 pub fn remove_device(&self, _id_table: &IdTable) { 598 todo!() 599 } 600 601 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?fi=driver_attach#542 602 pub fn remove(&self, _dev: &Arc<dyn Device>) { 603 todo!("DeviceManager::remove") 604 } 605 606 /// @brief: 获取设备 607 /// @parameter id_table: 设备标识符,用于唯一标识该设备 608 /// @return: 设备实例 609 #[inline] 610 #[allow(dead_code)] 611 pub fn find_device_by_idtable(&self, _id_table: &IdTable) -> Option<Arc<dyn Device>> { 612 todo!("find_device_by_idtable") 613 } 614 615 fn device_platform_notify(&self, dev: &Arc<dyn Device>) { 616 acpi_device_notify(dev); 617 software_node_notify(dev); 618 } 619 620 // 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c#3224 621 fn add_class_symlinks(&self, dev: &Arc<dyn Device>) -> Result<(), SystemError> { 622 let class = dev.class(); 623 if class.is_none() { 624 return Ok(()); 625 } 626 627 // 定义错误处理函数,用于在添加符号链接失败时,移除已经添加的符号链接 628 629 let err_remove_device = |dev_kobj: &Arc<dyn KObject>| { 630 sysfs_instance().remove_link(dev_kobj, "device".to_string()); 631 }; 632 633 let err_remove_subsystem = |dev_kobj: &Arc<dyn KObject>| { 634 sysfs_instance().remove_link(dev_kobj, "subsystem".to_string()); 635 }; 636 637 let class = class.unwrap(); 638 let dev_kobj = dev.clone() as Arc<dyn KObject>; 639 let subsys_kobj = class.subsystem().subsys() as Arc<dyn KObject>; 640 sysfs_instance().create_link(Some(&dev_kobj), &subsys_kobj, "subsystem".to_string())?; 641 642 // todo: 这里需要处理class的parent逻辑, 添加device链接 643 if let Some(parent) = dev.parent().and_then(|x| x.upgrade()) { 644 let parent_kobj = parent.clone() as Arc<dyn KObject>; 645 sysfs_instance() 646 .create_link(Some(&dev_kobj), &parent_kobj, "device".to_string()) 647 .map_err(|e| { 648 err_remove_subsystem(&dev_kobj); 649 e 650 })?; 651 } 652 653 sysfs_instance() 654 .create_link(Some(&subsys_kobj), &dev_kobj, dev.name()) 655 .map_err(|e| { 656 err_remove_device(&dev_kobj); 657 err_remove_subsystem(&dev_kobj); 658 e 659 })?; 660 661 return Ok(()); 662 } 663 664 /// 在sysfs中,为指定的设备创建属性文件 665 /// 666 /// ## 参数 667 /// 668 /// - `dev`: 设备 669 fn add_attrs(&self, dev: &Arc<dyn Device>) -> Result<(), SystemError> { 670 // 定义错误处理函数,用于在添加属性文件失败时,移除已经添加的属性组 671 let err_remove_class_groups = |dev: &Arc<dyn Device>| { 672 if let Some(class) = dev.class() { 673 let attr_groups = class.dev_groups(); 674 self.remove_groups(dev, attr_groups); 675 } 676 }; 677 678 let err_remove_kobj_type_groups = |dev: &Arc<dyn Device>| { 679 if let Some(kobj_type) = dev.kobj_type() { 680 let attr_groups = kobj_type.attribute_groups().unwrap_or(&[]); 681 self.remove_groups(dev, attr_groups); 682 } 683 }; 684 685 // 真正开始添加属性文件 686 687 // 添加设备类的属性文件 688 if let Some(class) = dev.class() { 689 let attr_groups = class.dev_groups(); 690 self.add_groups(dev, attr_groups)?; 691 } 692 693 // 添加kobj_type的属性文件 694 if let Some(kobj_type) = dev.kobj_type() { 695 self.add_groups(dev, kobj_type.attribute_groups().unwrap_or(&[])) 696 .map_err(|e| { 697 err_remove_class_groups(dev); 698 e 699 })?; 700 } 701 702 // 添加设备本身的属性文件 703 self.add_groups(dev, dev.attribute_groups().unwrap_or(&[])) 704 .map_err(|e| { 705 err_remove_kobj_type_groups(dev); 706 err_remove_class_groups(dev); 707 e 708 })?; 709 710 return Ok(()); 711 } 712 713 /// 在sysfs中,为指定的设备创建属性组,以及属性组中的属性文件 714 /// 715 /// ## 参数 716 /// 717 /// - `dev`: 设备 718 /// - `attr_groups`: 属性组 719 pub fn add_groups( 720 &self, 721 dev: &Arc<dyn Device>, 722 attr_groups: &'static [&dyn AttributeGroup], 723 ) -> Result<(), SystemError> { 724 let kobj = dev.clone() as Arc<dyn KObject>; 725 return sysfs_instance().create_groups(&kobj, attr_groups); 726 } 727 728 /// 在sysfs中,为指定的设备移除属性组,以及属性组中的属性文件 729 /// 730 /// ## 参数 731 /// 732 /// - `dev`: 设备 733 /// - `attr_groups`: 要移除的属性组 734 pub fn remove_groups( 735 &self, 736 dev: &Arc<dyn Device>, 737 attr_groups: &'static [&dyn AttributeGroup], 738 ) { 739 let kobj = dev.clone() as Arc<dyn KObject>; 740 sysfs_instance().remove_groups(&kobj, attr_groups); 741 } 742 743 /// 为设备在sysfs中创建属性文件 744 /// 745 /// ## 参数 746 /// 747 /// - `dev`: 设备 748 /// - `attr`: 属性 749 pub fn create_file( 750 &self, 751 dev: &Arc<dyn Device>, 752 attr: &'static dyn Attribute, 753 ) -> Result<(), SystemError> { 754 if unlikely( 755 attr.mode().contains(ModeType::S_IRUGO) 756 && (!attr.support().contains(SysFSOpsSupport::ATTR_SHOW)), 757 ) { 758 kwarn!( 759 "Attribute '{}': read permission without 'show'", 760 attr.name() 761 ); 762 } 763 if unlikely( 764 attr.mode().contains(ModeType::S_IWUGO) 765 && (!attr.support().contains(SysFSOpsSupport::ATTR_STORE)), 766 ) { 767 kwarn!( 768 "Attribute '{}': write permission without 'store'", 769 attr.name() 770 ); 771 } 772 773 let kobj = dev.clone() as Arc<dyn KObject>; 774 775 return sysfs_instance().create_file(&kobj, attr); 776 } 777 778 /// 在/sys/dev下,或者设备所属的class下,为指定的设备创建链接 779 fn create_sys_dev_entry(&self, dev: &Arc<dyn Device>) -> Result<(), SystemError> { 780 let target_kobj = self.device_to_dev_kobj(dev); 781 let name = dev.id_table().name(); 782 let current_kobj = dev.clone() as Arc<dyn KObject>; 783 return sysfs_instance().create_link(Some(&target_kobj), ¤t_kobj, name); 784 } 785 786 /// Delete symlink for device in `/sys/dev` or `/sys/class/<class_name>` 787 #[allow(dead_code)] 788 fn remove_sys_dev_entry(&self, dev: &Arc<dyn Device>) { 789 let kobj = self.device_to_dev_kobj(dev); 790 let name = dev.id_table().name(); 791 sysfs_instance().remove_link(&kobj, name); 792 } 793 794 /// device_to_dev_kobj - select a /sys/dev/ directory for the device 795 /// 796 /// By default we select char/ for new entries. 797 /// 798 /// ## 参数 799 /// 800 /// - `dev`: 设备 801 fn device_to_dev_kobj(&self, _dev: &Arc<dyn Device>) -> Arc<dyn KObject> { 802 // todo: 处理class的逻辑 803 let kobj = sys_dev_char_kset().as_kobject(); 804 return kobj; 805 } 806 807 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c?fi=device_links_force_bind#1226 808 pub fn device_links_force_bind(&self, _dev: &Arc<dyn Device>) { 809 todo!("device_links_force_bind") 810 } 811 812 /// 把device对象的一些结构进行默认初始化 813 /// 814 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/core.c?fi=device_initialize#2976 815 pub fn device_default_initialize(&self, dev: &Arc<dyn Device>) { 816 dev.set_kset(Some(sys_devices_kset())); 817 dev.set_kobj_type(Some(&DeviceKObjType)); 818 return; 819 } 820 821 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?r=&mo=29885&fi=1100#1100 822 pub fn device_driver_attach( 823 &self, 824 _driver: &Arc<dyn Driver>, 825 _dev: &Arc<dyn Device>, 826 ) -> Result<(), SystemError> { 827 todo!("device_driver_attach") 828 } 829 830 /// 参考 https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/base/dd.c?r=&mo=35401&fi=1313#1313 831 pub fn device_driver_detach(&self, _dev: &Arc<dyn Device>) { 832 todo!("device_driver_detach") 833 } 834 } 835 836 /// @brief: 设备注册 837 /// @parameter: name: 设备名 838 /// @return: 操作成功,返回(),操作失败,返回错误码 839 pub fn device_register<T: Device>(device: Arc<T>) -> Result<(), SystemError> { 840 return device_manager().register(device); 841 } 842 843 /// @brief: 设备卸载 844 /// @parameter: name: 设备名 845 /// @return: 操作成功,返回(),操作失败,返回错误码 846 pub fn device_unregister<T: Device>(_device: Arc<T>) { 847 // DEVICE_MANAGER.add_device(device.id_table(), device.clone()); 848 // match sys_device_unregister(&device.id_table().name()) { 849 // Ok(_) => { 850 // device.set_inode(None); 851 // return Ok(()); 852 // } 853 // Err(_) => Err(DeviceError::RegisterError), 854 // } 855 todo!("device_unregister") 856 } 857 858 /// 设备文件夹下的`dev`文件的属性 859 #[derive(Debug, Clone, Copy)] 860 pub struct DeviceAttrDev; 861 862 impl Attribute for DeviceAttrDev { 863 fn mode(&self) -> ModeType { 864 // 0o444 865 return ModeType::S_IRUGO; 866 } 867 868 fn name(&self) -> &str { 869 "dev" 870 } 871 872 fn show(&self, kobj: Arc<dyn KObject>, buf: &mut [u8]) -> Result<usize, SystemError> { 873 let dev = kobj.cast::<dyn Device>().map_err(|kobj| { 874 kerror!( 875 "Intertrait casting not implemented for kobj: {}", 876 kobj.name() 877 ); 878 SystemError::ENOSYS 879 })?; 880 881 let device_number = dev.id_table().device_number(); 882 let s = format!( 883 "{}:{}\n", 884 device_number.major().data(), 885 device_number.minor() 886 ); 887 888 return sysfs_emit_str(buf, &s); 889 } 890 891 fn support(&self) -> SysFSOpsSupport { 892 SysFSOpsSupport::ATTR_SHOW 893 } 894 } 895 896 /// 设备匹配器 897 /// 898 /// 用于匹配设备是否符合某个条件 899 /// 900 /// ## 参数 901 /// 902 /// - `T` - 匹配器的数据类型 903 /// - `data` - 匹配器的数据 904 pub trait DeviceMatcher<T>: Debug { 905 fn match_device(&self, device: &Arc<dyn Device>, data: T) -> bool; 906 } 907 908 /// 用于根据名称匹配设备的匹配器 909 #[derive(Debug)] 910 pub struct DeviceMatchName; 911 912 impl DeviceMatcher<&str> for DeviceMatchName { 913 #[inline] 914 fn match_device(&self, device: &Arc<dyn Device>, data: &str) -> bool { 915 return device.name() == data; 916 } 917 } 918 919 /// Cookie to identify the device 920 #[derive(Debug, Clone)] 921 pub struct DeviceId { 922 data: Option<&'static str>, 923 allocated: Option<String>, 924 } 925 926 impl DeviceId { 927 #[allow(dead_code)] 928 pub fn new(data: Option<&'static str>, allocated: Option<String>) -> Option<Arc<Self>> { 929 if data.is_none() && allocated.is_none() { 930 return None; 931 } 932 933 // 如果data和allocated都有值,那么返回None 934 if data.is_some() && allocated.is_some() { 935 return None; 936 } 937 938 return Some(Arc::new(Self { data, allocated })); 939 } 940 941 pub fn id(&self) -> Option<&str> { 942 if self.data.is_some() { 943 return Some(self.data.unwrap()); 944 } else { 945 return self.allocated.as_deref(); 946 } 947 } 948 949 #[allow(dead_code)] 950 pub fn set_allocated(&mut self, allocated: String) { 951 self.allocated = Some(allocated); 952 self.data = None; 953 } 954 } 955 956 impl PartialEq for DeviceId { 957 fn eq(&self, other: &Self) -> bool { 958 return self.id() == other.id(); 959 } 960 } 961 962 impl core::hash::Hash for DeviceId { 963 fn hash<H: core::hash::Hasher>(&self, state: &mut H) { 964 self.id().hash(state); 965 } 966 } 967 968 impl Eq for DeviceId {} 969 970 impl IrqHandlerData for DeviceId {} 971