1 use core::sync::atomic::AtomicI32; 2 3 use alloc::sync::{Arc, Weak}; 4 5 use crate::{ 6 filesystem::{ 7 devfs::{devfs_register, DevFS, DeviceINode}, 8 vfs::{core::generate_inode_id, file::FileMode, FileType, IndexNode, Metadata, PollStatus}, 9 }, 10 include::bindings::bindings::{vfs_file_operations_t, vfs_file_t, vfs_index_node_t, ENOTSUP}, 11 libs::rwlock::RwLock, 12 time::TimeSpec, 13 }; 14 15 #[derive(Debug)] 16 pub struct LockedPS2KeyBoardInode(RwLock<PS2KeyBoardInode>, AtomicI32); // self.1 用来记录有多少个文件打开了这个inode 17 18 #[derive(Debug)] 19 pub struct PS2KeyBoardInode { 20 /// uuid 暂时不知道有什么用(x 21 // uuid: Uuid, 22 /// 指向自身的弱引用 23 self_ref: Weak<LockedPS2KeyBoardInode>, 24 /// 指向inode所在的文件系统对象的指针 25 fs: Weak<DevFS>, 26 /// INode 元数据 27 metadata: Metadata, 28 /// 键盘操作函数 29 f_ops: vfs_file_operations_t, 30 } 31 32 impl LockedPS2KeyBoardInode { 33 pub fn new(f_ops: &vfs_file_operations_t) -> Arc<Self> { 34 let inode = PS2KeyBoardInode { 35 // uuid: Uuid::new_v5(), 36 self_ref: Weak::default(), 37 fs: Weak::default(), 38 f_ops: f_ops.clone(), // 从引用复制一遍获取所有权 39 metadata: Metadata { 40 dev_id: 1, 41 inode_id: generate_inode_id(), 42 size: 0, 43 blk_size: 0, 44 blocks: 0, 45 atime: TimeSpec::default(), 46 mtime: TimeSpec::default(), 47 ctime: TimeSpec::default(), 48 file_type: FileType::CharDevice, // 文件夹,block设备,char设备 49 mode: 0o666, 50 nlinks: 1, 51 uid: 0, 52 gid: 0, 53 raw_dev: 0, // 这里用来作为device number 54 }, 55 }; 56 57 let result = Arc::new(LockedPS2KeyBoardInode( 58 RwLock::new(inode), 59 AtomicI32::new(0), 60 )); 61 result.0.write().self_ref = Arc::downgrade(&result); 62 63 return result; 64 } 65 } 66 67 impl DeviceINode for LockedPS2KeyBoardInode { 68 fn set_fs(&self, fs: Weak<DevFS>) { 69 self.0.write().fs = fs; 70 } 71 } 72 73 #[no_mangle] // 不重命名 74 pub extern "C" fn ps2_keyboard_register(f_ops: &vfs_file_operations_t) { 75 devfs_register("ps2_keyboard", LockedPS2KeyBoardInode::new(f_ops)) 76 .expect("Failed to register ps/2 keyboard"); 77 } 78 79 impl IndexNode for LockedPS2KeyBoardInode { 80 fn read_at( 81 &self, 82 _offset: usize, 83 len: usize, 84 buf: &mut [u8], 85 _data: &mut crate::filesystem::vfs::FilePrivateData, 86 ) -> Result<usize, i32> { 87 let guard = self.0.read(); 88 let func = guard.f_ops.read.unwrap(); 89 let r = unsafe { 90 func( 91 0 as *mut vfs_file_t, 92 &mut buf[0..len] as *mut [u8] as *mut i8, 93 len as i64, 94 0 as *mut i64, 95 ) 96 }; 97 return Ok(r as usize); 98 } 99 100 fn write_at( 101 &self, 102 _offset: usize, 103 _len: usize, 104 _buf: &[u8], 105 _data: &mut crate::filesystem::vfs::FilePrivateData, 106 ) -> Result<usize, i32> { 107 return Err(-(ENOTSUP as i32)); 108 } 109 110 fn open( 111 &self, 112 _data: &mut crate::filesystem::vfs::FilePrivateData, 113 _mode: &FileMode, 114 ) -> Result<(), i32> { 115 let prev_ref_count = self.1.fetch_add(1, core::sync::atomic::Ordering::SeqCst); 116 if prev_ref_count == 0 { 117 // 第一次打开,需要初始化 118 let guard = self.0.write(); 119 let func = guard.f_ops.open.unwrap(); 120 let _ = unsafe { func(0 as *mut vfs_index_node_t, 0 as *mut vfs_file_t) }; 121 } 122 return Ok(()); 123 } 124 125 fn close(&self, _data: &mut crate::filesystem::vfs::FilePrivateData) -> Result<(), i32> { 126 let prev_ref_count = self.1.fetch_sub(1, core::sync::atomic::Ordering::SeqCst); 127 if prev_ref_count == 1 { 128 // 最后一次关闭,需要释放 129 let guard = self.0.write(); 130 let func = guard.f_ops.close.unwrap(); 131 let _ = unsafe { func(0 as *mut vfs_index_node_t, 0 as *mut vfs_file_t) }; 132 } 133 return Ok(()); 134 } 135 136 fn poll(&self) -> Result<PollStatus, i32> { 137 return Ok(PollStatus { 138 flags: PollStatus::READ_MASK, 139 }); 140 } 141 142 fn metadata(&self) -> Result<Metadata, i32> { 143 return Ok(self.0.read().metadata.clone()); 144 } 145 146 fn set_metadata(&self, metadata: &Metadata) -> Result<(), i32> { 147 let mut inode = self.0.write(); 148 inode.metadata.atime = metadata.atime; 149 inode.metadata.mtime = metadata.mtime; 150 inode.metadata.ctime = metadata.ctime; 151 inode.metadata.mode = metadata.mode; 152 inode.metadata.uid = metadata.uid; 153 inode.metadata.gid = metadata.gid; 154 155 return Ok(()); 156 } 157 158 fn fs(&self) -> alloc::sync::Arc<dyn crate::filesystem::vfs::FileSystem> { 159 return self.0.read().fs.upgrade().unwrap(); 160 } 161 162 fn as_any_ref(&self) -> &dyn core::any::Any { 163 self 164 } 165 166 fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, i32> { 167 return Err(-(ENOTSUP as i32)); 168 } 169 } 170