xref: /DragonOS/kernel/src/driver/input/ps2_mouse/ps_mouse_device.rs (revision a381e482cbe742b2e4bbeaacae134a8131bf3f91)
1*a381e482SR0ronoa use core::hint::spin_loop;
2*a381e482SR0ronoa 
3*a381e482SR0ronoa use alloc::{
4*a381e482SR0ronoa     string::ToString,
5*a381e482SR0ronoa     sync::{Arc, Weak},
6*a381e482SR0ronoa };
7*a381e482SR0ronoa use kdepends::ringbuffer::{AllocRingBuffer, RingBuffer};
8*a381e482SR0ronoa use system_error::SystemError;
9*a381e482SR0ronoa use unified_init::macros::unified_init;
10*a381e482SR0ronoa 
11*a381e482SR0ronoa use crate::{
12*a381e482SR0ronoa     arch::{io::PortIOArch, CurrentIrqArch, CurrentPortIOArch},
13*a381e482SR0ronoa     driver::{
14*a381e482SR0ronoa         base::{
15*a381e482SR0ronoa             class::Class,
16*a381e482SR0ronoa             device::{
17*a381e482SR0ronoa                 bus::Bus, device_manager, device_number::DeviceNumber, driver::Driver, Device,
18*a381e482SR0ronoa                 DeviceType, IdTable,
19*a381e482SR0ronoa             },
20*a381e482SR0ronoa             kobject::{KObjType, KObject, KObjectState, LockedKObjectState},
21*a381e482SR0ronoa             kset::KSet,
22*a381e482SR0ronoa         },
23*a381e482SR0ronoa         input::serio::serio_device::{serio_device_manager, SerioDevice},
24*a381e482SR0ronoa     },
25*a381e482SR0ronoa     exception::InterruptArch,
26*a381e482SR0ronoa     filesystem::{
27*a381e482SR0ronoa         devfs::{devfs_register, DevFS, DeviceINode},
28*a381e482SR0ronoa         kernfs::KernFSInode,
29*a381e482SR0ronoa         vfs::{
30*a381e482SR0ronoa             core::generate_inode_id, syscall::ModeType, FilePrivateData, FileSystem, FileType,
31*a381e482SR0ronoa             IndexNode, Metadata,
32*a381e482SR0ronoa         },
33*a381e482SR0ronoa     },
34*a381e482SR0ronoa     init::initcall::INITCALL_DEVICE,
35*a381e482SR0ronoa     libs::{
36*a381e482SR0ronoa         rwlock::{RwLockReadGuard, RwLockWriteGuard},
37*a381e482SR0ronoa         spinlock::SpinLock,
38*a381e482SR0ronoa     },
39*a381e482SR0ronoa     time::TimeSpec,
40*a381e482SR0ronoa };
41*a381e482SR0ronoa 
42*a381e482SR0ronoa static mut PS2_MOUSE_DEVICE: Option<Arc<Ps2MouseDevice>> = None;
43*a381e482SR0ronoa 
44*a381e482SR0ronoa pub fn ps2_mouse_device() -> Option<Arc<Ps2MouseDevice>> {
45*a381e482SR0ronoa     unsafe { PS2_MOUSE_DEVICE.clone() }
46*a381e482SR0ronoa }
47*a381e482SR0ronoa 
48*a381e482SR0ronoa const ADDRESS_PORT_ADDRESS: u16 = 0x64;
49*a381e482SR0ronoa const DATA_PORT_ADDRESS: u16 = 0x60;
50*a381e482SR0ronoa 
51*a381e482SR0ronoa const KEYBOARD_COMMAND_ENABLE_PS2_MOUSE_PORT: u8 = 0xa8;
52*a381e482SR0ronoa const KEYBOARD_COMMAND_SEND_TO_PS2_MOUSE: u8 = 0xd4;
53*a381e482SR0ronoa 
54*a381e482SR0ronoa const MOUSE_BUFFER_CAPACITY: usize = 15;
55*a381e482SR0ronoa 
56*a381e482SR0ronoa bitflags! {
57*a381e482SR0ronoa     /// Represents the flags currently set for the mouse.
58*a381e482SR0ronoa     #[derive(Default)]
59*a381e482SR0ronoa     pub struct MouseFlags: u8 {
60*a381e482SR0ronoa         /// Whether or not the left mouse button is pressed.
61*a381e482SR0ronoa         const LEFT_BUTTON = 0b0000_0001;
62*a381e482SR0ronoa 
63*a381e482SR0ronoa         /// Whether or not the right mouse button is pressed.
64*a381e482SR0ronoa         const RIGHT_BUTTON = 0b0000_0010;
65*a381e482SR0ronoa 
66*a381e482SR0ronoa         /// Whether or not the middle mouse button is pressed.
67*a381e482SR0ronoa         const MIDDLE_BUTTON = 0b0000_0100;
68*a381e482SR0ronoa 
69*a381e482SR0ronoa         /// Whether or not the packet is valid or not.
70*a381e482SR0ronoa         const ALWAYS_ONE = 0b0000_1000;
71*a381e482SR0ronoa 
72*a381e482SR0ronoa         /// Whether or not the x delta is negative.
73*a381e482SR0ronoa         const X_SIGN = 0b0001_0000;
74*a381e482SR0ronoa 
75*a381e482SR0ronoa         /// Whether or not the y delta is negative.
76*a381e482SR0ronoa         const Y_SIGN = 0b0010_0000;
77*a381e482SR0ronoa 
78*a381e482SR0ronoa         /// Whether or not the x delta overflowed.
79*a381e482SR0ronoa         const X_OVERFLOW = 0b0100_0000;
80*a381e482SR0ronoa 
81*a381e482SR0ronoa         /// Whether or not the y delta overflowed.
82*a381e482SR0ronoa         const Y_OVERFLOW = 0b1000_0000;
83*a381e482SR0ronoa     }
84*a381e482SR0ronoa }
85*a381e482SR0ronoa 
86*a381e482SR0ronoa #[derive(Debug)]
87*a381e482SR0ronoa enum PsMouseCommand {
88*a381e482SR0ronoa     SampleRate(u8),
89*a381e482SR0ronoa     EnablePacketStreaming,
90*a381e482SR0ronoa     // SetDefaults = 0xF6,
91*a381e482SR0ronoa     InitKeyboard,
92*a381e482SR0ronoa     GetMouseId,
93*a381e482SR0ronoa     SetSampleRate,
94*a381e482SR0ronoa }
95*a381e482SR0ronoa 
96*a381e482SR0ronoa impl Into<u8> for PsMouseCommand {
97*a381e482SR0ronoa     fn into(self) -> u8 {
98*a381e482SR0ronoa         match self {
99*a381e482SR0ronoa             Self::SampleRate(x) => x,
100*a381e482SR0ronoa             Self::EnablePacketStreaming => 0xf4,
101*a381e482SR0ronoa             Self::InitKeyboard => 0x47,
102*a381e482SR0ronoa             Self::GetMouseId => 0xf2,
103*a381e482SR0ronoa             Self::SetSampleRate => 0xf3,
104*a381e482SR0ronoa         }
105*a381e482SR0ronoa     }
106*a381e482SR0ronoa }
107*a381e482SR0ronoa 
108*a381e482SR0ronoa #[derive(Debug)]
109*a381e482SR0ronoa pub struct MouseState {
110*a381e482SR0ronoa     flags: MouseFlags,
111*a381e482SR0ronoa     x: i16,
112*a381e482SR0ronoa     y: i16,
113*a381e482SR0ronoa }
114*a381e482SR0ronoa 
115*a381e482SR0ronoa #[allow(dead_code)]
116*a381e482SR0ronoa impl MouseState {
117*a381e482SR0ronoa     /// Returns a new `MouseState`.
118*a381e482SR0ronoa     pub const fn new() -> MouseState {
119*a381e482SR0ronoa         MouseState {
120*a381e482SR0ronoa             flags: MouseFlags::empty(),
121*a381e482SR0ronoa             x: 0,
122*a381e482SR0ronoa             y: 0,
123*a381e482SR0ronoa         }
124*a381e482SR0ronoa     }
125*a381e482SR0ronoa 
126*a381e482SR0ronoa     /// Returns true if the left mouse button is currently down.
127*a381e482SR0ronoa     pub fn left_button_down(&self) -> bool {
128*a381e482SR0ronoa         self.flags.contains(MouseFlags::LEFT_BUTTON)
129*a381e482SR0ronoa     }
130*a381e482SR0ronoa 
131*a381e482SR0ronoa     /// Returns true if the left mouse button is currently up.
132*a381e482SR0ronoa     pub fn left_button_up(&self) -> bool {
133*a381e482SR0ronoa         !self.flags.contains(MouseFlags::LEFT_BUTTON)
134*a381e482SR0ronoa     }
135*a381e482SR0ronoa 
136*a381e482SR0ronoa     /// Returns true if the right mouse button is currently down.
137*a381e482SR0ronoa     pub fn right_button_down(&self) -> bool {
138*a381e482SR0ronoa         self.flags.contains(MouseFlags::RIGHT_BUTTON)
139*a381e482SR0ronoa     }
140*a381e482SR0ronoa 
141*a381e482SR0ronoa     /// Returns true if the right mouse button is currently up.
142*a381e482SR0ronoa     pub fn right_button_up(&self) -> bool {
143*a381e482SR0ronoa         !self.flags.contains(MouseFlags::RIGHT_BUTTON)
144*a381e482SR0ronoa     }
145*a381e482SR0ronoa 
146*a381e482SR0ronoa     /// Returns true if the x axis has moved.
147*a381e482SR0ronoa     pub fn x_moved(&self) -> bool {
148*a381e482SR0ronoa         self.x != 0
149*a381e482SR0ronoa     }
150*a381e482SR0ronoa 
151*a381e482SR0ronoa     /// Returns true if the y axis has moved.
152*a381e482SR0ronoa     pub fn y_moved(&self) -> bool {
153*a381e482SR0ronoa         self.y != 0
154*a381e482SR0ronoa     }
155*a381e482SR0ronoa 
156*a381e482SR0ronoa     /// Returns true if the x or y axis has moved.
157*a381e482SR0ronoa     pub fn moved(&self) -> bool {
158*a381e482SR0ronoa         self.x_moved() || self.y_moved()
159*a381e482SR0ronoa     }
160*a381e482SR0ronoa 
161*a381e482SR0ronoa     /// Returns the x delta of the mouse state.
162*a381e482SR0ronoa     pub fn get_x(&self) -> i16 {
163*a381e482SR0ronoa         self.x
164*a381e482SR0ronoa     }
165*a381e482SR0ronoa 
166*a381e482SR0ronoa     /// Returns the y delta of the mouse state.
167*a381e482SR0ronoa     pub fn get_y(&self) -> i16 {
168*a381e482SR0ronoa         self.y
169*a381e482SR0ronoa     }
170*a381e482SR0ronoa }
171*a381e482SR0ronoa 
172*a381e482SR0ronoa #[derive(Debug)]
173*a381e482SR0ronoa #[cast_to([sync] Device, SerioDevice)]
174*a381e482SR0ronoa pub struct Ps2MouseDevice {
175*a381e482SR0ronoa     inner: SpinLock<InnerPs2MouseDevice>,
176*a381e482SR0ronoa     kobj_state: LockedKObjectState,
177*a381e482SR0ronoa }
178*a381e482SR0ronoa 
179*a381e482SR0ronoa impl Ps2MouseDevice {
180*a381e482SR0ronoa     pub const NAME: &'static str = "psmouse";
181*a381e482SR0ronoa     pub fn new() -> Self {
182*a381e482SR0ronoa         let r = Self {
183*a381e482SR0ronoa             inner: SpinLock::new(InnerPs2MouseDevice {
184*a381e482SR0ronoa                 bus: None,
185*a381e482SR0ronoa                 class: None,
186*a381e482SR0ronoa                 driver: None,
187*a381e482SR0ronoa                 kern_inode: None,
188*a381e482SR0ronoa                 parent: None,
189*a381e482SR0ronoa                 kset: None,
190*a381e482SR0ronoa                 kobj_type: None,
191*a381e482SR0ronoa                 current_packet: 0,
192*a381e482SR0ronoa                 current_state: MouseState::new(),
193*a381e482SR0ronoa                 buf: AllocRingBuffer::new(MOUSE_BUFFER_CAPACITY),
194*a381e482SR0ronoa                 devfs_metadata: Metadata {
195*a381e482SR0ronoa                     dev_id: 1,
196*a381e482SR0ronoa                     inode_id: generate_inode_id(),
197*a381e482SR0ronoa                     size: 4096,
198*a381e482SR0ronoa                     blk_size: 0,
199*a381e482SR0ronoa                     blocks: 0,
200*a381e482SR0ronoa                     atime: TimeSpec::default(),
201*a381e482SR0ronoa                     mtime: TimeSpec::default(),
202*a381e482SR0ronoa                     ctime: TimeSpec::default(),
203*a381e482SR0ronoa                     file_type: FileType::CharDevice, // 文件夹,block设备,char设备
204*a381e482SR0ronoa                     mode: ModeType::from_bits_truncate(0o644),
205*a381e482SR0ronoa                     nlinks: 1,
206*a381e482SR0ronoa                     uid: 0,
207*a381e482SR0ronoa                     gid: 0,
208*a381e482SR0ronoa                     raw_dev: DeviceNumber::default(), // 这里用来作为device number
209*a381e482SR0ronoa                 },
210*a381e482SR0ronoa                 device_inode_fs: None,
211*a381e482SR0ronoa             }),
212*a381e482SR0ronoa             kobj_state: LockedKObjectState::new(None),
213*a381e482SR0ronoa         };
214*a381e482SR0ronoa         return r;
215*a381e482SR0ronoa     }
216*a381e482SR0ronoa 
217*a381e482SR0ronoa     pub fn init(&self) -> Result<(), SystemError> {
218*a381e482SR0ronoa         let _irq_guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
219*a381e482SR0ronoa 
220*a381e482SR0ronoa         self.write_control_port(KEYBOARD_COMMAND_ENABLE_PS2_MOUSE_PORT)?;
221*a381e482SR0ronoa         for _i in 0..1000 {
222*a381e482SR0ronoa             for _j in 0..1000 {
223*a381e482SR0ronoa                 spin_loop();
224*a381e482SR0ronoa             }
225*a381e482SR0ronoa         }
226*a381e482SR0ronoa         self.read_data_port().ok();
227*a381e482SR0ronoa 
228*a381e482SR0ronoa         self.send_command_to_ps2mouse(PsMouseCommand::EnablePacketStreaming)
229*a381e482SR0ronoa             .map_err(|e| {
230*a381e482SR0ronoa                 kerror!("ps2 mouse init error: {:?}", e);
231*a381e482SR0ronoa                 e
232*a381e482SR0ronoa             })?;
233*a381e482SR0ronoa         self.read_data_port().ok();
234*a381e482SR0ronoa         for _i in 0..1000 {
235*a381e482SR0ronoa             for _j in 0..1000 {
236*a381e482SR0ronoa                 spin_loop();
237*a381e482SR0ronoa             }
238*a381e482SR0ronoa         }
239*a381e482SR0ronoa 
240*a381e482SR0ronoa         // self.send_command_to_ps2mouse(PsMouseCommand::InitKeyboard)?;
241*a381e482SR0ronoa         self.do_send_command(DATA_PORT_ADDRESS as u8, PsMouseCommand::InitKeyboard.into())?;
242*a381e482SR0ronoa         self.read_data_port().ok();
243*a381e482SR0ronoa         for _i in 0..1000 {
244*a381e482SR0ronoa             for _j in 0..1000 {
245*a381e482SR0ronoa                 spin_loop();
246*a381e482SR0ronoa             }
247*a381e482SR0ronoa         }
248*a381e482SR0ronoa 
249*a381e482SR0ronoa         self.set_sample_rate(20)?;
250*a381e482SR0ronoa         // self.get_mouse_id()?;
251*a381e482SR0ronoa         Ok(())
252*a381e482SR0ronoa     }
253*a381e482SR0ronoa 
254*a381e482SR0ronoa     #[allow(dead_code)]
255*a381e482SR0ronoa     pub fn get_mouse_id(&self) -> Result<(), SystemError> {
256*a381e482SR0ronoa         self.send_command_to_ps2mouse(PsMouseCommand::GetMouseId)?;
257*a381e482SR0ronoa         let _mouse_id = self.read_data_port()?;
258*a381e482SR0ronoa         Ok(())
259*a381e482SR0ronoa     }
260*a381e482SR0ronoa 
261*a381e482SR0ronoa     /// 设置鼠标采样率
262*a381e482SR0ronoa     ///
263*a381e482SR0ronoa     /// `hz` 合法值为 10,20,40,60,80,100,200
264*a381e482SR0ronoa     pub fn set_sample_rate(&self, hz: u8) -> Result<(), SystemError> {
265*a381e482SR0ronoa         const SAMPLE_RATE: [u8; 7] = [10, 20, 40, 60, 80, 100, 200];
266*a381e482SR0ronoa         if !SAMPLE_RATE.contains(&hz) {
267*a381e482SR0ronoa             return Err(SystemError::EINVAL);
268*a381e482SR0ronoa         }
269*a381e482SR0ronoa 
270*a381e482SR0ronoa         self.send_command_to_ps2mouse(PsMouseCommand::SetSampleRate)?;
271*a381e482SR0ronoa         self.read_data_port().ok();
272*a381e482SR0ronoa         for _i in 0..1000 {
273*a381e482SR0ronoa             for _j in 0..1000 {
274*a381e482SR0ronoa                 spin_loop();
275*a381e482SR0ronoa             }
276*a381e482SR0ronoa         }
277*a381e482SR0ronoa 
278*a381e482SR0ronoa         self.send_command_to_ps2mouse(PsMouseCommand::SampleRate(hz))?;
279*a381e482SR0ronoa         for _i in 0..1000 {
280*a381e482SR0ronoa             for _j in 0..1000 {
281*a381e482SR0ronoa                 spin_loop();
282*a381e482SR0ronoa             }
283*a381e482SR0ronoa         }
284*a381e482SR0ronoa         self.read_data_port().ok();
285*a381e482SR0ronoa         Ok(())
286*a381e482SR0ronoa     }
287*a381e482SR0ronoa 
288*a381e482SR0ronoa     /// # 函数的功能
289*a381e482SR0ronoa     /// 鼠标设备处理数据包
290*a381e482SR0ronoa     pub fn process_packet(&self) -> Result<(), SystemError> {
291*a381e482SR0ronoa         let packet = self.read_data_port()?;
292*a381e482SR0ronoa         let mut guard = self.inner.lock();
293*a381e482SR0ronoa         guard.buf.push(packet); // 更新缓冲区
294*a381e482SR0ronoa         match guard.current_packet {
295*a381e482SR0ronoa             0 => {
296*a381e482SR0ronoa                 let flags: MouseFlags = MouseFlags::from_bits_truncate(packet);
297*a381e482SR0ronoa                 if !flags.contains(MouseFlags::ALWAYS_ONE) {
298*a381e482SR0ronoa                     return Ok(());
299*a381e482SR0ronoa                 }
300*a381e482SR0ronoa                 guard.current_state.flags = flags;
301*a381e482SR0ronoa             }
302*a381e482SR0ronoa             1 => {
303*a381e482SR0ronoa                 let flags = guard.current_state.flags.clone();
304*a381e482SR0ronoa                 if !flags.contains(MouseFlags::X_OVERFLOW) {
305*a381e482SR0ronoa                     guard.current_state.x = self.get_x_movement(packet, flags);
306*a381e482SR0ronoa                 }
307*a381e482SR0ronoa             }
308*a381e482SR0ronoa             2 => {
309*a381e482SR0ronoa                 let flags = guard.current_state.flags.clone();
310*a381e482SR0ronoa                 if !flags.contains(MouseFlags::Y_OVERFLOW) {
311*a381e482SR0ronoa                     guard.current_state.y = self.get_y_movement(packet, flags);
312*a381e482SR0ronoa                 }
313*a381e482SR0ronoa 
314*a381e482SR0ronoa                 // kdebug!(
315*a381e482SR0ronoa                 //     "Ps2MouseDevice packet : flags:{}, x:{}, y:{}\n",
316*a381e482SR0ronoa                 //     guard.current_state.flags.bits,
317*a381e482SR0ronoa                 //     guard.current_state.x,
318*a381e482SR0ronoa                 //     guard.current_state.y
319*a381e482SR0ronoa                 // )
320*a381e482SR0ronoa             }
321*a381e482SR0ronoa             _ => unreachable!(),
322*a381e482SR0ronoa         }
323*a381e482SR0ronoa         guard.current_packet = (guard.current_packet + 1) % 3;
324*a381e482SR0ronoa         Ok(())
325*a381e482SR0ronoa     }
326*a381e482SR0ronoa 
327*a381e482SR0ronoa     fn get_x_movement(&self, packet: u8, flags: MouseFlags) -> i16 {
328*a381e482SR0ronoa         if flags.contains(MouseFlags::X_SIGN) {
329*a381e482SR0ronoa             return self.sign_extend(packet);
330*a381e482SR0ronoa         } else {
331*a381e482SR0ronoa             return packet as i16;
332*a381e482SR0ronoa         }
333*a381e482SR0ronoa     }
334*a381e482SR0ronoa 
335*a381e482SR0ronoa     fn get_y_movement(&self, packet: u8, flags: MouseFlags) -> i16 {
336*a381e482SR0ronoa         if flags.contains(MouseFlags::Y_SIGN) {
337*a381e482SR0ronoa             return self.sign_extend(packet);
338*a381e482SR0ronoa         } else {
339*a381e482SR0ronoa             return packet as i16;
340*a381e482SR0ronoa         }
341*a381e482SR0ronoa     }
342*a381e482SR0ronoa 
343*a381e482SR0ronoa     fn sign_extend(&self, packet: u8) -> i16 {
344*a381e482SR0ronoa         ((packet as u16) | 0xFF00) as i16
345*a381e482SR0ronoa     }
346*a381e482SR0ronoa 
347*a381e482SR0ronoa     fn read_data_port(&self) -> Result<u8, SystemError> {
348*a381e482SR0ronoa         self.wait_for_write()?;
349*a381e482SR0ronoa         let cmd = unsafe { CurrentPortIOArch::in8(ADDRESS_PORT_ADDRESS) };
350*a381e482SR0ronoa         if (cmd & 0x21) == 0x21 {
351*a381e482SR0ronoa             let data = unsafe { CurrentPortIOArch::in8(DATA_PORT_ADDRESS) };
352*a381e482SR0ronoa             return Ok(data);
353*a381e482SR0ronoa         } else {
354*a381e482SR0ronoa             return Err(SystemError::ENODATA);
355*a381e482SR0ronoa         }
356*a381e482SR0ronoa     }
357*a381e482SR0ronoa 
358*a381e482SR0ronoa     #[inline(never)]
359*a381e482SR0ronoa     fn send_command_to_ps2mouse(&self, command: PsMouseCommand) -> Result<(), SystemError> {
360*a381e482SR0ronoa         self.do_send_command(KEYBOARD_COMMAND_SEND_TO_PS2_MOUSE, command.into())?;
361*a381e482SR0ronoa         Ok(())
362*a381e482SR0ronoa     }
363*a381e482SR0ronoa 
364*a381e482SR0ronoa     #[inline(never)]
365*a381e482SR0ronoa     fn do_send_command(&self, ctrl: u8, command: u8) -> Result<(), SystemError> {
366*a381e482SR0ronoa         self.write_control_port(ctrl)?;
367*a381e482SR0ronoa         self.write_data_port(command)?;
368*a381e482SR0ronoa         return Ok(());
369*a381e482SR0ronoa     }
370*a381e482SR0ronoa 
371*a381e482SR0ronoa     fn write_data_port(&self, data: u8) -> Result<(), SystemError> {
372*a381e482SR0ronoa         self.wait_for_write()?;
373*a381e482SR0ronoa         unsafe {
374*a381e482SR0ronoa             CurrentPortIOArch::out8(DATA_PORT_ADDRESS, data);
375*a381e482SR0ronoa         }
376*a381e482SR0ronoa         Ok(())
377*a381e482SR0ronoa     }
378*a381e482SR0ronoa 
379*a381e482SR0ronoa     fn write_control_port(&self, command: u8) -> Result<(), SystemError> {
380*a381e482SR0ronoa         self.wait_for_write()?;
381*a381e482SR0ronoa         unsafe {
382*a381e482SR0ronoa             CurrentPortIOArch::out8(ADDRESS_PORT_ADDRESS, command);
383*a381e482SR0ronoa         }
384*a381e482SR0ronoa         Ok(())
385*a381e482SR0ronoa     }
386*a381e482SR0ronoa 
387*a381e482SR0ronoa     fn wait_for_read(&self) -> Result<(), SystemError> {
388*a381e482SR0ronoa         let timeout = 100_000;
389*a381e482SR0ronoa         for _ in 0..timeout {
390*a381e482SR0ronoa             let value = unsafe { CurrentPortIOArch::in8(ADDRESS_PORT_ADDRESS) };
391*a381e482SR0ronoa             if (value & 0x1) == 0x1 {
392*a381e482SR0ronoa                 return Ok(());
393*a381e482SR0ronoa             }
394*a381e482SR0ronoa         }
395*a381e482SR0ronoa         Err(SystemError::ETIMEDOUT)
396*a381e482SR0ronoa     }
397*a381e482SR0ronoa 
398*a381e482SR0ronoa     fn wait_for_write(&self) -> Result<(), SystemError> {
399*a381e482SR0ronoa         let timeout = 100_000;
400*a381e482SR0ronoa         for _ in 0..timeout {
401*a381e482SR0ronoa             let value = unsafe { CurrentPortIOArch::in8(ADDRESS_PORT_ADDRESS) };
402*a381e482SR0ronoa             if (value & 0x2) == 0 {
403*a381e482SR0ronoa                 return Ok(());
404*a381e482SR0ronoa             }
405*a381e482SR0ronoa         }
406*a381e482SR0ronoa         Err(SystemError::ETIMEDOUT)
407*a381e482SR0ronoa     }
408*a381e482SR0ronoa }
409*a381e482SR0ronoa 
410*a381e482SR0ronoa #[derive(Debug)]
411*a381e482SR0ronoa struct InnerPs2MouseDevice {
412*a381e482SR0ronoa     bus: Option<Weak<dyn Bus>>,
413*a381e482SR0ronoa     class: Option<Arc<dyn Class>>,
414*a381e482SR0ronoa     driver: Option<Weak<dyn Driver>>,
415*a381e482SR0ronoa     kern_inode: Option<Arc<KernFSInode>>,
416*a381e482SR0ronoa     parent: Option<Weak<dyn KObject>>,
417*a381e482SR0ronoa     kset: Option<Arc<KSet>>,
418*a381e482SR0ronoa     kobj_type: Option<&'static dyn KObjType>,
419*a381e482SR0ronoa 
420*a381e482SR0ronoa     /// 鼠标数据
421*a381e482SR0ronoa     current_state: MouseState,
422*a381e482SR0ronoa     current_packet: u8,
423*a381e482SR0ronoa     /// 鼠标数据环形缓冲区
424*a381e482SR0ronoa     buf: AllocRingBuffer<u8>,
425*a381e482SR0ronoa 
426*a381e482SR0ronoa     /// device inode要求的字段
427*a381e482SR0ronoa     device_inode_fs: Option<Weak<DevFS>>,
428*a381e482SR0ronoa     devfs_metadata: Metadata,
429*a381e482SR0ronoa }
430*a381e482SR0ronoa 
431*a381e482SR0ronoa impl Device for Ps2MouseDevice {
432*a381e482SR0ronoa     fn is_dead(&self) -> bool {
433*a381e482SR0ronoa         false
434*a381e482SR0ronoa     }
435*a381e482SR0ronoa 
436*a381e482SR0ronoa     fn dev_type(&self) -> DeviceType {
437*a381e482SR0ronoa         DeviceType::Char
438*a381e482SR0ronoa     }
439*a381e482SR0ronoa 
440*a381e482SR0ronoa     fn id_table(&self) -> IdTable {
441*a381e482SR0ronoa         IdTable::new(self.name().to_string(), None)
442*a381e482SR0ronoa     }
443*a381e482SR0ronoa 
444*a381e482SR0ronoa     fn set_bus(&self, bus: Option<alloc::sync::Weak<dyn Bus>>) {
445*a381e482SR0ronoa         self.inner.lock_irqsave().bus = bus;
446*a381e482SR0ronoa     }
447*a381e482SR0ronoa 
448*a381e482SR0ronoa     fn set_class(&self, class: Option<alloc::sync::Arc<dyn Class>>) {
449*a381e482SR0ronoa         self.inner.lock_irqsave().class = class;
450*a381e482SR0ronoa     }
451*a381e482SR0ronoa 
452*a381e482SR0ronoa     fn driver(&self) -> Option<alloc::sync::Arc<dyn Driver>> {
453*a381e482SR0ronoa         self.inner.lock_irqsave().driver.clone()?.upgrade()
454*a381e482SR0ronoa     }
455*a381e482SR0ronoa 
456*a381e482SR0ronoa     fn set_driver(&self, driver: Option<alloc::sync::Weak<dyn Driver>>) {
457*a381e482SR0ronoa         self.inner.lock_irqsave().driver = driver;
458*a381e482SR0ronoa     }
459*a381e482SR0ronoa 
460*a381e482SR0ronoa     fn can_match(&self) -> bool {
461*a381e482SR0ronoa         true
462*a381e482SR0ronoa     }
463*a381e482SR0ronoa 
464*a381e482SR0ronoa     fn set_can_match(&self, _can_match: bool) {}
465*a381e482SR0ronoa 
466*a381e482SR0ronoa     fn state_synced(&self) -> bool {
467*a381e482SR0ronoa         true
468*a381e482SR0ronoa     }
469*a381e482SR0ronoa 
470*a381e482SR0ronoa     fn bus(&self) -> Option<alloc::sync::Weak<dyn Bus>> {
471*a381e482SR0ronoa         self.inner.lock_irqsave().bus.clone()
472*a381e482SR0ronoa     }
473*a381e482SR0ronoa 
474*a381e482SR0ronoa     fn class(&self) -> Option<Arc<dyn Class>> {
475*a381e482SR0ronoa         self.inner.lock_irqsave().class.clone()
476*a381e482SR0ronoa     }
477*a381e482SR0ronoa }
478*a381e482SR0ronoa 
479*a381e482SR0ronoa impl SerioDevice for Ps2MouseDevice {
480*a381e482SR0ronoa     fn write(
481*a381e482SR0ronoa         &self,
482*a381e482SR0ronoa         _device: &alloc::sync::Arc<dyn SerioDevice>,
483*a381e482SR0ronoa         _data: u8,
484*a381e482SR0ronoa     ) -> Result<(), system_error::SystemError> {
485*a381e482SR0ronoa         todo!()
486*a381e482SR0ronoa     }
487*a381e482SR0ronoa 
488*a381e482SR0ronoa     fn open(
489*a381e482SR0ronoa         &self,
490*a381e482SR0ronoa         _device: &alloc::sync::Arc<dyn SerioDevice>,
491*a381e482SR0ronoa     ) -> Result<(), system_error::SystemError> {
492*a381e482SR0ronoa         todo!()
493*a381e482SR0ronoa     }
494*a381e482SR0ronoa 
495*a381e482SR0ronoa     fn close(
496*a381e482SR0ronoa         &self,
497*a381e482SR0ronoa         _device: &alloc::sync::Arc<dyn SerioDevice>,
498*a381e482SR0ronoa     ) -> Result<(), system_error::SystemError> {
499*a381e482SR0ronoa         todo!()
500*a381e482SR0ronoa     }
501*a381e482SR0ronoa 
502*a381e482SR0ronoa     fn start(
503*a381e482SR0ronoa         &self,
504*a381e482SR0ronoa         _device: &alloc::sync::Arc<dyn SerioDevice>,
505*a381e482SR0ronoa     ) -> Result<(), system_error::SystemError> {
506*a381e482SR0ronoa         todo!()
507*a381e482SR0ronoa     }
508*a381e482SR0ronoa 
509*a381e482SR0ronoa     fn stop(
510*a381e482SR0ronoa         &self,
511*a381e482SR0ronoa         _device: &alloc::sync::Arc<dyn SerioDevice>,
512*a381e482SR0ronoa     ) -> Result<(), system_error::SystemError> {
513*a381e482SR0ronoa         todo!()
514*a381e482SR0ronoa     }
515*a381e482SR0ronoa }
516*a381e482SR0ronoa 
517*a381e482SR0ronoa impl KObject for Ps2MouseDevice {
518*a381e482SR0ronoa     fn as_any_ref(&self) -> &dyn core::any::Any {
519*a381e482SR0ronoa         self
520*a381e482SR0ronoa     }
521*a381e482SR0ronoa 
522*a381e482SR0ronoa     fn set_inode(&self, inode: Option<alloc::sync::Arc<KernFSInode>>) {
523*a381e482SR0ronoa         self.inner.lock_irqsave().kern_inode = inode;
524*a381e482SR0ronoa     }
525*a381e482SR0ronoa 
526*a381e482SR0ronoa     fn inode(&self) -> Option<alloc::sync::Arc<KernFSInode>> {
527*a381e482SR0ronoa         self.inner.lock_irqsave().kern_inode.clone()
528*a381e482SR0ronoa     }
529*a381e482SR0ronoa 
530*a381e482SR0ronoa     fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> {
531*a381e482SR0ronoa         self.inner.lock_irqsave().parent.clone()
532*a381e482SR0ronoa     }
533*a381e482SR0ronoa 
534*a381e482SR0ronoa     fn set_parent(&self, parent: Option<alloc::sync::Weak<dyn KObject>>) {
535*a381e482SR0ronoa         self.inner.lock_irqsave().parent = parent
536*a381e482SR0ronoa     }
537*a381e482SR0ronoa 
538*a381e482SR0ronoa     fn kset(&self) -> Option<alloc::sync::Arc<KSet>> {
539*a381e482SR0ronoa         self.inner.lock_irqsave().kset.clone()
540*a381e482SR0ronoa     }
541*a381e482SR0ronoa 
542*a381e482SR0ronoa     fn set_kset(&self, kset: Option<alloc::sync::Arc<KSet>>) {
543*a381e482SR0ronoa         self.inner.lock_irqsave().kset = kset;
544*a381e482SR0ronoa     }
545*a381e482SR0ronoa 
546*a381e482SR0ronoa     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
547*a381e482SR0ronoa         self.inner.lock_irqsave().kobj_type.clone()
548*a381e482SR0ronoa     }
549*a381e482SR0ronoa 
550*a381e482SR0ronoa     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
551*a381e482SR0ronoa         self.inner.lock_irqsave().kobj_type = ktype;
552*a381e482SR0ronoa     }
553*a381e482SR0ronoa 
554*a381e482SR0ronoa     fn name(&self) -> alloc::string::String {
555*a381e482SR0ronoa         Self::NAME.to_string()
556*a381e482SR0ronoa     }
557*a381e482SR0ronoa 
558*a381e482SR0ronoa     fn set_name(&self, _name: alloc::string::String) {}
559*a381e482SR0ronoa 
560*a381e482SR0ronoa     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
561*a381e482SR0ronoa         self.kobj_state.read()
562*a381e482SR0ronoa     }
563*a381e482SR0ronoa 
564*a381e482SR0ronoa     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
565*a381e482SR0ronoa         self.kobj_state.write()
566*a381e482SR0ronoa     }
567*a381e482SR0ronoa 
568*a381e482SR0ronoa     fn set_kobj_state(&self, state: KObjectState) {
569*a381e482SR0ronoa         *self.kobj_state.write() = state;
570*a381e482SR0ronoa     }
571*a381e482SR0ronoa }
572*a381e482SR0ronoa 
573*a381e482SR0ronoa impl DeviceINode for Ps2MouseDevice {
574*a381e482SR0ronoa     fn set_fs(&self, fs: Weak<DevFS>) {
575*a381e482SR0ronoa         self.inner.lock_irqsave().device_inode_fs = Some(fs);
576*a381e482SR0ronoa     }
577*a381e482SR0ronoa }
578*a381e482SR0ronoa 
579*a381e482SR0ronoa impl IndexNode for Ps2MouseDevice {
580*a381e482SR0ronoa     fn open(
581*a381e482SR0ronoa         &self,
582*a381e482SR0ronoa         _data: &mut FilePrivateData,
583*a381e482SR0ronoa         _mode: &crate::filesystem::vfs::file::FileMode,
584*a381e482SR0ronoa     ) -> Result<(), SystemError> {
585*a381e482SR0ronoa         let mut guard = self.inner.lock_irqsave();
586*a381e482SR0ronoa         guard.buf.clear();
587*a381e482SR0ronoa         Ok(())
588*a381e482SR0ronoa     }
589*a381e482SR0ronoa 
590*a381e482SR0ronoa     fn close(&self, _data: &mut FilePrivateData) -> Result<(), SystemError> {
591*a381e482SR0ronoa         let mut guard = self.inner.lock_irqsave();
592*a381e482SR0ronoa         guard.buf.clear();
593*a381e482SR0ronoa         Ok(())
594*a381e482SR0ronoa     }
595*a381e482SR0ronoa 
596*a381e482SR0ronoa     fn read_at(
597*a381e482SR0ronoa         &self,
598*a381e482SR0ronoa         _offset: usize,
599*a381e482SR0ronoa         _len: usize,
600*a381e482SR0ronoa         buf: &mut [u8],
601*a381e482SR0ronoa         _data: &mut FilePrivateData,
602*a381e482SR0ronoa     ) -> Result<usize, SystemError> {
603*a381e482SR0ronoa         let mut guard = self.inner.lock_irqsave();
604*a381e482SR0ronoa 
605*a381e482SR0ronoa         if guard.buf.len() >= 3 {
606*a381e482SR0ronoa             for i in 0..3 {
607*a381e482SR0ronoa                 buf[i] = guard.buf.dequeue().unwrap();
608*a381e482SR0ronoa             }
609*a381e482SR0ronoa             return Ok(3);
610*a381e482SR0ronoa         } else {
611*a381e482SR0ronoa             return Ok(0);
612*a381e482SR0ronoa         }
613*a381e482SR0ronoa     }
614*a381e482SR0ronoa 
615*a381e482SR0ronoa     fn write_at(
616*a381e482SR0ronoa         &self,
617*a381e482SR0ronoa         _offset: usize,
618*a381e482SR0ronoa         _len: usize,
619*a381e482SR0ronoa         _buf: &[u8],
620*a381e482SR0ronoa         _data: &mut FilePrivateData,
621*a381e482SR0ronoa     ) -> Result<usize, SystemError> {
622*a381e482SR0ronoa         return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
623*a381e482SR0ronoa     }
624*a381e482SR0ronoa 
625*a381e482SR0ronoa     fn fs(&self) -> Arc<dyn FileSystem> {
626*a381e482SR0ronoa         self.inner
627*a381e482SR0ronoa             .lock_irqsave()
628*a381e482SR0ronoa             .device_inode_fs
629*a381e482SR0ronoa             .as_ref()
630*a381e482SR0ronoa             .unwrap()
631*a381e482SR0ronoa             .upgrade()
632*a381e482SR0ronoa             .unwrap()
633*a381e482SR0ronoa     }
634*a381e482SR0ronoa 
635*a381e482SR0ronoa     fn as_any_ref(&self) -> &dyn core::any::Any {
636*a381e482SR0ronoa         self
637*a381e482SR0ronoa     }
638*a381e482SR0ronoa 
639*a381e482SR0ronoa     fn list(&self) -> Result<alloc::vec::Vec<alloc::string::String>, SystemError> {
640*a381e482SR0ronoa         todo!()
641*a381e482SR0ronoa     }
642*a381e482SR0ronoa 
643*a381e482SR0ronoa     fn metadata(&self) -> Result<Metadata, SystemError> {
644*a381e482SR0ronoa         Ok(self.inner.lock_irqsave().devfs_metadata.clone())
645*a381e482SR0ronoa     }
646*a381e482SR0ronoa 
647*a381e482SR0ronoa     fn resize(&self, _len: usize) -> Result<(), SystemError> {
648*a381e482SR0ronoa         Ok(())
649*a381e482SR0ronoa     }
650*a381e482SR0ronoa }
651*a381e482SR0ronoa 
652*a381e482SR0ronoa #[unified_init(INITCALL_DEVICE)]
653*a381e482SR0ronoa fn rs_ps2_mouse_device_int() -> Result<(), SystemError> {
654*a381e482SR0ronoa     kdebug!("ps2_mouse_device initializing...");
655*a381e482SR0ronoa     let psmouse = Arc::new(Ps2MouseDevice::new());
656*a381e482SR0ronoa 
657*a381e482SR0ronoa     device_manager().device_default_initialize(&(psmouse.clone() as Arc<dyn Device>));
658*a381e482SR0ronoa     serio_device_manager().register_port(psmouse.clone())?;
659*a381e482SR0ronoa 
660*a381e482SR0ronoa     devfs_register(&psmouse.name(), psmouse.clone()).map_err(|e| {
661*a381e482SR0ronoa         kerror!(
662*a381e482SR0ronoa             "register psmouse device '{}' to devfs failed: {:?}",
663*a381e482SR0ronoa             psmouse.name(),
664*a381e482SR0ronoa             e
665*a381e482SR0ronoa         );
666*a381e482SR0ronoa         device_manager().remove(&(psmouse.clone() as Arc<dyn Device>));
667*a381e482SR0ronoa         e
668*a381e482SR0ronoa     })?;
669*a381e482SR0ronoa 
670*a381e482SR0ronoa     unsafe { PS2_MOUSE_DEVICE = Some(psmouse) };
671*a381e482SR0ronoa     return Ok(());
672*a381e482SR0ronoa }
673