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::{ 952da9a59SGnoCiYeH arch::ipc::signal::Signal, 1052da9a59SGnoCiYeH driver::{ 1152da9a59SGnoCiYeH base::{ 1252da9a59SGnoCiYeH char::CharDevice, 1352da9a59SGnoCiYeH device::{ 1452da9a59SGnoCiYeH bus::Bus, 1552da9a59SGnoCiYeH device_number::{DeviceNumber, Major}, 1652da9a59SGnoCiYeH device_register, 1752da9a59SGnoCiYeH driver::Driver, 1852da9a59SGnoCiYeH Device, DeviceKObjType, DeviceType, IdTable, 1952da9a59SGnoCiYeH }, 2052da9a59SGnoCiYeH kobject::{KObject, LockedKObjectState}, 2152da9a59SGnoCiYeH kset::KSet, 2252da9a59SGnoCiYeH }, 2352da9a59SGnoCiYeH serial::serial_init, 2452da9a59SGnoCiYeH }, 250d48c3c9Slogin filesystem::{ 2620e3152eSlogin devfs::{devfs_register, DevFS, DeviceINode}, 2752da9a59SGnoCiYeH kernfs::KernFSInode, 2852da9a59SGnoCiYeH vfs::{file::FileMode, syscall::ModeType, FilePrivateData, FileType, IndexNode, Metadata}, 290d48c3c9Slogin }, 30c566df45SLoGin init::initcall::INITCALL_DEVICE, 3152da9a59SGnoCiYeH libs::rwlock::RwLock, 3252da9a59SGnoCiYeH mm::VirtAddr, 3352bcb59eSGnoCiYeH net::event_poll::{EPollItem, EventPoll}, 3452da9a59SGnoCiYeH process::ProcessManager, 3552bcb59eSGnoCiYeH syscall::user_access::{UserBufferReader, UserBufferWriter}, 360d48c3c9Slogin }; 370d48c3c9Slogin 3852da9a59SGnoCiYeH use super::{ 3959fdb447SLoGin kthread::tty_flush_thread_init, 4052da9a59SGnoCiYeH termios::WindowSize, 4152da9a59SGnoCiYeH tty_core::{TtyCore, TtyFlag, TtyIoctlCmd}, 4252da9a59SGnoCiYeH tty_driver::{TtyDriver, TtyDriverSubType, TtyDriverType, TtyOperation}, 4352da9a59SGnoCiYeH tty_job_control::TtyJobCtrlManager, 4452da9a59SGnoCiYeH virtual_terminal::vty_init, 4552da9a59SGnoCiYeH }; 460d48c3c9Slogin 4752da9a59SGnoCiYeH #[derive(Debug)] 4852da9a59SGnoCiYeH pub struct InnerTtyDevice { 4952da9a59SGnoCiYeH /// 当前设备所述的kset 5052da9a59SGnoCiYeH kset: Option<Arc<KSet>>, 5152da9a59SGnoCiYeH parent_kobj: Option<Weak<dyn KObject>>, 5252da9a59SGnoCiYeH /// 当前设备所述的总线 5352da9a59SGnoCiYeH bus: Option<Weak<dyn Bus>>, 5452da9a59SGnoCiYeH inode: Option<Arc<KernFSInode>>, 5552da9a59SGnoCiYeH driver: Option<Weak<dyn Driver>>, 5652da9a59SGnoCiYeH can_match: bool, 5752da9a59SGnoCiYeH 5852da9a59SGnoCiYeH metadata: Metadata, 5920e3152eSlogin } 6020e3152eSlogin 6152da9a59SGnoCiYeH impl InnerTtyDevice { 6252da9a59SGnoCiYeH pub fn new() -> Self { 6352da9a59SGnoCiYeH Self { 6452da9a59SGnoCiYeH kset: None, 6552da9a59SGnoCiYeH parent_kobj: None, 6652da9a59SGnoCiYeH bus: None, 6752da9a59SGnoCiYeH inode: None, 6852da9a59SGnoCiYeH driver: None, 6952da9a59SGnoCiYeH can_match: false, 7052da9a59SGnoCiYeH metadata: Metadata::new(FileType::CharDevice, ModeType::from_bits_truncate(0o755)), 7152da9a59SGnoCiYeH } 7252da9a59SGnoCiYeH } 7352da9a59SGnoCiYeH } 7452da9a59SGnoCiYeH 750d48c3c9Slogin #[derive(Debug)] 7652da9a59SGnoCiYeH #[cast_to([sync] Device)] 770d48c3c9Slogin pub struct TtyDevice { 7852da9a59SGnoCiYeH name: &'static str, 7952da9a59SGnoCiYeH id_table: IdTable, 8052da9a59SGnoCiYeH inner: RwLock<InnerTtyDevice>, 8152da9a59SGnoCiYeH kobj_state: LockedKObjectState, 8220e3152eSlogin /// TTY所属的文件系统 8320e3152eSlogin fs: RwLock<Weak<DevFS>>, 840d48c3c9Slogin } 850d48c3c9Slogin 860d48c3c9Slogin impl TtyDevice { 8752da9a59SGnoCiYeH pub fn new(name: &'static str, id_table: IdTable) -> Arc<TtyDevice> { 8852da9a59SGnoCiYeH let dev_num = id_table.device_number(); 8952da9a59SGnoCiYeH let dev = TtyDevice { 9052da9a59SGnoCiYeH name, 9152da9a59SGnoCiYeH id_table, 9252da9a59SGnoCiYeH inner: RwLock::new(InnerTtyDevice::new()), 9352da9a59SGnoCiYeH kobj_state: LockedKObjectState::new(None), 940d48c3c9Slogin fs: RwLock::new(Weak::default()), 9552da9a59SGnoCiYeH }; 9652da9a59SGnoCiYeH 9752da9a59SGnoCiYeH dev.inner.write().metadata.raw_dev = dev_num; 9852da9a59SGnoCiYeH 9952da9a59SGnoCiYeH Arc::new(dev) 10052da9a59SGnoCiYeH } 1010d48c3c9Slogin } 1020d48c3c9Slogin 10352da9a59SGnoCiYeH impl IndexNode for TtyDevice { 10452da9a59SGnoCiYeH fn open( 1050d48c3c9Slogin &self, 10652da9a59SGnoCiYeH data: &mut crate::filesystem::vfs::FilePrivateData, 10752da9a59SGnoCiYeH mode: &crate::filesystem::vfs::file::FileMode, 10852da9a59SGnoCiYeH ) -> Result<(), SystemError> { 10952da9a59SGnoCiYeH let dev_num = self.metadata()?.raw_dev; 11052da9a59SGnoCiYeH 11152da9a59SGnoCiYeH let tty = TtyDriver::open_tty(dev_num)?; 11252da9a59SGnoCiYeH 11352da9a59SGnoCiYeH // 设置privdata 11452da9a59SGnoCiYeH *data = FilePrivateData::Tty(TtyFilePrivateData { 11552da9a59SGnoCiYeH tty: tty.clone(), 11652da9a59SGnoCiYeH mode: *mode, 11752da9a59SGnoCiYeH }); 11852da9a59SGnoCiYeH 11952da9a59SGnoCiYeH let ret = tty.open(tty.core()); 120b5b571e0SLoGin if let Err(err) = ret { 12152da9a59SGnoCiYeH if err == SystemError::ENOSYS { 12252da9a59SGnoCiYeH return Err(SystemError::ENODEV); 1230d48c3c9Slogin } 12452da9a59SGnoCiYeH return Err(err); 12552da9a59SGnoCiYeH } 12652da9a59SGnoCiYeH 12752da9a59SGnoCiYeH let driver = tty.core().driver(); 12852da9a59SGnoCiYeH // 考虑noctty(当前tty) 12952da9a59SGnoCiYeH if !(mode.contains(FileMode::O_NOCTTY) && dev_num == DeviceNumber::new(Major::TTY_MAJOR, 0) 13052da9a59SGnoCiYeH || dev_num == DeviceNumber::new(Major::TTYAUX_MAJOR, 1) 13152da9a59SGnoCiYeH || (driver.tty_driver_type() == TtyDriverType::Pty 13252da9a59SGnoCiYeH && driver.tty_driver_sub_type() == TtyDriverSubType::PtyMaster)) 13352da9a59SGnoCiYeH { 13452da9a59SGnoCiYeH let pcb = ProcessManager::current_pcb(); 13552bcb59eSGnoCiYeH let pcb_tty = pcb.sig_info_irqsave().tty(); 13652da9a59SGnoCiYeH if pcb_tty.is_none() && tty.core().contorl_info_irqsave().session.is_none() { 13752da9a59SGnoCiYeH TtyJobCtrlManager::proc_set_tty(tty); 13852da9a59SGnoCiYeH } 13952da9a59SGnoCiYeH } 14052da9a59SGnoCiYeH 14152da9a59SGnoCiYeH Ok(()) 14252da9a59SGnoCiYeH } 14352da9a59SGnoCiYeH 14452da9a59SGnoCiYeH fn read_at( 14552da9a59SGnoCiYeH &self, 14652da9a59SGnoCiYeH _offset: usize, 14752da9a59SGnoCiYeH len: usize, 14852da9a59SGnoCiYeH buf: &mut [u8], 14952da9a59SGnoCiYeH data: &mut crate::filesystem::vfs::FilePrivateData, 15052da9a59SGnoCiYeH ) -> Result<usize, system_error::SystemError> { 15152da9a59SGnoCiYeH let (tty, mode) = if let FilePrivateData::Tty(tty_priv) = data { 15252da9a59SGnoCiYeH (tty_priv.tty.clone(), tty_priv.mode) 15352da9a59SGnoCiYeH } else { 154676b8ef6SMork return Err(SystemError::EIO); 15552da9a59SGnoCiYeH }; 15652da9a59SGnoCiYeH 15752da9a59SGnoCiYeH let ld = tty.ldisc(); 15852da9a59SGnoCiYeH let mut offset = 0; 15952da9a59SGnoCiYeH let mut cookie = false; 16052da9a59SGnoCiYeH loop { 16152da9a59SGnoCiYeH let mut size = if len > buf.len() { buf.len() } else { len }; 16252da9a59SGnoCiYeH size = ld.read(tty.clone(), buf, size, &mut cookie, offset, mode)?; 16352da9a59SGnoCiYeH // 没有更多数据 16452da9a59SGnoCiYeH if size == 0 { 16552da9a59SGnoCiYeH break; 1660d48c3c9Slogin } 16720e3152eSlogin 16852da9a59SGnoCiYeH offset += size; 16952da9a59SGnoCiYeH 17052da9a59SGnoCiYeH // 缓冲区写满 17152da9a59SGnoCiYeH if offset >= len { 17252da9a59SGnoCiYeH break; 17320e3152eSlogin } 17420e3152eSlogin 17552da9a59SGnoCiYeH // 没有更多数据 17652da9a59SGnoCiYeH if !cookie { 17752da9a59SGnoCiYeH break; 17820e3152eSlogin } 17920e3152eSlogin } 18020e3152eSlogin 18152da9a59SGnoCiYeH return Ok(offset); 18220e3152eSlogin } 18320e3152eSlogin 18452da9a59SGnoCiYeH fn write_at( 18552da9a59SGnoCiYeH &self, 18652da9a59SGnoCiYeH _offset: usize, 18752da9a59SGnoCiYeH len: usize, 18852da9a59SGnoCiYeH buf: &[u8], 18952da9a59SGnoCiYeH data: &mut crate::filesystem::vfs::FilePrivateData, 19052da9a59SGnoCiYeH ) -> Result<usize, system_error::SystemError> { 19152da9a59SGnoCiYeH let mut count = len; 19252da9a59SGnoCiYeH let (tty, mode) = if let FilePrivateData::Tty(tty_priv) = data { 19352da9a59SGnoCiYeH (tty_priv.tty.clone(), tty_priv.mode) 19452da9a59SGnoCiYeH } else { 19552da9a59SGnoCiYeH return Err(SystemError::EIO); 19652da9a59SGnoCiYeH }; 19752da9a59SGnoCiYeH 19852da9a59SGnoCiYeH let ld = tty.ldisc(); 19952da9a59SGnoCiYeH let core = tty.core(); 20052da9a59SGnoCiYeH let mut chunk = 2048; 20152da9a59SGnoCiYeH if core.flags().contains(TtyFlag::NO_WRITE_SPLIT) { 20252da9a59SGnoCiYeH chunk = 65536; 20352da9a59SGnoCiYeH } 20452da9a59SGnoCiYeH chunk = chunk.min(count); 20552da9a59SGnoCiYeH 20652da9a59SGnoCiYeH let pcb = ProcessManager::current_pcb(); 20752da9a59SGnoCiYeH let mut written = 0; 20852da9a59SGnoCiYeH loop { 20952da9a59SGnoCiYeH // 至少需要写多少 21052da9a59SGnoCiYeH let size = chunk.min(count); 21152da9a59SGnoCiYeH 21252da9a59SGnoCiYeH // 将数据从buf拷贝到writebuf 21352da9a59SGnoCiYeH 21452bcb59eSGnoCiYeH let ret = ld.write(tty.clone(), &buf[written..], size, mode)?; 21552da9a59SGnoCiYeH 21652da9a59SGnoCiYeH written += ret; 21752da9a59SGnoCiYeH count -= ret; 21852da9a59SGnoCiYeH 21952da9a59SGnoCiYeH if count == 0 { 22052da9a59SGnoCiYeH break; 22152da9a59SGnoCiYeH } 22252da9a59SGnoCiYeH 22352bcb59eSGnoCiYeH if pcb.sig_info_irqsave().sig_pending().has_pending() { 22452da9a59SGnoCiYeH return Err(SystemError::ERESTARTSYS); 22520e3152eSlogin } 22620e3152eSlogin } 22752da9a59SGnoCiYeH 22852da9a59SGnoCiYeH if written > 0 { 22952da9a59SGnoCiYeH // todo: 更新时间 23052da9a59SGnoCiYeH } 23152da9a59SGnoCiYeH 23252da9a59SGnoCiYeH Ok(written) 23352da9a59SGnoCiYeH } 23452da9a59SGnoCiYeH 23552da9a59SGnoCiYeH fn fs(&self) -> Arc<dyn crate::filesystem::vfs::FileSystem> { 23652da9a59SGnoCiYeH todo!() 23752da9a59SGnoCiYeH } 23852da9a59SGnoCiYeH 23952da9a59SGnoCiYeH fn as_any_ref(&self) -> &dyn core::any::Any { 24052da9a59SGnoCiYeH todo!() 24152da9a59SGnoCiYeH } 24252da9a59SGnoCiYeH 24352da9a59SGnoCiYeH fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, system_error::SystemError> { 24452da9a59SGnoCiYeH todo!() 24552da9a59SGnoCiYeH } 24652da9a59SGnoCiYeH 24752da9a59SGnoCiYeH fn metadata(&self) -> Result<crate::filesystem::vfs::Metadata, SystemError> { 24852da9a59SGnoCiYeH Ok(self.inner.read().metadata.clone()) 24952da9a59SGnoCiYeH } 25052da9a59SGnoCiYeH 25152da9a59SGnoCiYeH fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> { 25252da9a59SGnoCiYeH Ok(()) 25352da9a59SGnoCiYeH } 25452da9a59SGnoCiYeH 25552da9a59SGnoCiYeH fn resize(&self, _len: usize) -> Result<(), SystemError> { 25652da9a59SGnoCiYeH Ok(()) 25752da9a59SGnoCiYeH } 25852da9a59SGnoCiYeH 25952da9a59SGnoCiYeH fn ioctl(&self, cmd: u32, arg: usize, data: &FilePrivateData) -> Result<usize, SystemError> { 26052da9a59SGnoCiYeH let (tty, _) = if let FilePrivateData::Tty(tty_priv) = data { 26152da9a59SGnoCiYeH (tty_priv.tty.clone(), tty_priv.mode) 26252da9a59SGnoCiYeH } else { 26352da9a59SGnoCiYeH return Err(SystemError::EIO); 26452da9a59SGnoCiYeH }; 26552da9a59SGnoCiYeH 26652da9a59SGnoCiYeH match cmd { 26752da9a59SGnoCiYeH TtyIoctlCmd::TIOCSETD 26852da9a59SGnoCiYeH | TtyIoctlCmd::TIOCSBRK 26952da9a59SGnoCiYeH | TtyIoctlCmd::TIOCCBRK 27052da9a59SGnoCiYeH | TtyIoctlCmd::TCSBRK 27152da9a59SGnoCiYeH | TtyIoctlCmd::TCSBRKP => { 27252da9a59SGnoCiYeH TtyJobCtrlManager::tty_check_change(tty.clone(), Signal::SIGTTOU)?; 27352da9a59SGnoCiYeH if cmd != TtyIoctlCmd::TIOCCBRK { 27452da9a59SGnoCiYeH todo!() 27552da9a59SGnoCiYeH } 27652da9a59SGnoCiYeH } 27752bcb59eSGnoCiYeH EventPoll::ADD_EPOLLITEM => { 27852bcb59eSGnoCiYeH let _ = UserBufferReader::new( 27952bcb59eSGnoCiYeH arg as *const Arc<EPollItem>, 28052bcb59eSGnoCiYeH core::mem::size_of::<Arc<EPollItem>>(), 28152bcb59eSGnoCiYeH false, 28252bcb59eSGnoCiYeH )?; 28352bcb59eSGnoCiYeH let epitem = unsafe { &*(arg as *const Arc<EPollItem>) }; 28452bcb59eSGnoCiYeH 28552bcb59eSGnoCiYeH let core = tty.core(); 28652bcb59eSGnoCiYeH 28752bcb59eSGnoCiYeH core.add_epitem(epitem.clone()); 28852bcb59eSGnoCiYeH 28952bcb59eSGnoCiYeH return Ok(0); 29052bcb59eSGnoCiYeH } 29152da9a59SGnoCiYeH _ => {} 29252da9a59SGnoCiYeH } 29352da9a59SGnoCiYeH 29452da9a59SGnoCiYeH match cmd { 29552da9a59SGnoCiYeH TtyIoctlCmd::TIOCGWINSZ => { 29652da9a59SGnoCiYeH let core = tty.core(); 29752da9a59SGnoCiYeH let winsize = *core.window_size(); 29852da9a59SGnoCiYeH 29952da9a59SGnoCiYeH let mut user_writer = UserBufferWriter::new( 30052da9a59SGnoCiYeH VirtAddr::new(arg).as_ptr::<WindowSize>(), 30152da9a59SGnoCiYeH core::mem::size_of::<WindowSize>(), 30252da9a59SGnoCiYeH true, 30352da9a59SGnoCiYeH )?; 30452da9a59SGnoCiYeH 30552da9a59SGnoCiYeH let err = user_writer.copy_one_to_user(&winsize, 0); 30652da9a59SGnoCiYeH if err.is_err() { 30752da9a59SGnoCiYeH return Err(SystemError::EFAULT); 30852da9a59SGnoCiYeH } 30952da9a59SGnoCiYeH return Ok(0); 31052da9a59SGnoCiYeH } 31152da9a59SGnoCiYeH _ => match TtyJobCtrlManager::job_ctrl_ioctl(tty.clone(), cmd, arg) { 31252da9a59SGnoCiYeH Ok(_) => { 31352da9a59SGnoCiYeH return Ok(0); 31452da9a59SGnoCiYeH } 31552da9a59SGnoCiYeH Err(e) => { 31652da9a59SGnoCiYeH if e != SystemError::ENOIOCTLCMD { 31752da9a59SGnoCiYeH return Err(e); 31852da9a59SGnoCiYeH } 31952da9a59SGnoCiYeH } 32052da9a59SGnoCiYeH }, 32152da9a59SGnoCiYeH } 32252da9a59SGnoCiYeH 32352da9a59SGnoCiYeH match tty.ioctl(tty.clone(), cmd, arg) { 32452da9a59SGnoCiYeH Ok(_) => { 32552da9a59SGnoCiYeH return Ok(0); 32652da9a59SGnoCiYeH } 32752da9a59SGnoCiYeH Err(e) => { 32852da9a59SGnoCiYeH if e != SystemError::ENOIOCTLCMD { 32952da9a59SGnoCiYeH return Err(e); 33052da9a59SGnoCiYeH } 33152da9a59SGnoCiYeH } 33252da9a59SGnoCiYeH } 33352da9a59SGnoCiYeH tty.ldisc().ioctl(tty, cmd, arg)?; 33452da9a59SGnoCiYeH 33552da9a59SGnoCiYeH Ok(0) 33620e3152eSlogin } 33752bcb59eSGnoCiYeH 33852bcb59eSGnoCiYeH fn poll(&self, private_data: &FilePrivateData) -> Result<usize, SystemError> { 33952bcb59eSGnoCiYeH let (tty, _) = if let FilePrivateData::Tty(tty_priv) = private_data { 34052bcb59eSGnoCiYeH (tty_priv.tty.clone(), tty_priv.mode) 34152bcb59eSGnoCiYeH } else { 34252bcb59eSGnoCiYeH return Err(SystemError::EIO); 34352bcb59eSGnoCiYeH }; 34452bcb59eSGnoCiYeH 34552bcb59eSGnoCiYeH tty.ldisc().poll(tty) 34652bcb59eSGnoCiYeH } 3470d48c3c9Slogin } 3480d48c3c9Slogin 3490d48c3c9Slogin impl DeviceINode for TtyDevice { 3500d48c3c9Slogin fn set_fs(&self, fs: alloc::sync::Weak<crate::filesystem::devfs::DevFS>) { 3510d48c3c9Slogin *self.fs.write() = fs; 3520d48c3c9Slogin } 3530d48c3c9Slogin } 3540d48c3c9Slogin 35552da9a59SGnoCiYeH impl KObject for TtyDevice { 3560d48c3c9Slogin fn as_any_ref(&self) -> &dyn core::any::Any { 3570d48c3c9Slogin self 3580d48c3c9Slogin } 3590d48c3c9Slogin 36052da9a59SGnoCiYeH fn set_inode(&self, inode: Option<Arc<crate::filesystem::kernfs::KernFSInode>>) { 36152da9a59SGnoCiYeH self.inner.write().inode = inode; 3620d48c3c9Slogin } 36320e3152eSlogin 36452da9a59SGnoCiYeH fn inode(&self) -> Option<Arc<crate::filesystem::kernfs::KernFSInode>> { 36552da9a59SGnoCiYeH self.inner.read().inode.clone() 36620e3152eSlogin } 36720e3152eSlogin 36852da9a59SGnoCiYeH fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> { 36952da9a59SGnoCiYeH self.inner.read().parent_kobj.clone() 37052da9a59SGnoCiYeH } 37152da9a59SGnoCiYeH 37252da9a59SGnoCiYeH fn set_parent(&self, parent: Option<alloc::sync::Weak<dyn KObject>>) { 37352da9a59SGnoCiYeH self.inner.write().parent_kobj = parent 37452da9a59SGnoCiYeH } 37552da9a59SGnoCiYeH 37652da9a59SGnoCiYeH fn kset(&self) -> Option<Arc<crate::driver::base::kset::KSet>> { 37752da9a59SGnoCiYeH self.inner.read().kset.clone() 37852da9a59SGnoCiYeH } 37952da9a59SGnoCiYeH 38052da9a59SGnoCiYeH fn set_kset(&self, kset: Option<Arc<crate::driver::base::kset::KSet>>) { 38152da9a59SGnoCiYeH self.inner.write().kset = kset 38252da9a59SGnoCiYeH } 38352da9a59SGnoCiYeH 38452da9a59SGnoCiYeH fn kobj_type(&self) -> Option<&'static dyn crate::driver::base::kobject::KObjType> { 38552da9a59SGnoCiYeH Some(&DeviceKObjType) 38652da9a59SGnoCiYeH } 38752da9a59SGnoCiYeH 38852da9a59SGnoCiYeH fn set_kobj_type(&self, _ktype: Option<&'static dyn crate::driver::base::kobject::KObjType>) {} 38952da9a59SGnoCiYeH 39052da9a59SGnoCiYeH fn name(&self) -> alloc::string::String { 39152da9a59SGnoCiYeH self.name.to_string() 39252da9a59SGnoCiYeH } 39352da9a59SGnoCiYeH 39452da9a59SGnoCiYeH fn set_name(&self, _name: alloc::string::String) { 39552da9a59SGnoCiYeH // self.name = name 39652da9a59SGnoCiYeH } 39752da9a59SGnoCiYeH 39852da9a59SGnoCiYeH fn kobj_state( 39952da9a59SGnoCiYeH &self, 40052da9a59SGnoCiYeH ) -> crate::libs::rwlock::RwLockReadGuard<crate::driver::base::kobject::KObjectState> { 40152da9a59SGnoCiYeH self.kobj_state.read() 40252da9a59SGnoCiYeH } 40352da9a59SGnoCiYeH 40452da9a59SGnoCiYeH fn kobj_state_mut( 40552da9a59SGnoCiYeH &self, 40652da9a59SGnoCiYeH ) -> crate::libs::rwlock::RwLockWriteGuard<crate::driver::base::kobject::KObjectState> { 40752da9a59SGnoCiYeH self.kobj_state.write() 40852da9a59SGnoCiYeH } 40952da9a59SGnoCiYeH 41052da9a59SGnoCiYeH fn set_kobj_state(&self, state: crate::driver::base::kobject::KObjectState) { 41152da9a59SGnoCiYeH *self.kobj_state.write() = state 41252da9a59SGnoCiYeH } 41352da9a59SGnoCiYeH } 41452da9a59SGnoCiYeH 41552da9a59SGnoCiYeH impl Device for TtyDevice { 41652da9a59SGnoCiYeH fn dev_type(&self) -> crate::driver::base::device::DeviceType { 41752da9a59SGnoCiYeH DeviceType::Char 41852da9a59SGnoCiYeH } 41952da9a59SGnoCiYeH 42052da9a59SGnoCiYeH fn id_table(&self) -> crate::driver::base::device::IdTable { 42152da9a59SGnoCiYeH self.id_table.clone() 42252da9a59SGnoCiYeH } 42352da9a59SGnoCiYeH 42452da9a59SGnoCiYeH fn set_bus(&self, bus: Option<alloc::sync::Weak<dyn crate::driver::base::device::bus::Bus>>) { 42552da9a59SGnoCiYeH self.inner.write().bus = bus 42652da9a59SGnoCiYeH } 42752da9a59SGnoCiYeH 428*4256da7fSLoGin fn set_class(&self, _class: Option<Weak<dyn crate::driver::base::class::Class>>) { 42952da9a59SGnoCiYeH todo!() 43052da9a59SGnoCiYeH } 43152da9a59SGnoCiYeH 43252da9a59SGnoCiYeH fn driver(&self) -> Option<Arc<dyn crate::driver::base::device::driver::Driver>> { 43352da9a59SGnoCiYeH self.inner.read().driver.clone()?.upgrade() 43452da9a59SGnoCiYeH } 43552da9a59SGnoCiYeH 43652da9a59SGnoCiYeH fn set_driver( 43752da9a59SGnoCiYeH &self, 43852da9a59SGnoCiYeH driver: Option<alloc::sync::Weak<dyn crate::driver::base::device::driver::Driver>>, 43952da9a59SGnoCiYeH ) { 44052da9a59SGnoCiYeH self.inner.write().driver = driver 44152da9a59SGnoCiYeH } 44252da9a59SGnoCiYeH 44352da9a59SGnoCiYeH fn is_dead(&self) -> bool { 44452da9a59SGnoCiYeH false 44552da9a59SGnoCiYeH } 44652da9a59SGnoCiYeH 44752da9a59SGnoCiYeH fn can_match(&self) -> bool { 44852da9a59SGnoCiYeH self.inner.read().can_match 44952da9a59SGnoCiYeH } 45052da9a59SGnoCiYeH 45152da9a59SGnoCiYeH fn set_can_match(&self, can_match: bool) { 45252da9a59SGnoCiYeH self.inner.write().can_match = can_match 45352da9a59SGnoCiYeH } 45452da9a59SGnoCiYeH 45552da9a59SGnoCiYeH fn state_synced(&self) -> bool { 45652da9a59SGnoCiYeH true 45752da9a59SGnoCiYeH } 45852da9a59SGnoCiYeH } 45952da9a59SGnoCiYeH 46052da9a59SGnoCiYeH impl CharDevice for TtyDevice { 46152da9a59SGnoCiYeH fn read(&self, _len: usize, _buf: &mut [u8]) -> Result<usize, SystemError> { 46252da9a59SGnoCiYeH todo!() 46352da9a59SGnoCiYeH } 46452da9a59SGnoCiYeH 46552da9a59SGnoCiYeH fn write(&self, _len: usize, _buf: &[u8]) -> Result<usize, SystemError> { 46652da9a59SGnoCiYeH todo!() 46720e3152eSlogin } 46820e3152eSlogin 46920e3152eSlogin fn sync(&self) -> Result<(), SystemError> { 47052da9a59SGnoCiYeH todo!() 47111110997Shanjiezhou } 47220e3152eSlogin } 47320e3152eSlogin 47452da9a59SGnoCiYeH #[derive(Debug, Clone)] 47552da9a59SGnoCiYeH pub struct TtyFilePrivateData { 47652da9a59SGnoCiYeH tty: Arc<TtyCore>, 47752da9a59SGnoCiYeH mode: FileMode, 47820e3152eSlogin } 47920e3152eSlogin 48052da9a59SGnoCiYeH /// 初始化tty设备和console子设备 481c566df45SLoGin #[unified_init(INITCALL_DEVICE)] 48252da9a59SGnoCiYeH #[inline(never)] 48320e3152eSlogin pub fn tty_init() -> Result<(), SystemError> { 48452da9a59SGnoCiYeH let tty = TtyDevice::new( 48552da9a59SGnoCiYeH "tty0", 48652da9a59SGnoCiYeH IdTable::new( 48752da9a59SGnoCiYeH String::from("tty0"), 48852da9a59SGnoCiYeH Some(DeviceNumber::new(Major::TTY_MAJOR, 0)), 48952da9a59SGnoCiYeH ), 49052da9a59SGnoCiYeH ); 49120e3152eSlogin 49252da9a59SGnoCiYeH let console = TtyDevice::new( 49352da9a59SGnoCiYeH "console", 49452da9a59SGnoCiYeH IdTable::new( 49552da9a59SGnoCiYeH String::from("console"), 49652da9a59SGnoCiYeH Some(DeviceNumber::new(Major::TTYAUX_MAJOR, 1)), 49752da9a59SGnoCiYeH ), 49852da9a59SGnoCiYeH ); 49920e3152eSlogin 50052da9a59SGnoCiYeH // 注册tty设备 50152da9a59SGnoCiYeH // CharDevOps::cdev_add( 50252da9a59SGnoCiYeH // tty.clone() as Arc<dyn CharDevice>, 50352da9a59SGnoCiYeH // IdTable::new( 50452da9a59SGnoCiYeH // String::from("tty0"), 50552da9a59SGnoCiYeH // Some(DeviceNumber::new(Major::TTYAUX_MAJOR, 0)), 50652da9a59SGnoCiYeH // ), 50752da9a59SGnoCiYeH // 1, 50852da9a59SGnoCiYeH // )?; 50920e3152eSlogin 51052da9a59SGnoCiYeH // CharDevOps::register_chardev_region(DeviceNumber::new(Major::TTYAUX_MAJOR, 0), 1, "/dev/tty")?; 51120e3152eSlogin 51252da9a59SGnoCiYeH // 注册console设备 51352da9a59SGnoCiYeH // CharDevOps::cdev_add( 51452da9a59SGnoCiYeH // console.clone() as Arc<dyn CharDevice>, 51552da9a59SGnoCiYeH // IdTable::new( 51652da9a59SGnoCiYeH // String::from("console"), 51752da9a59SGnoCiYeH // Some(DeviceNumber::new(Major::TTYAUX_MAJOR, 1)), 51852da9a59SGnoCiYeH // ), 51952da9a59SGnoCiYeH // 1, 52052da9a59SGnoCiYeH // )?; 52120e3152eSlogin 52252da9a59SGnoCiYeH // CharDevOps::register_chardev_region(DeviceNumber::new(Major::TTYAUX_MAJOR, 1), 1, "/dev/tty")?; 52352da9a59SGnoCiYeH 52452da9a59SGnoCiYeH // 将这两个设备注册到devfs,TODO:这里console设备应该与tty在一个设备group里面 52552da9a59SGnoCiYeH device_register(tty.clone())?; 52652da9a59SGnoCiYeH device_register(console.clone())?; 52752da9a59SGnoCiYeH devfs_register(tty.name, tty)?; 52852da9a59SGnoCiYeH devfs_register(console.name, console)?; 52920e3152eSlogin 530a03c4f9dSLoGin serial_init()?; 53159fdb447SLoGin 53259fdb447SLoGin tty_flush_thread_init(); 53352da9a59SGnoCiYeH return vty_init(); 5340d48c3c9Slogin } 535