xref: /DragonOS/kernel/src/driver/keyboard/ps2_keyboard.rs (revision 52da9a59374752b4d01907b052135a0d317781dd)
146e234aeSLoGin use core::{ffi::c_void, sync::atomic::AtomicI32};
264aea4b3SGou Ngai 
3004e86ffSlogin use alloc::sync::{Arc, Weak};
4004e86ffSlogin 
5004e86ffSlogin use crate::{
6*52da9a59SGnoCiYeH     driver::base::device::device_number::{DeviceNumber, Major},
7004e86ffSlogin     filesystem::{
8004e86ffSlogin         devfs::{devfs_register, DevFS, DeviceINode},
96b4e7a29SLoGin         vfs::{
104ad52e57S裕依2439             core::generate_inode_id, file::FileMode, syscall::ModeType, FilePrivateData,
114ad52e57S裕依2439             FileSystem, FileType, IndexNode, Metadata,
126b4e7a29SLoGin         },
13004e86ffSlogin     },
1446e234aeSLoGin     include::bindings::bindings::vfs_file_operations_t,
155fb12ce4SGou Ngai     libs::{keyboard_parser::TypeOneFSM, rwlock::RwLock, spinlock::SpinLock},
165fb12ce4SGou Ngai     time::TimeSpec,
17004e86ffSlogin };
1891e9d4abSLoGin use system_error::SystemError;
19004e86ffSlogin #[derive(Debug)]
2064aea4b3SGou Ngai pub struct LockedPS2KeyBoardInode(RwLock<PS2KeyBoardInode>, AtomicI32); // self.1 用来记录有多少个文件打开了这个inode
21004e86ffSlogin 
225fb12ce4SGou Ngai lazy_static! {
23*52da9a59SGnoCiYeH     static ref PS2_KEYBOARD_FSM: SpinLock<TypeOneFSM> = SpinLock::new(TypeOneFSM::new());
245fb12ce4SGou Ngai }
255fb12ce4SGou Ngai 
26004e86ffSlogin #[derive(Debug)]
27004e86ffSlogin pub struct PS2KeyBoardInode {
28004e86ffSlogin     /// uuid 暂时不知道有什么用(x
29004e86ffSlogin     // uuid: Uuid,
30004e86ffSlogin     /// 指向自身的弱引用
31004e86ffSlogin     self_ref: Weak<LockedPS2KeyBoardInode>,
32004e86ffSlogin     /// 指向inode所在的文件系统对象的指针
33004e86ffSlogin     fs: Weak<DevFS>,
34004e86ffSlogin     /// INode 元数据
35004e86ffSlogin     metadata: Metadata,
36004e86ffSlogin     /// 键盘操作函数
37004e86ffSlogin     f_ops: vfs_file_operations_t,
38004e86ffSlogin }
39004e86ffSlogin 
40004e86ffSlogin impl LockedPS2KeyBoardInode {
41004e86ffSlogin     pub fn new(f_ops: &vfs_file_operations_t) -> Arc<Self> {
42004e86ffSlogin         let inode = PS2KeyBoardInode {
43004e86ffSlogin             // uuid: Uuid::new_v5(),
44004e86ffSlogin             self_ref: Weak::default(),
45004e86ffSlogin             fs: Weak::default(),
46004e86ffSlogin             f_ops: f_ops.clone(), // 从引用复制一遍获取所有权
47004e86ffSlogin             metadata: Metadata {
48004e86ffSlogin                 dev_id: 1,
49004e86ffSlogin                 inode_id: generate_inode_id(),
50004e86ffSlogin                 size: 0,
51004e86ffSlogin                 blk_size: 0,
52004e86ffSlogin                 blocks: 0,
53004e86ffSlogin                 atime: TimeSpec::default(),
54004e86ffSlogin                 mtime: TimeSpec::default(),
55004e86ffSlogin                 ctime: TimeSpec::default(),
56004e86ffSlogin                 file_type: FileType::CharDevice, // 文件夹,block设备,char设备
576b4e7a29SLoGin                 mode: ModeType::from_bits_truncate(0o666),
58004e86ffSlogin                 nlinks: 1,
59004e86ffSlogin                 uid: 0,
60004e86ffSlogin                 gid: 0,
6102343d0bSLoGin                 raw_dev: DeviceNumber::new(Major::INPUT_MAJOR, 0), // 这里用来作为device number
62004e86ffSlogin             },
63004e86ffSlogin         };
64004e86ffSlogin 
6564aea4b3SGou Ngai         let result = Arc::new(LockedPS2KeyBoardInode(
6664aea4b3SGou Ngai             RwLock::new(inode),
6764aea4b3SGou Ngai             AtomicI32::new(0),
6864aea4b3SGou Ngai         ));
6964aea4b3SGou Ngai         result.0.write().self_ref = Arc::downgrade(&result);
70004e86ffSlogin 
71004e86ffSlogin         return result;
72004e86ffSlogin     }
73004e86ffSlogin }
74004e86ffSlogin 
75004e86ffSlogin impl DeviceINode for LockedPS2KeyBoardInode {
76004e86ffSlogin     fn set_fs(&self, fs: Weak<DevFS>) {
7764aea4b3SGou Ngai         self.0.write().fs = fs;
78004e86ffSlogin     }
79004e86ffSlogin }
80004e86ffSlogin 
81004e86ffSlogin #[no_mangle] // 不重命名
82004e86ffSlogin pub extern "C" fn ps2_keyboard_register(f_ops: &vfs_file_operations_t) {
83004e86ffSlogin     devfs_register("ps2_keyboard", LockedPS2KeyBoardInode::new(f_ops))
84004e86ffSlogin         .expect("Failed to register ps/2 keyboard");
85004e86ffSlogin }
86004e86ffSlogin 
87004e86ffSlogin impl IndexNode for LockedPS2KeyBoardInode {
88004e86ffSlogin     fn read_at(
89004e86ffSlogin         &self,
90004e86ffSlogin         _offset: usize,
91004e86ffSlogin         len: usize,
92004e86ffSlogin         buf: &mut [u8],
934ad52e57S裕依2439         _data: &mut FilePrivateData,
94676b8ef6SMork     ) -> Result<usize, SystemError> {
9564aea4b3SGou Ngai         let guard = self.0.read();
96004e86ffSlogin         let func = guard.f_ops.read.unwrap();
97004e86ffSlogin         let r = unsafe {
98004e86ffSlogin             func(
9946e234aeSLoGin                 0 as *mut c_void,
100004e86ffSlogin                 &mut buf[0..len] as *mut [u8] as *mut i8,
101004e86ffSlogin                 len as i64,
102004e86ffSlogin                 0 as *mut i64,
103004e86ffSlogin             )
104004e86ffSlogin         };
105004e86ffSlogin         return Ok(r as usize);
106004e86ffSlogin     }
107004e86ffSlogin 
108004e86ffSlogin     fn write_at(
109004e86ffSlogin         &self,
110004e86ffSlogin         _offset: usize,
111004e86ffSlogin         _len: usize,
112004e86ffSlogin         _buf: &[u8],
1134ad52e57S裕依2439         _data: &mut FilePrivateData,
114676b8ef6SMork     ) -> Result<usize, SystemError> {
11579a452ceShoumkh         return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
116004e86ffSlogin     }
117004e86ffSlogin 
1184ad52e57S裕依2439     fn open(&self, _data: &mut FilePrivateData, _mode: &FileMode) -> Result<(), SystemError> {
11964aea4b3SGou Ngai         let prev_ref_count = self.1.fetch_add(1, core::sync::atomic::Ordering::SeqCst);
12064aea4b3SGou Ngai         if prev_ref_count == 0 {
12164aea4b3SGou Ngai             // 第一次打开,需要初始化
12264aea4b3SGou Ngai             let guard = self.0.write();
123004e86ffSlogin             let func = guard.f_ops.open.unwrap();
12446e234aeSLoGin             let _ = unsafe { func(0 as *mut c_void, 0 as *mut c_void) };
12564aea4b3SGou Ngai         }
126004e86ffSlogin         return Ok(());
127004e86ffSlogin     }
128004e86ffSlogin 
1294ad52e57S裕依2439     fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> {
13064aea4b3SGou Ngai         let prev_ref_count = self.1.fetch_sub(1, core::sync::atomic::Ordering::SeqCst);
13164aea4b3SGou Ngai         if prev_ref_count == 1 {
13264aea4b3SGou Ngai             // 最后一次关闭,需要释放
13364aea4b3SGou Ngai             let guard = self.0.write();
134004e86ffSlogin             let func = guard.f_ops.close.unwrap();
13546e234aeSLoGin             let _ = unsafe { func(0 as *mut c_void, 0 as *mut c_void) };
13664aea4b3SGou Ngai         }
137004e86ffSlogin         return Ok(());
138004e86ffSlogin     }
139004e86ffSlogin 
140676b8ef6SMork     fn metadata(&self) -> Result<Metadata, SystemError> {
14164aea4b3SGou Ngai         return Ok(self.0.read().metadata.clone());
142004e86ffSlogin     }
143004e86ffSlogin 
144676b8ef6SMork     fn set_metadata(&self, metadata: &Metadata) -> Result<(), SystemError> {
14564aea4b3SGou Ngai         let mut inode = self.0.write();
146004e86ffSlogin         inode.metadata.atime = metadata.atime;
147004e86ffSlogin         inode.metadata.mtime = metadata.mtime;
148004e86ffSlogin         inode.metadata.ctime = metadata.ctime;
149004e86ffSlogin         inode.metadata.mode = metadata.mode;
150004e86ffSlogin         inode.metadata.uid = metadata.uid;
151004e86ffSlogin         inode.metadata.gid = metadata.gid;
152004e86ffSlogin 
153004e86ffSlogin         return Ok(());
154004e86ffSlogin     }
155004e86ffSlogin 
1564ad52e57S裕依2439     fn fs(&self) -> alloc::sync::Arc<dyn FileSystem> {
15764aea4b3SGou Ngai         return self.0.read().fs.upgrade().unwrap();
158004e86ffSlogin     }
159004e86ffSlogin 
160004e86ffSlogin     fn as_any_ref(&self) -> &dyn core::any::Any {
161004e86ffSlogin         self
162004e86ffSlogin     }
163004e86ffSlogin 
164676b8ef6SMork     fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, SystemError> {
16579a452ceShoumkh         return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
166004e86ffSlogin     }
167004e86ffSlogin }
1685fb12ce4SGou Ngai 
1695fb12ce4SGou Ngai #[allow(dead_code)]
1705fb12ce4SGou Ngai #[no_mangle]
1715fb12ce4SGou Ngai /// for test
1725fb12ce4SGou Ngai pub extern "C" fn ps2_keyboard_parse_keycode(input: u8) {
1735fb12ce4SGou Ngai     PS2_KEYBOARD_FSM.lock().parse(input);
1745fb12ce4SGou Ngai }
175