ps2_keyboard.rs 5.2 KB

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