164aea4b3SGou Ngai use core::sync::atomic::AtomicI32; 264aea4b3SGou Ngai 3004e86ffSlogin use alloc::sync::{Arc, Weak}; 4004e86ffSlogin 5004e86ffSlogin use crate::{ 6004e86ffSlogin filesystem::{ 7004e86ffSlogin devfs::{devfs_register, DevFS, DeviceINode}, 80d48c3c9Slogin vfs::{core::generate_inode_id, file::FileMode, FileType, IndexNode, Metadata, PollStatus}, 9004e86ffSlogin }, 10*676b8ef6SMork include::bindings::bindings::{vfs_file_operations_t, vfs_file_t, vfs_index_node_t}, 1164aea4b3SGou Ngai libs::rwlock::RwLock, 12*676b8ef6SMork time::TimeSpec, syscall::SystemError, 13004e86ffSlogin }; 14004e86ffSlogin 15004e86ffSlogin #[derive(Debug)] 1664aea4b3SGou Ngai pub struct LockedPS2KeyBoardInode(RwLock<PS2KeyBoardInode>, AtomicI32); // self.1 用来记录有多少个文件打开了这个inode 17004e86ffSlogin 18004e86ffSlogin #[derive(Debug)] 19004e86ffSlogin pub struct PS2KeyBoardInode { 20004e86ffSlogin /// uuid 暂时不知道有什么用(x 21004e86ffSlogin // uuid: Uuid, 22004e86ffSlogin /// 指向自身的弱引用 23004e86ffSlogin self_ref: Weak<LockedPS2KeyBoardInode>, 24004e86ffSlogin /// 指向inode所在的文件系统对象的指针 25004e86ffSlogin fs: Weak<DevFS>, 26004e86ffSlogin /// INode 元数据 27004e86ffSlogin metadata: Metadata, 28004e86ffSlogin /// 键盘操作函数 29004e86ffSlogin f_ops: vfs_file_operations_t, 30004e86ffSlogin } 31004e86ffSlogin 32004e86ffSlogin impl LockedPS2KeyBoardInode { 33004e86ffSlogin pub fn new(f_ops: &vfs_file_operations_t) -> Arc<Self> { 34004e86ffSlogin let inode = PS2KeyBoardInode { 35004e86ffSlogin // uuid: Uuid::new_v5(), 36004e86ffSlogin self_ref: Weak::default(), 37004e86ffSlogin fs: Weak::default(), 38004e86ffSlogin f_ops: f_ops.clone(), // 从引用复制一遍获取所有权 39004e86ffSlogin metadata: Metadata { 40004e86ffSlogin dev_id: 1, 41004e86ffSlogin inode_id: generate_inode_id(), 42004e86ffSlogin size: 0, 43004e86ffSlogin blk_size: 0, 44004e86ffSlogin blocks: 0, 45004e86ffSlogin atime: TimeSpec::default(), 46004e86ffSlogin mtime: TimeSpec::default(), 47004e86ffSlogin ctime: TimeSpec::default(), 48004e86ffSlogin file_type: FileType::CharDevice, // 文件夹,block设备,char设备 49004e86ffSlogin mode: 0o666, 50004e86ffSlogin nlinks: 1, 51004e86ffSlogin uid: 0, 52004e86ffSlogin gid: 0, 53004e86ffSlogin raw_dev: 0, // 这里用来作为device number 54004e86ffSlogin }, 55004e86ffSlogin }; 56004e86ffSlogin 5764aea4b3SGou Ngai let result = Arc::new(LockedPS2KeyBoardInode( 5864aea4b3SGou Ngai RwLock::new(inode), 5964aea4b3SGou Ngai AtomicI32::new(0), 6064aea4b3SGou Ngai )); 6164aea4b3SGou Ngai result.0.write().self_ref = Arc::downgrade(&result); 62004e86ffSlogin 63004e86ffSlogin return result; 64004e86ffSlogin } 65004e86ffSlogin } 66004e86ffSlogin 67004e86ffSlogin impl DeviceINode for LockedPS2KeyBoardInode { 68004e86ffSlogin fn set_fs(&self, fs: Weak<DevFS>) { 6964aea4b3SGou Ngai self.0.write().fs = fs; 70004e86ffSlogin } 71004e86ffSlogin } 72004e86ffSlogin 73004e86ffSlogin #[no_mangle] // 不重命名 74004e86ffSlogin pub extern "C" fn ps2_keyboard_register(f_ops: &vfs_file_operations_t) { 75004e86ffSlogin devfs_register("ps2_keyboard", LockedPS2KeyBoardInode::new(f_ops)) 76004e86ffSlogin .expect("Failed to register ps/2 keyboard"); 77004e86ffSlogin } 78004e86ffSlogin 79004e86ffSlogin impl IndexNode for LockedPS2KeyBoardInode { 80004e86ffSlogin fn read_at( 81004e86ffSlogin &self, 82004e86ffSlogin _offset: usize, 83004e86ffSlogin len: usize, 84004e86ffSlogin buf: &mut [u8], 85004e86ffSlogin _data: &mut crate::filesystem::vfs::FilePrivateData, 86*676b8ef6SMork ) -> Result<usize, SystemError> { 8764aea4b3SGou Ngai let guard = self.0.read(); 88004e86ffSlogin let func = guard.f_ops.read.unwrap(); 89004e86ffSlogin let r = unsafe { 90004e86ffSlogin func( 91004e86ffSlogin 0 as *mut vfs_file_t, 92004e86ffSlogin &mut buf[0..len] as *mut [u8] as *mut i8, 93004e86ffSlogin len as i64, 94004e86ffSlogin 0 as *mut i64, 95004e86ffSlogin ) 96004e86ffSlogin }; 97004e86ffSlogin return Ok(r as usize); 98004e86ffSlogin } 99004e86ffSlogin 100004e86ffSlogin fn write_at( 101004e86ffSlogin &self, 102004e86ffSlogin _offset: usize, 103004e86ffSlogin _len: usize, 104004e86ffSlogin _buf: &[u8], 105004e86ffSlogin _data: &mut crate::filesystem::vfs::FilePrivateData, 106*676b8ef6SMork ) -> Result<usize, SystemError> { 107*676b8ef6SMork return Err(SystemError::ENOTSUP); 108004e86ffSlogin } 109004e86ffSlogin 1100d48c3c9Slogin fn open( 1110d48c3c9Slogin &self, 1120d48c3c9Slogin _data: &mut crate::filesystem::vfs::FilePrivateData, 1130d48c3c9Slogin _mode: &FileMode, 114*676b8ef6SMork ) -> Result<(), SystemError> { 11564aea4b3SGou Ngai let prev_ref_count = self.1.fetch_add(1, core::sync::atomic::Ordering::SeqCst); 11664aea4b3SGou Ngai if prev_ref_count == 0 { 11764aea4b3SGou Ngai // 第一次打开,需要初始化 11864aea4b3SGou Ngai let guard = self.0.write(); 119004e86ffSlogin let func = guard.f_ops.open.unwrap(); 120004e86ffSlogin let _ = unsafe { func(0 as *mut vfs_index_node_t, 0 as *mut vfs_file_t) }; 12164aea4b3SGou Ngai } 122004e86ffSlogin return Ok(()); 123004e86ffSlogin } 124004e86ffSlogin 125*676b8ef6SMork fn close(&self, _data: &mut crate::filesystem::vfs::FilePrivateData) -> Result<(), SystemError> { 12664aea4b3SGou Ngai let prev_ref_count = self.1.fetch_sub(1, core::sync::atomic::Ordering::SeqCst); 12764aea4b3SGou Ngai if prev_ref_count == 1 { 12864aea4b3SGou Ngai // 最后一次关闭,需要释放 12964aea4b3SGou Ngai let guard = self.0.write(); 130004e86ffSlogin let func = guard.f_ops.close.unwrap(); 131004e86ffSlogin let _ = unsafe { func(0 as *mut vfs_index_node_t, 0 as *mut vfs_file_t) }; 13264aea4b3SGou Ngai } 133004e86ffSlogin return Ok(()); 134004e86ffSlogin } 135004e86ffSlogin 136*676b8ef6SMork fn poll(&self) -> Result<PollStatus, SystemError> { 137004e86ffSlogin return Ok(PollStatus { 138004e86ffSlogin flags: PollStatus::READ_MASK, 139004e86ffSlogin }); 140004e86ffSlogin } 141004e86ffSlogin 142*676b8ef6SMork fn metadata(&self) -> Result<Metadata, SystemError> { 14364aea4b3SGou Ngai return Ok(self.0.read().metadata.clone()); 144004e86ffSlogin } 145004e86ffSlogin 146*676b8ef6SMork fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError> { 14764aea4b3SGou Ngai let mut inode = self.0.write(); 148004e86ffSlogin inode.metadata.atime = metadata.atime; 149004e86ffSlogin inode.metadata.mtime = metadata.mtime; 150004e86ffSlogin inode.metadata.ctime = metadata.ctime; 151004e86ffSlogin inode.metadata.mode = metadata.mode; 152004e86ffSlogin inode.metadata.uid = metadata.uid; 153004e86ffSlogin inode.metadata.gid = metadata.gid; 154004e86ffSlogin 155004e86ffSlogin return Ok(()); 156004e86ffSlogin } 157004e86ffSlogin 158004e86ffSlogin fn fs(&self) -> alloc::sync::Arc<dyn crate::filesystem::vfs::FileSystem> { 15964aea4b3SGou Ngai return self.0.read().fs.upgrade().unwrap(); 160004e86ffSlogin } 161004e86ffSlogin 162004e86ffSlogin fn as_any_ref(&self) -> &dyn core::any::Any { 163004e86ffSlogin self 164004e86ffSlogin } 165004e86ffSlogin 166*676b8ef6SMork fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, SystemError> { 167*676b8ef6SMork return Err(SystemError::ENOTSUP); 168004e86ffSlogin } 169004e86ffSlogin } 170