120e3152eSlogin use alloc::{ 220e3152eSlogin string::{String, ToString}, 320e3152eSlogin sync::{Arc, Weak}, 420e3152eSlogin }; 591e9d4abSLoGin use system_error::SystemError; 6c566df45SLoGin use unified_init::macros::unified_init; 70d48c3c9Slogin 80d48c3c9Slogin use crate::{ 9*52da9a59SGnoCiYeH arch::ipc::signal::Signal, 10*52da9a59SGnoCiYeH driver::{ 11*52da9a59SGnoCiYeH base::{ 12*52da9a59SGnoCiYeH char::CharDevice, 13*52da9a59SGnoCiYeH device::{ 14*52da9a59SGnoCiYeH bus::Bus, 15*52da9a59SGnoCiYeH device_number::{DeviceNumber, Major}, 16*52da9a59SGnoCiYeH device_register, 17*52da9a59SGnoCiYeH driver::Driver, 18*52da9a59SGnoCiYeH Device, DeviceKObjType, DeviceType, IdTable, 19*52da9a59SGnoCiYeH }, 20*52da9a59SGnoCiYeH kobject::{KObject, LockedKObjectState}, 21*52da9a59SGnoCiYeH kset::KSet, 22*52da9a59SGnoCiYeH }, 23*52da9a59SGnoCiYeH serial::serial_init, 24*52da9a59SGnoCiYeH }, 250d48c3c9Slogin filesystem::{ 2620e3152eSlogin devfs::{devfs_register, DevFS, DeviceINode}, 27*52da9a59SGnoCiYeH kernfs::KernFSInode, 28*52da9a59SGnoCiYeH vfs::{file::FileMode, syscall::ModeType, FilePrivateData, FileType, IndexNode, Metadata}, 290d48c3c9Slogin }, 30c566df45SLoGin init::initcall::INITCALL_DEVICE, 31*52da9a59SGnoCiYeH libs::rwlock::RwLock, 32*52da9a59SGnoCiYeH mm::VirtAddr, 33*52da9a59SGnoCiYeH process::ProcessManager, 34*52da9a59SGnoCiYeH syscall::user_access::UserBufferWriter, 350d48c3c9Slogin }; 360d48c3c9Slogin 37*52da9a59SGnoCiYeH use super::{ 38*52da9a59SGnoCiYeH termios::WindowSize, 39*52da9a59SGnoCiYeH tty_core::{TtyCore, TtyFlag, TtyIoctlCmd}, 40*52da9a59SGnoCiYeH tty_driver::{TtyDriver, TtyDriverSubType, TtyDriverType, TtyOperation}, 41*52da9a59SGnoCiYeH tty_job_control::TtyJobCtrlManager, 42*52da9a59SGnoCiYeH virtual_terminal::vty_init, 43*52da9a59SGnoCiYeH }; 440d48c3c9Slogin 45*52da9a59SGnoCiYeH #[derive(Debug)] 46*52da9a59SGnoCiYeH pub struct InnerTtyDevice { 47*52da9a59SGnoCiYeH /// 当前设备所述的kset 48*52da9a59SGnoCiYeH kset: Option<Arc<KSet>>, 49*52da9a59SGnoCiYeH parent_kobj: Option<Weak<dyn KObject>>, 50*52da9a59SGnoCiYeH /// 当前设备所述的总线 51*52da9a59SGnoCiYeH bus: Option<Weak<dyn Bus>>, 52*52da9a59SGnoCiYeH inode: Option<Arc<KernFSInode>>, 53*52da9a59SGnoCiYeH driver: Option<Weak<dyn Driver>>, 54*52da9a59SGnoCiYeH can_match: bool, 55*52da9a59SGnoCiYeH 56*52da9a59SGnoCiYeH metadata: Metadata, 5720e3152eSlogin } 5820e3152eSlogin 59*52da9a59SGnoCiYeH impl InnerTtyDevice { 60*52da9a59SGnoCiYeH pub fn new() -> Self { 61*52da9a59SGnoCiYeH Self { 62*52da9a59SGnoCiYeH kset: None, 63*52da9a59SGnoCiYeH parent_kobj: None, 64*52da9a59SGnoCiYeH bus: None, 65*52da9a59SGnoCiYeH inode: None, 66*52da9a59SGnoCiYeH driver: None, 67*52da9a59SGnoCiYeH can_match: false, 68*52da9a59SGnoCiYeH metadata: Metadata::new(FileType::CharDevice, ModeType::from_bits_truncate(0o755)), 69*52da9a59SGnoCiYeH } 70*52da9a59SGnoCiYeH } 71*52da9a59SGnoCiYeH } 72*52da9a59SGnoCiYeH 730d48c3c9Slogin #[derive(Debug)] 74*52da9a59SGnoCiYeH #[cast_to([sync] Device)] 750d48c3c9Slogin pub struct TtyDevice { 76*52da9a59SGnoCiYeH name: &'static str, 77*52da9a59SGnoCiYeH id_table: IdTable, 78*52da9a59SGnoCiYeH inner: RwLock<InnerTtyDevice>, 79*52da9a59SGnoCiYeH kobj_state: LockedKObjectState, 8020e3152eSlogin /// TTY所属的文件系统 8120e3152eSlogin fs: RwLock<Weak<DevFS>>, 820d48c3c9Slogin } 830d48c3c9Slogin 840d48c3c9Slogin impl TtyDevice { 85*52da9a59SGnoCiYeH pub fn new(name: &'static str, id_table: IdTable) -> Arc<TtyDevice> { 86*52da9a59SGnoCiYeH let dev_num = id_table.device_number(); 87*52da9a59SGnoCiYeH let dev = TtyDevice { 88*52da9a59SGnoCiYeH name, 89*52da9a59SGnoCiYeH id_table, 90*52da9a59SGnoCiYeH inner: RwLock::new(InnerTtyDevice::new()), 91*52da9a59SGnoCiYeH kobj_state: LockedKObjectState::new(None), 920d48c3c9Slogin fs: RwLock::new(Weak::default()), 93*52da9a59SGnoCiYeH }; 94*52da9a59SGnoCiYeH 95*52da9a59SGnoCiYeH dev.inner.write().metadata.raw_dev = dev_num; 96*52da9a59SGnoCiYeH 97*52da9a59SGnoCiYeH Arc::new(dev) 98*52da9a59SGnoCiYeH } 990d48c3c9Slogin } 1000d48c3c9Slogin 101*52da9a59SGnoCiYeH impl IndexNode for TtyDevice { 102*52da9a59SGnoCiYeH fn open( 1030d48c3c9Slogin &self, 104*52da9a59SGnoCiYeH data: &mut crate::filesystem::vfs::FilePrivateData, 105*52da9a59SGnoCiYeH mode: &crate::filesystem::vfs::file::FileMode, 106*52da9a59SGnoCiYeH ) -> Result<(), SystemError> { 107*52da9a59SGnoCiYeH let dev_num = self.metadata()?.raw_dev; 108*52da9a59SGnoCiYeH 109*52da9a59SGnoCiYeH let tty = TtyDriver::open_tty(dev_num)?; 110*52da9a59SGnoCiYeH 111*52da9a59SGnoCiYeH // 设置privdata 112*52da9a59SGnoCiYeH *data = FilePrivateData::Tty(TtyFilePrivateData { 113*52da9a59SGnoCiYeH tty: tty.clone(), 114*52da9a59SGnoCiYeH mode: *mode, 115*52da9a59SGnoCiYeH }); 116*52da9a59SGnoCiYeH 117*52da9a59SGnoCiYeH let ret = tty.open(tty.core()); 118*52da9a59SGnoCiYeH if ret.is_err() { 119*52da9a59SGnoCiYeH let err = ret.unwrap_err(); 120*52da9a59SGnoCiYeH if err == SystemError::ENOSYS { 121*52da9a59SGnoCiYeH return Err(SystemError::ENODEV); 1220d48c3c9Slogin } 123*52da9a59SGnoCiYeH return Err(err); 124*52da9a59SGnoCiYeH } 125*52da9a59SGnoCiYeH 126*52da9a59SGnoCiYeH let driver = tty.core().driver(); 127*52da9a59SGnoCiYeH // 考虑noctty(当前tty) 128*52da9a59SGnoCiYeH if !(mode.contains(FileMode::O_NOCTTY) && dev_num == DeviceNumber::new(Major::TTY_MAJOR, 0) 129*52da9a59SGnoCiYeH || dev_num == DeviceNumber::new(Major::TTYAUX_MAJOR, 1) 130*52da9a59SGnoCiYeH || (driver.tty_driver_type() == TtyDriverType::Pty 131*52da9a59SGnoCiYeH && driver.tty_driver_sub_type() == TtyDriverSubType::PtyMaster)) 132*52da9a59SGnoCiYeH { 133*52da9a59SGnoCiYeH let pcb = ProcessManager::current_pcb(); 134*52da9a59SGnoCiYeH let pcb_tty = pcb.sig_info().tty(); 135*52da9a59SGnoCiYeH if pcb_tty.is_none() && tty.core().contorl_info_irqsave().session.is_none() { 136*52da9a59SGnoCiYeH TtyJobCtrlManager::proc_set_tty(tty); 137*52da9a59SGnoCiYeH } 138*52da9a59SGnoCiYeH } 139*52da9a59SGnoCiYeH 140*52da9a59SGnoCiYeH Ok(()) 141*52da9a59SGnoCiYeH } 142*52da9a59SGnoCiYeH 143*52da9a59SGnoCiYeH fn read_at( 144*52da9a59SGnoCiYeH &self, 145*52da9a59SGnoCiYeH _offset: usize, 146*52da9a59SGnoCiYeH len: usize, 147*52da9a59SGnoCiYeH buf: &mut [u8], 148*52da9a59SGnoCiYeH data: &mut crate::filesystem::vfs::FilePrivateData, 149*52da9a59SGnoCiYeH ) -> Result<usize, system_error::SystemError> { 150*52da9a59SGnoCiYeH let (tty, mode) = if let FilePrivateData::Tty(tty_priv) = data { 151*52da9a59SGnoCiYeH (tty_priv.tty.clone(), tty_priv.mode) 152*52da9a59SGnoCiYeH } else { 153676b8ef6SMork return Err(SystemError::EIO); 154*52da9a59SGnoCiYeH }; 155*52da9a59SGnoCiYeH 156*52da9a59SGnoCiYeH let ld = tty.ldisc(); 157*52da9a59SGnoCiYeH let mut offset = 0; 158*52da9a59SGnoCiYeH let mut cookie = false; 159*52da9a59SGnoCiYeH loop { 160*52da9a59SGnoCiYeH let mut size = if len > buf.len() { buf.len() } else { len }; 161*52da9a59SGnoCiYeH size = ld.read(tty.clone(), buf, size, &mut cookie, offset, mode)?; 162*52da9a59SGnoCiYeH // 没有更多数据 163*52da9a59SGnoCiYeH if size == 0 { 164*52da9a59SGnoCiYeH break; 1650d48c3c9Slogin } 16620e3152eSlogin 167*52da9a59SGnoCiYeH offset += size; 168*52da9a59SGnoCiYeH 169*52da9a59SGnoCiYeH // 缓冲区写满 170*52da9a59SGnoCiYeH if offset >= len { 171*52da9a59SGnoCiYeH break; 17220e3152eSlogin } 17320e3152eSlogin 174*52da9a59SGnoCiYeH // 没有更多数据 175*52da9a59SGnoCiYeH if !cookie { 176*52da9a59SGnoCiYeH break; 17720e3152eSlogin } 17820e3152eSlogin } 17920e3152eSlogin 180*52da9a59SGnoCiYeH return Ok(offset); 18120e3152eSlogin } 18220e3152eSlogin 183*52da9a59SGnoCiYeH fn write_at( 184*52da9a59SGnoCiYeH &self, 185*52da9a59SGnoCiYeH _offset: usize, 186*52da9a59SGnoCiYeH len: usize, 187*52da9a59SGnoCiYeH buf: &[u8], 188*52da9a59SGnoCiYeH data: &mut crate::filesystem::vfs::FilePrivateData, 189*52da9a59SGnoCiYeH ) -> Result<usize, system_error::SystemError> { 190*52da9a59SGnoCiYeH let mut count = len; 191*52da9a59SGnoCiYeH let (tty, mode) = if let FilePrivateData::Tty(tty_priv) = data { 192*52da9a59SGnoCiYeH (tty_priv.tty.clone(), tty_priv.mode) 193*52da9a59SGnoCiYeH } else { 194*52da9a59SGnoCiYeH return Err(SystemError::EIO); 195*52da9a59SGnoCiYeH }; 196*52da9a59SGnoCiYeH 197*52da9a59SGnoCiYeH let ld = tty.ldisc(); 198*52da9a59SGnoCiYeH let core = tty.core(); 199*52da9a59SGnoCiYeH let mut chunk = 2048; 200*52da9a59SGnoCiYeH if core.flags().contains(TtyFlag::NO_WRITE_SPLIT) { 201*52da9a59SGnoCiYeH chunk = 65536; 202*52da9a59SGnoCiYeH } 203*52da9a59SGnoCiYeH chunk = chunk.min(count); 204*52da9a59SGnoCiYeH 205*52da9a59SGnoCiYeH let pcb = ProcessManager::current_pcb(); 206*52da9a59SGnoCiYeH let mut written = 0; 207*52da9a59SGnoCiYeH loop { 208*52da9a59SGnoCiYeH // 至少需要写多少 209*52da9a59SGnoCiYeH let size = chunk.min(count); 210*52da9a59SGnoCiYeH 211*52da9a59SGnoCiYeH // 将数据从buf拷贝到writebuf 212*52da9a59SGnoCiYeH 213*52da9a59SGnoCiYeH let ret = ld.write(tty.clone(), buf, size, mode)?; 214*52da9a59SGnoCiYeH 215*52da9a59SGnoCiYeH written += ret; 216*52da9a59SGnoCiYeH count -= ret; 217*52da9a59SGnoCiYeH 218*52da9a59SGnoCiYeH if count == 0 { 219*52da9a59SGnoCiYeH break; 220*52da9a59SGnoCiYeH } 221*52da9a59SGnoCiYeH 222*52da9a59SGnoCiYeH if pcb.sig_info().sig_pending().has_pending() { 223*52da9a59SGnoCiYeH return Err(SystemError::ERESTARTSYS); 22420e3152eSlogin } 22520e3152eSlogin } 226*52da9a59SGnoCiYeH 227*52da9a59SGnoCiYeH if written > 0 { 228*52da9a59SGnoCiYeH // todo: 更新时间 229*52da9a59SGnoCiYeH } 230*52da9a59SGnoCiYeH 231*52da9a59SGnoCiYeH Ok(written) 232*52da9a59SGnoCiYeH } 233*52da9a59SGnoCiYeH 234*52da9a59SGnoCiYeH fn fs(&self) -> Arc<dyn crate::filesystem::vfs::FileSystem> { 235*52da9a59SGnoCiYeH todo!() 236*52da9a59SGnoCiYeH } 237*52da9a59SGnoCiYeH 238*52da9a59SGnoCiYeH fn as_any_ref(&self) -> &dyn core::any::Any { 239*52da9a59SGnoCiYeH todo!() 240*52da9a59SGnoCiYeH } 241*52da9a59SGnoCiYeH 242*52da9a59SGnoCiYeH fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, system_error::SystemError> { 243*52da9a59SGnoCiYeH todo!() 244*52da9a59SGnoCiYeH } 245*52da9a59SGnoCiYeH 246*52da9a59SGnoCiYeH fn metadata(&self) -> Result<crate::filesystem::vfs::Metadata, SystemError> { 247*52da9a59SGnoCiYeH Ok(self.inner.read().metadata.clone()) 248*52da9a59SGnoCiYeH } 249*52da9a59SGnoCiYeH 250*52da9a59SGnoCiYeH fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> { 251*52da9a59SGnoCiYeH Ok(()) 252*52da9a59SGnoCiYeH } 253*52da9a59SGnoCiYeH 254*52da9a59SGnoCiYeH fn resize(&self, _len: usize) -> Result<(), SystemError> { 255*52da9a59SGnoCiYeH Ok(()) 256*52da9a59SGnoCiYeH } 257*52da9a59SGnoCiYeH 258*52da9a59SGnoCiYeH fn ioctl(&self, cmd: u32, arg: usize, data: &FilePrivateData) -> Result<usize, SystemError> { 259*52da9a59SGnoCiYeH let (tty, _) = if let FilePrivateData::Tty(tty_priv) = data { 260*52da9a59SGnoCiYeH (tty_priv.tty.clone(), tty_priv.mode) 261*52da9a59SGnoCiYeH } else { 262*52da9a59SGnoCiYeH return Err(SystemError::EIO); 263*52da9a59SGnoCiYeH }; 264*52da9a59SGnoCiYeH 265*52da9a59SGnoCiYeH match cmd { 266*52da9a59SGnoCiYeH TtyIoctlCmd::TIOCSETD 267*52da9a59SGnoCiYeH | TtyIoctlCmd::TIOCSBRK 268*52da9a59SGnoCiYeH | TtyIoctlCmd::TIOCCBRK 269*52da9a59SGnoCiYeH | TtyIoctlCmd::TCSBRK 270*52da9a59SGnoCiYeH | TtyIoctlCmd::TCSBRKP => { 271*52da9a59SGnoCiYeH TtyJobCtrlManager::tty_check_change(tty.clone(), Signal::SIGTTOU)?; 272*52da9a59SGnoCiYeH if cmd != TtyIoctlCmd::TIOCCBRK { 273*52da9a59SGnoCiYeH todo!() 274*52da9a59SGnoCiYeH } 275*52da9a59SGnoCiYeH } 276*52da9a59SGnoCiYeH _ => {} 277*52da9a59SGnoCiYeH } 278*52da9a59SGnoCiYeH 279*52da9a59SGnoCiYeH match cmd { 280*52da9a59SGnoCiYeH TtyIoctlCmd::TIOCGWINSZ => { 281*52da9a59SGnoCiYeH let core = tty.core(); 282*52da9a59SGnoCiYeH let winsize = *core.window_size(); 283*52da9a59SGnoCiYeH 284*52da9a59SGnoCiYeH let mut user_writer = UserBufferWriter::new( 285*52da9a59SGnoCiYeH VirtAddr::new(arg).as_ptr::<WindowSize>(), 286*52da9a59SGnoCiYeH core::mem::size_of::<WindowSize>(), 287*52da9a59SGnoCiYeH true, 288*52da9a59SGnoCiYeH )?; 289*52da9a59SGnoCiYeH 290*52da9a59SGnoCiYeH let err = user_writer.copy_one_to_user(&winsize, 0); 291*52da9a59SGnoCiYeH if err.is_err() { 292*52da9a59SGnoCiYeH return Err(SystemError::EFAULT); 293*52da9a59SGnoCiYeH } 294*52da9a59SGnoCiYeH return Ok(0); 295*52da9a59SGnoCiYeH } 296*52da9a59SGnoCiYeH _ => match TtyJobCtrlManager::job_ctrl_ioctl(tty.clone(), cmd, arg) { 297*52da9a59SGnoCiYeH Ok(_) => { 298*52da9a59SGnoCiYeH return Ok(0); 299*52da9a59SGnoCiYeH } 300*52da9a59SGnoCiYeH Err(e) => { 301*52da9a59SGnoCiYeH if e != SystemError::ENOIOCTLCMD { 302*52da9a59SGnoCiYeH return Err(e); 303*52da9a59SGnoCiYeH } 304*52da9a59SGnoCiYeH } 305*52da9a59SGnoCiYeH }, 306*52da9a59SGnoCiYeH } 307*52da9a59SGnoCiYeH 308*52da9a59SGnoCiYeH match tty.ioctl(tty.clone(), cmd, arg) { 309*52da9a59SGnoCiYeH Ok(_) => { 310*52da9a59SGnoCiYeH return Ok(0); 311*52da9a59SGnoCiYeH } 312*52da9a59SGnoCiYeH Err(e) => { 313*52da9a59SGnoCiYeH if e != SystemError::ENOIOCTLCMD { 314*52da9a59SGnoCiYeH return Err(e); 315*52da9a59SGnoCiYeH } 316*52da9a59SGnoCiYeH } 317*52da9a59SGnoCiYeH } 318*52da9a59SGnoCiYeH tty.ldisc().ioctl(tty, cmd, arg)?; 319*52da9a59SGnoCiYeH 320*52da9a59SGnoCiYeH Ok(0) 32120e3152eSlogin } 3220d48c3c9Slogin } 3230d48c3c9Slogin 3240d48c3c9Slogin impl DeviceINode for TtyDevice { 3250d48c3c9Slogin fn set_fs(&self, fs: alloc::sync::Weak<crate::filesystem::devfs::DevFS>) { 3260d48c3c9Slogin *self.fs.write() = fs; 3270d48c3c9Slogin } 3280d48c3c9Slogin } 3290d48c3c9Slogin 330*52da9a59SGnoCiYeH impl KObject for TtyDevice { 3310d48c3c9Slogin fn as_any_ref(&self) -> &dyn core::any::Any { 3320d48c3c9Slogin self 3330d48c3c9Slogin } 3340d48c3c9Slogin 335*52da9a59SGnoCiYeH fn set_inode(&self, inode: Option<Arc<crate::filesystem::kernfs::KernFSInode>>) { 336*52da9a59SGnoCiYeH self.inner.write().inode = inode; 3370d48c3c9Slogin } 33820e3152eSlogin 339*52da9a59SGnoCiYeH fn inode(&self) -> Option<Arc<crate::filesystem::kernfs::KernFSInode>> { 340*52da9a59SGnoCiYeH self.inner.read().inode.clone() 34120e3152eSlogin } 34220e3152eSlogin 343*52da9a59SGnoCiYeH fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> { 344*52da9a59SGnoCiYeH self.inner.read().parent_kobj.clone() 345*52da9a59SGnoCiYeH } 346*52da9a59SGnoCiYeH 347*52da9a59SGnoCiYeH fn set_parent(&self, parent: Option<alloc::sync::Weak<dyn KObject>>) { 348*52da9a59SGnoCiYeH self.inner.write().parent_kobj = parent 349*52da9a59SGnoCiYeH } 350*52da9a59SGnoCiYeH 351*52da9a59SGnoCiYeH fn kset(&self) -> Option<Arc<crate::driver::base::kset::KSet>> { 352*52da9a59SGnoCiYeH self.inner.read().kset.clone() 353*52da9a59SGnoCiYeH } 354*52da9a59SGnoCiYeH 355*52da9a59SGnoCiYeH fn set_kset(&self, kset: Option<Arc<crate::driver::base::kset::KSet>>) { 356*52da9a59SGnoCiYeH self.inner.write().kset = kset 357*52da9a59SGnoCiYeH } 358*52da9a59SGnoCiYeH 359*52da9a59SGnoCiYeH fn kobj_type(&self) -> Option<&'static dyn crate::driver::base::kobject::KObjType> { 360*52da9a59SGnoCiYeH Some(&DeviceKObjType) 361*52da9a59SGnoCiYeH } 362*52da9a59SGnoCiYeH 363*52da9a59SGnoCiYeH fn set_kobj_type(&self, _ktype: Option<&'static dyn crate::driver::base::kobject::KObjType>) {} 364*52da9a59SGnoCiYeH 365*52da9a59SGnoCiYeH fn name(&self) -> alloc::string::String { 366*52da9a59SGnoCiYeH self.name.to_string() 367*52da9a59SGnoCiYeH } 368*52da9a59SGnoCiYeH 369*52da9a59SGnoCiYeH fn set_name(&self, _name: alloc::string::String) { 370*52da9a59SGnoCiYeH // self.name = name 371*52da9a59SGnoCiYeH } 372*52da9a59SGnoCiYeH 373*52da9a59SGnoCiYeH fn kobj_state( 374*52da9a59SGnoCiYeH &self, 375*52da9a59SGnoCiYeH ) -> crate::libs::rwlock::RwLockReadGuard<crate::driver::base::kobject::KObjectState> { 376*52da9a59SGnoCiYeH self.kobj_state.read() 377*52da9a59SGnoCiYeH } 378*52da9a59SGnoCiYeH 379*52da9a59SGnoCiYeH fn kobj_state_mut( 380*52da9a59SGnoCiYeH &self, 381*52da9a59SGnoCiYeH ) -> crate::libs::rwlock::RwLockWriteGuard<crate::driver::base::kobject::KObjectState> { 382*52da9a59SGnoCiYeH self.kobj_state.write() 383*52da9a59SGnoCiYeH } 384*52da9a59SGnoCiYeH 385*52da9a59SGnoCiYeH fn set_kobj_state(&self, state: crate::driver::base::kobject::KObjectState) { 386*52da9a59SGnoCiYeH *self.kobj_state.write() = state 387*52da9a59SGnoCiYeH } 388*52da9a59SGnoCiYeH } 389*52da9a59SGnoCiYeH 390*52da9a59SGnoCiYeH impl Device for TtyDevice { 391*52da9a59SGnoCiYeH fn dev_type(&self) -> crate::driver::base::device::DeviceType { 392*52da9a59SGnoCiYeH DeviceType::Char 393*52da9a59SGnoCiYeH } 394*52da9a59SGnoCiYeH 395*52da9a59SGnoCiYeH fn id_table(&self) -> crate::driver::base::device::IdTable { 396*52da9a59SGnoCiYeH self.id_table.clone() 397*52da9a59SGnoCiYeH } 398*52da9a59SGnoCiYeH 399*52da9a59SGnoCiYeH fn set_bus(&self, bus: Option<alloc::sync::Weak<dyn crate::driver::base::device::bus::Bus>>) { 400*52da9a59SGnoCiYeH self.inner.write().bus = bus 401*52da9a59SGnoCiYeH } 402*52da9a59SGnoCiYeH 403*52da9a59SGnoCiYeH fn set_class(&self, _class: Option<Arc<dyn crate::driver::base::class::Class>>) { 404*52da9a59SGnoCiYeH todo!() 405*52da9a59SGnoCiYeH } 406*52da9a59SGnoCiYeH 407*52da9a59SGnoCiYeH fn driver(&self) -> Option<Arc<dyn crate::driver::base::device::driver::Driver>> { 408*52da9a59SGnoCiYeH self.inner.read().driver.clone()?.upgrade() 409*52da9a59SGnoCiYeH } 410*52da9a59SGnoCiYeH 411*52da9a59SGnoCiYeH fn set_driver( 412*52da9a59SGnoCiYeH &self, 413*52da9a59SGnoCiYeH driver: Option<alloc::sync::Weak<dyn crate::driver::base::device::driver::Driver>>, 414*52da9a59SGnoCiYeH ) { 415*52da9a59SGnoCiYeH self.inner.write().driver = driver 416*52da9a59SGnoCiYeH } 417*52da9a59SGnoCiYeH 418*52da9a59SGnoCiYeH fn is_dead(&self) -> bool { 419*52da9a59SGnoCiYeH false 420*52da9a59SGnoCiYeH } 421*52da9a59SGnoCiYeH 422*52da9a59SGnoCiYeH fn can_match(&self) -> bool { 423*52da9a59SGnoCiYeH self.inner.read().can_match 424*52da9a59SGnoCiYeH } 425*52da9a59SGnoCiYeH 426*52da9a59SGnoCiYeH fn set_can_match(&self, can_match: bool) { 427*52da9a59SGnoCiYeH self.inner.write().can_match = can_match 428*52da9a59SGnoCiYeH } 429*52da9a59SGnoCiYeH 430*52da9a59SGnoCiYeH fn state_synced(&self) -> bool { 431*52da9a59SGnoCiYeH true 432*52da9a59SGnoCiYeH } 433*52da9a59SGnoCiYeH } 434*52da9a59SGnoCiYeH 435*52da9a59SGnoCiYeH impl CharDevice for TtyDevice { 436*52da9a59SGnoCiYeH fn read(&self, _len: usize, _buf: &mut [u8]) -> Result<usize, SystemError> { 437*52da9a59SGnoCiYeH todo!() 438*52da9a59SGnoCiYeH } 439*52da9a59SGnoCiYeH 440*52da9a59SGnoCiYeH fn write(&self, _len: usize, _buf: &[u8]) -> Result<usize, SystemError> { 441*52da9a59SGnoCiYeH todo!() 44220e3152eSlogin } 44320e3152eSlogin 44420e3152eSlogin fn sync(&self) -> Result<(), SystemError> { 445*52da9a59SGnoCiYeH todo!() 44611110997Shanjiezhou } 44720e3152eSlogin } 44820e3152eSlogin 449*52da9a59SGnoCiYeH #[derive(Debug, Clone)] 450*52da9a59SGnoCiYeH pub struct TtyFilePrivateData { 451*52da9a59SGnoCiYeH tty: Arc<TtyCore>, 452*52da9a59SGnoCiYeH mode: FileMode, 45320e3152eSlogin } 45420e3152eSlogin 455*52da9a59SGnoCiYeH /// 初始化tty设备和console子设备 456c566df45SLoGin #[unified_init(INITCALL_DEVICE)] 457*52da9a59SGnoCiYeH #[inline(never)] 45820e3152eSlogin pub fn tty_init() -> Result<(), SystemError> { 459*52da9a59SGnoCiYeH let tty = TtyDevice::new( 460*52da9a59SGnoCiYeH "tty0", 461*52da9a59SGnoCiYeH IdTable::new( 462*52da9a59SGnoCiYeH String::from("tty0"), 463*52da9a59SGnoCiYeH Some(DeviceNumber::new(Major::TTY_MAJOR, 0)), 464*52da9a59SGnoCiYeH ), 465*52da9a59SGnoCiYeH ); 46620e3152eSlogin 467*52da9a59SGnoCiYeH let console = TtyDevice::new( 468*52da9a59SGnoCiYeH "console", 469*52da9a59SGnoCiYeH IdTable::new( 470*52da9a59SGnoCiYeH String::from("console"), 471*52da9a59SGnoCiYeH Some(DeviceNumber::new(Major::TTYAUX_MAJOR, 1)), 472*52da9a59SGnoCiYeH ), 473*52da9a59SGnoCiYeH ); 47420e3152eSlogin 475*52da9a59SGnoCiYeH // 注册tty设备 476*52da9a59SGnoCiYeH // CharDevOps::cdev_add( 477*52da9a59SGnoCiYeH // tty.clone() as Arc<dyn CharDevice>, 478*52da9a59SGnoCiYeH // IdTable::new( 479*52da9a59SGnoCiYeH // String::from("tty0"), 480*52da9a59SGnoCiYeH // Some(DeviceNumber::new(Major::TTYAUX_MAJOR, 0)), 481*52da9a59SGnoCiYeH // ), 482*52da9a59SGnoCiYeH // 1, 483*52da9a59SGnoCiYeH // )?; 48420e3152eSlogin 485*52da9a59SGnoCiYeH // CharDevOps::register_chardev_region(DeviceNumber::new(Major::TTYAUX_MAJOR, 0), 1, "/dev/tty")?; 48620e3152eSlogin 487*52da9a59SGnoCiYeH // 注册console设备 488*52da9a59SGnoCiYeH // CharDevOps::cdev_add( 489*52da9a59SGnoCiYeH // console.clone() as Arc<dyn CharDevice>, 490*52da9a59SGnoCiYeH // IdTable::new( 491*52da9a59SGnoCiYeH // String::from("console"), 492*52da9a59SGnoCiYeH // Some(DeviceNumber::new(Major::TTYAUX_MAJOR, 1)), 493*52da9a59SGnoCiYeH // ), 494*52da9a59SGnoCiYeH // 1, 495*52da9a59SGnoCiYeH // )?; 49620e3152eSlogin 497*52da9a59SGnoCiYeH // CharDevOps::register_chardev_region(DeviceNumber::new(Major::TTYAUX_MAJOR, 1), 1, "/dev/tty")?; 498*52da9a59SGnoCiYeH 499*52da9a59SGnoCiYeH // 将这两个设备注册到devfs,TODO:这里console设备应该与tty在一个设备group里面 500*52da9a59SGnoCiYeH device_register(tty.clone())?; 501*52da9a59SGnoCiYeH device_register(console.clone())?; 502*52da9a59SGnoCiYeH devfs_register(tty.name, tty)?; 503*52da9a59SGnoCiYeH devfs_register(console.name, console)?; 50420e3152eSlogin 505a03c4f9dSLoGin serial_init()?; 506*52da9a59SGnoCiYeH return vty_init(); 5070d48c3c9Slogin } 508