Browse Source

修复tty设备显示在/sys目录下的bug (#668)

LoGin 11 months ago
parent
commit
0cb807346c

+ 1 - 0
kernel/src/driver/tty/mod.rs

@@ -2,6 +2,7 @@ use alloc::vec::Vec;
 
 
 pub mod console;
 pub mod console;
 pub mod kthread;
 pub mod kthread;
+mod sysfs;
 pub mod termios;
 pub mod termios;
 pub mod tty_core;
 pub mod tty_core;
 pub mod tty_device;
 pub mod tty_device;

+ 77 - 0
kernel/src/driver/tty/sysfs.rs

@@ -0,0 +1,77 @@
+use alloc::{
+    string::ToString,
+    sync::{Arc, Weak},
+};
+use system_error::SystemError;
+use unified_init::macros::unified_init;
+
+use crate::{
+    driver::base::{
+        class::{class_manager, Class},
+        device::sys_dev_char_kset,
+        kobject::KObject,
+        subsys::SubSysPrivate,
+    },
+    init::initcall::INITCALL_SUBSYS,
+};
+
+/// `/sys/class/tty` 的 class 实例
+static mut CLASS_TTY_INSTANCE: Option<Arc<TtyClass>> = None;
+
+/// 获取 `/sys/class/tty` 的 class 实例
+#[inline(always)]
+#[allow(dead_code)]
+pub fn sys_class_tty_instance() -> Option<&'static Arc<TtyClass>> {
+    unsafe { CLASS_TTY_INSTANCE.as_ref() }
+}
+
+/// `/sys/class/tty` 类
+#[derive(Debug)]
+pub struct TtyClass {
+    subsystem: SubSysPrivate,
+}
+
+impl TtyClass {
+    const NAME: &'static str = "tty";
+    pub fn new() -> Arc<Self> {
+        let r = Self {
+            subsystem: SubSysPrivate::new(Self::NAME.to_string(), None, None, &[]),
+        };
+        let r = Arc::new(r);
+        r.subsystem()
+            .set_class(Some(Arc::downgrade(&r) as Weak<dyn Class>));
+
+        return r;
+    }
+}
+
+impl Class for TtyClass {
+    fn name(&self) -> &'static str {
+        return Self::NAME;
+    }
+
+    fn dev_kobj(&self) -> Option<Arc<dyn KObject>> {
+        Some(sys_dev_char_kset() as Arc<dyn KObject>)
+    }
+
+    fn set_dev_kobj(&self, _kobj: Arc<dyn KObject>) {
+        unimplemented!("TtyClass::set_dev_kobj");
+    }
+
+    fn subsystem(&self) -> &SubSysPrivate {
+        return &self.subsystem;
+    }
+}
+
+/// 初始化帧缓冲区子系统
+#[unified_init(INITCALL_SUBSYS)]
+pub fn tty_sysfs_init() -> Result<(), SystemError> {
+    let tty_class = TtyClass::new();
+    class_manager().class_register(&(tty_class.clone() as Arc<dyn Class>))?;
+
+    unsafe {
+        CLASS_TTY_INSTANCE = Some(tty_class);
+    }
+
+    return Ok(());
+}

+ 13 - 1
kernel/src/driver/tty/tty_device.rs

@@ -10,6 +10,7 @@ use crate::{
     driver::{
     driver::{
         base::{
         base::{
             char::CharDevice,
             char::CharDevice,
+            class::Class,
             device::{
             device::{
                 bus::Bus,
                 bus::Bus,
                 device_number::{DeviceNumber, Major},
                 device_number::{DeviceNumber, Major},
@@ -37,6 +38,7 @@ use crate::{
 
 
 use super::{
 use super::{
     kthread::tty_flush_thread_init,
     kthread::tty_flush_thread_init,
+    sysfs::sys_class_tty_instance,
     termios::WindowSize,
     termios::WindowSize,
     tty_core::{TtyCore, TtyFlag, TtyIoctlCmd},
     tty_core::{TtyCore, TtyFlag, TtyIoctlCmd},
     tty_driver::{TtyDriver, TtyDriverSubType, TtyDriverType, TtyOperation},
     tty_driver::{TtyDriver, TtyDriverSubType, TtyDriverType, TtyOperation},
@@ -421,12 +423,22 @@ impl Device for TtyDevice {
         self.id_table.clone()
         self.id_table.clone()
     }
     }
 
 
+    fn bus(&self) -> Option<Weak<dyn Bus>> {
+        self.inner.read().bus.clone()
+    }
+
     fn set_bus(&self, bus: Option<alloc::sync::Weak<dyn crate::driver::base::device::bus::Bus>>) {
     fn set_bus(&self, bus: Option<alloc::sync::Weak<dyn crate::driver::base::device::bus::Bus>>) {
         self.inner.write().bus = bus
         self.inner.write().bus = bus
     }
     }
 
 
     fn set_class(&self, _class: Option<Weak<dyn crate::driver::base::class::Class>>) {
     fn set_class(&self, _class: Option<Weak<dyn crate::driver::base::class::Class>>) {
-        todo!()
+        // do nothing
+    }
+
+    fn class(&self) -> Option<Arc<dyn Class>> {
+        sys_class_tty_instance()
+            .cloned()
+            .map(|x| x as Arc<dyn Class>)
     }
     }
 
 
     fn driver(&self) -> Option<Arc<dyn crate::driver::base::device::driver::Driver>> {
     fn driver(&self) -> Option<Arc<dyn crate::driver::base::device::driver::Driver>> {