xref: /DragonOS/kernel/src/driver/tty/tty_device.rs (revision 52da9a59374752b4d01907b052135a0d317781dd)
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