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