diff --git a/kernel/src/driver/tty/mod.rs b/kernel/src/driver/tty/mod.rs index 9bd9ac08..5b53111c 100644 --- a/kernel/src/driver/tty/mod.rs +++ b/kernel/src/driver/tty/mod.rs @@ -2,6 +2,7 @@ use alloc::vec::Vec; pub mod console; pub mod kthread; +mod sysfs; pub mod termios; pub mod tty_core; pub mod tty_device; diff --git a/kernel/src/driver/tty/sysfs.rs b/kernel/src/driver/tty/sysfs.rs new file mode 100644 index 00000000..b731ab04 --- /dev/null +++ b/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> = None; + +/// 获取 `/sys/class/tty` 的 class 实例 +#[inline(always)] +#[allow(dead_code)] +pub fn sys_class_tty_instance() -> Option<&'static Arc> { + 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 { + 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)); + + return r; + } +} + +impl Class for TtyClass { + fn name(&self) -> &'static str { + return Self::NAME; + } + + fn dev_kobj(&self) -> Option> { + Some(sys_dev_char_kset() as Arc) + } + + fn set_dev_kobj(&self, _kobj: Arc) { + 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))?; + + unsafe { + CLASS_TTY_INSTANCE = Some(tty_class); + } + + return Ok(()); +} diff --git a/kernel/src/driver/tty/tty_device.rs b/kernel/src/driver/tty/tty_device.rs index 898f3d77..ed9214c1 100644 --- a/kernel/src/driver/tty/tty_device.rs +++ b/kernel/src/driver/tty/tty_device.rs @@ -10,6 +10,7 @@ use crate::{ driver::{ base::{ char::CharDevice, + class::Class, device::{ bus::Bus, device_number::{DeviceNumber, Major}, @@ -37,6 +38,7 @@ use crate::{ use super::{ kthread::tty_flush_thread_init, + sysfs::sys_class_tty_instance, termios::WindowSize, tty_core::{TtyCore, TtyFlag, TtyIoctlCmd}, tty_driver::{TtyDriver, TtyDriverSubType, TtyDriverType, TtyOperation}, @@ -421,12 +423,22 @@ impl Device for TtyDevice { self.id_table.clone() } + fn bus(&self) -> Option> { + self.inner.read().bus.clone() + } + fn set_bus(&self, bus: Option>) { self.inner.write().bus = bus } fn set_class(&self, _class: Option>) { - todo!() + // do nothing + } + + fn class(&self) -> Option> { + sys_class_tty_instance() + .cloned() + .map(|x| x as Arc) } fn driver(&self) -> Option> {