152da9a59SGnoCiYeH use core::fmt::Debug; 252da9a59SGnoCiYeH 352da9a59SGnoCiYeH use alloc::sync::Arc; 452da9a59SGnoCiYeH use system_error::SystemError; 552da9a59SGnoCiYeH 652da9a59SGnoCiYeH use crate::filesystem::vfs::file::FileMode; 752da9a59SGnoCiYeH 852da9a59SGnoCiYeH use super::{ 952da9a59SGnoCiYeH termios::Termios, 1052da9a59SGnoCiYeH tty_core::{TtyCore, TtyCoreData}, 1152da9a59SGnoCiYeH }; 1252da9a59SGnoCiYeH 1352da9a59SGnoCiYeH pub mod ntty; 1452da9a59SGnoCiYeH 1552da9a59SGnoCiYeH pub trait TtyLineDiscipline: Sync + Send + Debug { 1652da9a59SGnoCiYeH fn open(&self, tty: Arc<TtyCore>) -> Result<(), SystemError>; 1752da9a59SGnoCiYeH fn close(&self, tty: Arc<TtyCore>) -> Result<(), SystemError>; 1852da9a59SGnoCiYeH fn flush_buffer(&self, tty: Arc<TtyCore>) -> Result<(), SystemError>; 1952da9a59SGnoCiYeH 2052da9a59SGnoCiYeH /// ## tty行规程循环读取函数 2152da9a59SGnoCiYeH /// 2252da9a59SGnoCiYeH /// ### 参数 2352da9a59SGnoCiYeH /// - tty: 操作的tty 2452da9a59SGnoCiYeH /// - buf: 数据将被读取到buf 2552da9a59SGnoCiYeH /// - len: 读取的字节长度 2652da9a59SGnoCiYeH /// - cookie: 表示是否是继续上次的读,第一次读取应该传入false 2752da9a59SGnoCiYeH /// - offset: 读取的偏移量 2852da9a59SGnoCiYeH fn read( 2952da9a59SGnoCiYeH &self, 3052da9a59SGnoCiYeH tty: Arc<TtyCore>, 3152da9a59SGnoCiYeH buf: &mut [u8], 3252da9a59SGnoCiYeH len: usize, 3352da9a59SGnoCiYeH cookie: &mut bool, 3452da9a59SGnoCiYeH offset: usize, 3552da9a59SGnoCiYeH mode: FileMode, 3652da9a59SGnoCiYeH ) -> Result<usize, SystemError>; 3752da9a59SGnoCiYeH fn write( 3852da9a59SGnoCiYeH &self, 3952da9a59SGnoCiYeH tty: Arc<TtyCore>, 4052da9a59SGnoCiYeH buf: &[u8], 4152da9a59SGnoCiYeH len: usize, 4252da9a59SGnoCiYeH mode: FileMode, 4352da9a59SGnoCiYeH ) -> Result<usize, SystemError>; 4452da9a59SGnoCiYeH fn ioctl(&self, tty: Arc<TtyCore>, cmd: u32, arg: usize) -> Result<usize, SystemError>; 4552da9a59SGnoCiYeH 4652da9a59SGnoCiYeH /// ### 设置termios后更新行规程状态 4752da9a59SGnoCiYeH /// 4852da9a59SGnoCiYeH /// - old: 之前的termios,如果为None则表示第一次设置 4952da9a59SGnoCiYeH fn set_termios(&self, tty: Arc<TtyCore>, old: Option<Termios>) -> Result<(), SystemError>; 5052da9a59SGnoCiYeH 51*52bcb59eSGnoCiYeH fn poll(&self, tty: Arc<TtyCore>) -> Result<usize, SystemError>; 5252da9a59SGnoCiYeH fn hangup(&self, tty: Arc<TtyCore>) -> Result<(), SystemError>; 5352da9a59SGnoCiYeH 5452da9a59SGnoCiYeH /// ## 接收数据 5552da9a59SGnoCiYeH fn receive_buf( 5652da9a59SGnoCiYeH &self, 5752da9a59SGnoCiYeH tty: Arc<TtyCore>, 5852da9a59SGnoCiYeH buf: &[u8], 5952da9a59SGnoCiYeH flags: Option<&[u8]>, 6052da9a59SGnoCiYeH count: usize, 6152da9a59SGnoCiYeH ) -> Result<usize, SystemError>; 6252da9a59SGnoCiYeH 6352da9a59SGnoCiYeH /// ## 接收数据 6452da9a59SGnoCiYeH fn receive_buf2( 6552da9a59SGnoCiYeH &self, 6652da9a59SGnoCiYeH tty: Arc<TtyCore>, 6752da9a59SGnoCiYeH buf: &[u8], 6852da9a59SGnoCiYeH flags: Option<&[u8]>, 6952da9a59SGnoCiYeH count: usize, 7052da9a59SGnoCiYeH ) -> Result<usize, SystemError>; 7152da9a59SGnoCiYeH 7252da9a59SGnoCiYeH /// ## 唤醒线路写者 7352da9a59SGnoCiYeH fn write_wakeup(&self, _tty: &TtyCoreData) -> Result<(), SystemError> { 7452da9a59SGnoCiYeH Err(SystemError::ENOSYS) 7552da9a59SGnoCiYeH } 7652da9a59SGnoCiYeH } 7752da9a59SGnoCiYeH 7852da9a59SGnoCiYeH #[derive(Debug, Clone, Copy)] 7952da9a59SGnoCiYeH pub enum LineDisciplineType { 8052da9a59SGnoCiYeH NTty = 0, 8152da9a59SGnoCiYeH } 8252da9a59SGnoCiYeH 8352da9a59SGnoCiYeH impl LineDisciplineType { 8452da9a59SGnoCiYeH pub fn from_line(line: u8) -> Self { 8552da9a59SGnoCiYeH match line { 8652da9a59SGnoCiYeH 0 => Self::NTty, 8752da9a59SGnoCiYeH _ => { 8852da9a59SGnoCiYeH todo!() 8952da9a59SGnoCiYeH } 9052da9a59SGnoCiYeH } 9152da9a59SGnoCiYeH } 9252da9a59SGnoCiYeH } 9352da9a59SGnoCiYeH 9452da9a59SGnoCiYeH pub struct TtyLdiscManager; 9552da9a59SGnoCiYeH 9652da9a59SGnoCiYeH impl TtyLdiscManager { 9752da9a59SGnoCiYeH /// ## 为tty初始化ldisc 9852da9a59SGnoCiYeH /// 9952da9a59SGnoCiYeH /// ### 参数 10052da9a59SGnoCiYeH /// - tty:需要设置的tty 10152da9a59SGnoCiYeH /// - o_tty: other tty 用于pty pair 10252da9a59SGnoCiYeH pub fn ldisc_setup(tty: Arc<TtyCore>, _o_tty: Option<Arc<TtyCore>>) -> Result<(), SystemError> { 10352da9a59SGnoCiYeH let ld = tty.ldisc(); 10452da9a59SGnoCiYeH 10552da9a59SGnoCiYeH let ret = ld.open(tty); 10652da9a59SGnoCiYeH if ret.is_err() { 10752da9a59SGnoCiYeH let err = ret.unwrap_err(); 10852da9a59SGnoCiYeH if err == SystemError::ENOSYS { 10952da9a59SGnoCiYeH return Err(err); 11052da9a59SGnoCiYeH } 11152da9a59SGnoCiYeH } 11252da9a59SGnoCiYeH 11352da9a59SGnoCiYeH // TODO: 处理PTY 11452da9a59SGnoCiYeH 11552da9a59SGnoCiYeH Ok(()) 11652da9a59SGnoCiYeH } 11752da9a59SGnoCiYeH } 118