sysfs.rs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. use alloc::{
  2. string::ToString,
  3. sync::{Arc, Weak},
  4. };
  5. use system_error::SystemError;
  6. use unified_init::macros::unified_init;
  7. use crate::{
  8. driver::base::{
  9. class::{class_manager, Class},
  10. device::sys_dev_char_kset,
  11. kobject::KObject,
  12. subsys::SubSysPrivate,
  13. },
  14. filesystem::sysfs::AttributeGroup,
  15. init::initcall::INITCALL_SUBSYS,
  16. };
  17. /// `/sys/class/tty` 的 class 实例
  18. static mut CLASS_TTY_INSTANCE: Option<Arc<TtyClass>> = None;
  19. /// 获取 `/sys/class/tty` 的 class 实例
  20. #[inline(always)]
  21. #[allow(dead_code)]
  22. pub fn sys_class_tty_instance() -> Option<&'static Arc<TtyClass>> {
  23. unsafe { CLASS_TTY_INSTANCE.as_ref() }
  24. }
  25. /// `/sys/class/tty` 类
  26. #[derive(Debug)]
  27. pub struct TtyClass {
  28. subsystem: SubSysPrivate,
  29. }
  30. impl TtyClass {
  31. const NAME: &'static str = "tty";
  32. pub fn new() -> Arc<Self> {
  33. let r = Self {
  34. subsystem: SubSysPrivate::new(Self::NAME.to_string(), None, None, &[]),
  35. };
  36. let r = Arc::new(r);
  37. r.subsystem()
  38. .set_class(Some(Arc::downgrade(&r) as Weak<dyn Class>));
  39. return r;
  40. }
  41. }
  42. impl Class for TtyClass {
  43. fn name(&self) -> &'static str {
  44. return Self::NAME;
  45. }
  46. fn dev_kobj(&self) -> Option<Arc<dyn KObject>> {
  47. Some(sys_dev_char_kset() as Arc<dyn KObject>)
  48. }
  49. fn set_dev_kobj(&self, _kobj: Arc<dyn KObject>) {
  50. unimplemented!("TtyClass::set_dev_kobj");
  51. }
  52. fn subsystem(&self) -> &SubSysPrivate {
  53. return &self.subsystem;
  54. }
  55. }
  56. /// 初始化帧缓冲区子系统
  57. #[unified_init(INITCALL_SUBSYS)]
  58. pub fn tty_sysfs_init() -> Result<(), SystemError> {
  59. let tty_class = TtyClass::new();
  60. class_manager().class_register(&(tty_class.clone() as Arc<dyn Class>))?;
  61. unsafe {
  62. CLASS_TTY_INSTANCE = Some(tty_class);
  63. }
  64. return Ok(());
  65. }