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

This commit is contained in:
LoGin 2024-03-26 18:26:02 +08:00 committed by GitHub
parent 2755467c79
commit 0cb807346c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 91 additions and 1 deletions

View File

@ -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;

View File

@ -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(());
}

View File

@ -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<Weak<dyn Bus>> {
self.inner.read().bus.clone()
}
fn set_bus(&self, bus: Option<alloc::sync::Weak<dyn crate::driver::base::device::bus::Bus>>) {
self.inner.write().bus = bus
}
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>> {