mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
修复tty设备显示在/sys目录下的bug (#668)
This commit is contained in:
parent
2755467c79
commit
0cb807346c
@ -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;
|
||||
|
77
kernel/src/driver/tty/sysfs.rs
Normal file
77
kernel/src/driver/tty/sysfs.rs
Normal 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(());
|
||||
}
|
@ -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>> {
|
||||
|
Loading…
x
Reference in New Issue
Block a user