xref: /DragonOS/kernel/src/driver/keyboard/ps2_keyboard.rs (revision 676b8ef62e1a0a1e52d65b40c53c1636a2954040)
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},
11     libs::rwlock::RwLock,
12     time::TimeSpec, syscall::SystemError,
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, SystemError> {
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, SystemError> {
107         return Err(SystemError::ENOTSUP);
108     }
109 
110     fn open(
111         &self,
112         _data: &mut crate::filesystem::vfs::FilePrivateData,
113         _mode: &FileMode,
114     ) -> Result<(), SystemError> {
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<(), SystemError> {
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, SystemError> {
137         return Ok(PollStatus {
138             flags: PollStatus::READ_MASK,
139         });
140     }
141 
142     fn metadata(&self) -> Result<Metadata, SystemError> {
143         return Ok(self.0.read().metadata.clone());
144     }
145 
146     fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError> {
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>, SystemError> {
167         return Err(SystemError::ENOTSUP);
168     }
169 }
170