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