xref: /DragonOS/kernel/src/driver/keyboard/ps2_keyboard.rs (revision 676b8ef62e1a0a1e52d65b40c53c1636a2954040)
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