1a381e482SR0ronoa use alloc::{ 2a381e482SR0ronoa string::ToString, 3a381e482SR0ronoa sync::{Arc, Weak}, 4a381e482SR0ronoa vec::Vec, 5a381e482SR0ronoa }; 6a381e482SR0ronoa use system_error::SystemError; 7a381e482SR0ronoa use unified_init::macros::unified_init; 8a381e482SR0ronoa 9a381e482SR0ronoa use crate::{ 10a381e482SR0ronoa arch::{io::PortIOArch, CurrentPortIOArch}, 11a381e482SR0ronoa driver::{ 12a381e482SR0ronoa base::{ 13*e2841179SLoGin device::{bus::Bus, driver::Driver, Device, DeviceId, IdTable}, 14a381e482SR0ronoa kobject::{KObjType, KObject, KObjectState, LockedKObjectState}, 15a381e482SR0ronoa kset::KSet, 16a381e482SR0ronoa }, 17a381e482SR0ronoa input::serio::{ 18a381e482SR0ronoa serio_device::SerioDevice, 19a381e482SR0ronoa serio_driver::{serio_driver_manager, SerioDriver}, 20a381e482SR0ronoa }, 21a381e482SR0ronoa }, 22*e2841179SLoGin exception::{ 23*e2841179SLoGin irqdata::IrqHandlerData, 24*e2841179SLoGin irqdesc::{IrqHandleFlags, IrqHandler, IrqReturn}, 25*e2841179SLoGin manage::irq_manager, 26*e2841179SLoGin IrqNumber, 27*e2841179SLoGin }, 28a381e482SR0ronoa filesystem::kernfs::KernFSInode, 29a381e482SR0ronoa init::initcall::INITCALL_DEVICE, 30a381e482SR0ronoa libs::{ 31a381e482SR0ronoa rwlock::{RwLockReadGuard, RwLockWriteGuard}, 32a381e482SR0ronoa spinlock::SpinLock, 33a381e482SR0ronoa }, 34a381e482SR0ronoa }; 35a381e482SR0ronoa 36a381e482SR0ronoa use super::ps_mouse_device::{ps2_mouse_device, Ps2MouseDevice}; 37a381e482SR0ronoa 38*e2841179SLoGin const PS2_MOUSE_IRQ_NUM: IrqNumber = IrqNumber::new(0x2c); 39a381e482SR0ronoa 40a381e482SR0ronoa #[no_mangle] 41*e2841179SLoGin unsafe extern "C" fn ps2_mouse_driver_interrupt() {} 42*e2841179SLoGin 43*e2841179SLoGin #[derive(Debug)] 44*e2841179SLoGin struct Ps2MouseIrqHandler; 45*e2841179SLoGin 46*e2841179SLoGin impl IrqHandler for Ps2MouseIrqHandler { 47*e2841179SLoGin fn handle( 48*e2841179SLoGin &self, 49*e2841179SLoGin _irq: IrqNumber, 50*e2841179SLoGin _static_data: Option<&dyn IrqHandlerData>, 51*e2841179SLoGin _dev_id: Option<Arc<dyn IrqHandlerData>>, 52*e2841179SLoGin ) -> Result<IrqReturn, SystemError> { 53a381e482SR0ronoa if let Some(psmouse_device) = ps2_mouse_device() { 54*e2841179SLoGin return Ok(ps2_mouse_driver() 55a381e482SR0ronoa .interrupt(&(psmouse_device as Arc<dyn SerioDevice>), 0, 0) 56*e2841179SLoGin .map(|_| IrqReturn::Handled) 57*e2841179SLoGin .unwrap_or_else(|_| IrqReturn::NotHandled)); 58a381e482SR0ronoa } else { 59a381e482SR0ronoa unsafe { CurrentPortIOArch::in8(0x60) }; 60*e2841179SLoGin return Ok(IrqReturn::NotHandled); 61*e2841179SLoGin } 62a381e482SR0ronoa } 63a381e482SR0ronoa } 64a381e482SR0ronoa 65a381e482SR0ronoa static mut PS2_MOUSE_DRIVER: Option<Arc<Ps2MouseDriver>> = None; 66a381e482SR0ronoa 67a381e482SR0ronoa #[allow(dead_code)] 68a381e482SR0ronoa pub fn ps2_mouse_driver() -> Arc<Ps2MouseDriver> { 69a381e482SR0ronoa unsafe { PS2_MOUSE_DRIVER.clone().unwrap() } 70a381e482SR0ronoa } 71a381e482SR0ronoa 72a381e482SR0ronoa #[derive(Debug)] 73a381e482SR0ronoa #[cast_to([sync] Driver)] 74a381e482SR0ronoa #[cast_to([sync] SerioDriver)] 75a381e482SR0ronoa pub struct Ps2MouseDriver { 76a381e482SR0ronoa inner: SpinLock<InnerPs2MouseDriver>, 77a381e482SR0ronoa kobj_state: LockedKObjectState, 78a381e482SR0ronoa } 79a381e482SR0ronoa 80a381e482SR0ronoa impl Ps2MouseDriver { 81a381e482SR0ronoa pub const NAME: &'static str = "psmouse"; 82a381e482SR0ronoa pub fn new() -> Arc<Self> { 83a381e482SR0ronoa let r = Arc::new(Ps2MouseDriver { 84a381e482SR0ronoa inner: SpinLock::new(InnerPs2MouseDriver { 85a381e482SR0ronoa ktype: None, 86a381e482SR0ronoa kset: None, 87a381e482SR0ronoa parent: None, 88a381e482SR0ronoa kernfs_inode: None, 89a381e482SR0ronoa devices: Vec::new(), 90a381e482SR0ronoa bus: None, 91a381e482SR0ronoa self_ref: Weak::new(), 92a381e482SR0ronoa }), 93a381e482SR0ronoa kobj_state: LockedKObjectState::new(None), 94a381e482SR0ronoa }); 95a381e482SR0ronoa 96a381e482SR0ronoa r.inner.lock().self_ref = Arc::downgrade(&r); 97a381e482SR0ronoa return r; 98a381e482SR0ronoa } 99a381e482SR0ronoa 100a381e482SR0ronoa #[allow(dead_code)] 101a381e482SR0ronoa pub fn process_packet(&self) { 102a381e482SR0ronoa let guard = self.inner.lock(); 103a381e482SR0ronoa if guard.devices.is_empty() { 104a381e482SR0ronoa return; 105a381e482SR0ronoa } 106a381e482SR0ronoa 107a381e482SR0ronoa let device: Option<&Ps2MouseDevice> = guard.devices[0] 108a381e482SR0ronoa .as_any_ref() 109a381e482SR0ronoa .downcast_ref::<Ps2MouseDevice>(); 110a381e482SR0ronoa let _ = device.unwrap().process_packet(); 111a381e482SR0ronoa } 112a381e482SR0ronoa } 113a381e482SR0ronoa 114a381e482SR0ronoa #[derive(Debug)] 115a381e482SR0ronoa pub struct InnerPs2MouseDriver { 116a381e482SR0ronoa ktype: Option<&'static dyn KObjType>, 117a381e482SR0ronoa kset: Option<Arc<KSet>>, 118a381e482SR0ronoa parent: Option<Weak<dyn KObject>>, 119a381e482SR0ronoa kernfs_inode: Option<Arc<KernFSInode>>, 120a381e482SR0ronoa devices: Vec<Arc<dyn Device>>, 121a381e482SR0ronoa bus: Option<Weak<dyn Bus>>, 122a381e482SR0ronoa self_ref: Weak<Ps2MouseDriver>, 123a381e482SR0ronoa } 124a381e482SR0ronoa 125a381e482SR0ronoa impl Driver for Ps2MouseDriver { 126a381e482SR0ronoa fn id_table(&self) -> Option<IdTable> { 127a381e482SR0ronoa Some(IdTable::new("psmouse".to_string(), None)) 128a381e482SR0ronoa } 129a381e482SR0ronoa 130a381e482SR0ronoa fn devices(&self) -> alloc::vec::Vec<Arc<dyn Device>> { 131a381e482SR0ronoa self.inner.lock().devices.clone() 132a381e482SR0ronoa } 133a381e482SR0ronoa 134a381e482SR0ronoa fn add_device(&self, device: Arc<dyn Device>) { 135a381e482SR0ronoa let mut guard = self.inner.lock(); 136a381e482SR0ronoa // check if the device is already in the list 137a381e482SR0ronoa if guard.devices.iter().any(|dev| Arc::ptr_eq(dev, &device)) { 138a381e482SR0ronoa return; 139a381e482SR0ronoa } 140a381e482SR0ronoa 141a381e482SR0ronoa guard.devices.push(device); 142a381e482SR0ronoa } 143a381e482SR0ronoa 144a381e482SR0ronoa fn delete_device(&self, device: &Arc<dyn Device>) { 145a381e482SR0ronoa let mut guard = self.inner.lock(); 146a381e482SR0ronoa guard.devices.retain(|dev| !Arc::ptr_eq(dev, device)); 147a381e482SR0ronoa } 148a381e482SR0ronoa 149a381e482SR0ronoa fn set_bus(&self, bus: Option<alloc::sync::Weak<dyn Bus>>) { 150a381e482SR0ronoa self.inner.lock().bus = bus; 151a381e482SR0ronoa } 152a381e482SR0ronoa 153a381e482SR0ronoa fn bus(&self) -> Option<Weak<dyn Bus>> { 154a381e482SR0ronoa self.inner.lock().bus.clone() 155a381e482SR0ronoa } 156a381e482SR0ronoa } 157a381e482SR0ronoa 158a381e482SR0ronoa impl KObject for Ps2MouseDriver { 159a381e482SR0ronoa fn as_any_ref(&self) -> &dyn core::any::Any { 160a381e482SR0ronoa self 161a381e482SR0ronoa } 162a381e482SR0ronoa 163a381e482SR0ronoa fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 164a381e482SR0ronoa self.inner.lock().kernfs_inode = inode; 165a381e482SR0ronoa } 166a381e482SR0ronoa 167a381e482SR0ronoa fn inode(&self) -> Option<Arc<KernFSInode>> { 168a381e482SR0ronoa self.inner.lock().kernfs_inode.clone() 169a381e482SR0ronoa } 170a381e482SR0ronoa 171a381e482SR0ronoa fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> { 172a381e482SR0ronoa self.inner.lock().parent.clone() 173a381e482SR0ronoa } 174a381e482SR0ronoa 175a381e482SR0ronoa fn set_parent(&self, parent: Option<alloc::sync::Weak<dyn KObject>>) { 176a381e482SR0ronoa self.inner.lock().parent = parent; 177a381e482SR0ronoa } 178a381e482SR0ronoa 179a381e482SR0ronoa fn kset(&self) -> Option<Arc<KSet>> { 180a381e482SR0ronoa self.inner.lock().kset.clone() 181a381e482SR0ronoa } 182a381e482SR0ronoa 183a381e482SR0ronoa fn set_kset(&self, kset: Option<Arc<KSet>>) { 184a381e482SR0ronoa self.inner.lock().kset = kset; 185a381e482SR0ronoa } 186a381e482SR0ronoa 187a381e482SR0ronoa fn kobj_type(&self) -> Option<&'static dyn KObjType> { 188a381e482SR0ronoa self.inner.lock().ktype 189a381e482SR0ronoa } 190a381e482SR0ronoa 191a381e482SR0ronoa fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 192a381e482SR0ronoa self.inner.lock().ktype = ktype; 193a381e482SR0ronoa } 194a381e482SR0ronoa 195a381e482SR0ronoa fn name(&self) -> alloc::string::String { 196a381e482SR0ronoa Self::NAME.to_string() 197a381e482SR0ronoa } 198a381e482SR0ronoa 199a381e482SR0ronoa fn set_name(&self, _name: alloc::string::String) {} 200a381e482SR0ronoa 201a381e482SR0ronoa fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 202a381e482SR0ronoa self.kobj_state.read() 203a381e482SR0ronoa } 204a381e482SR0ronoa 205a381e482SR0ronoa fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 206a381e482SR0ronoa self.kobj_state.write() 207a381e482SR0ronoa } 208a381e482SR0ronoa 209a381e482SR0ronoa fn set_kobj_state(&self, state: KObjectState) { 210a381e482SR0ronoa *self.kobj_state.write() = state; 211a381e482SR0ronoa } 212a381e482SR0ronoa } 213a381e482SR0ronoa 214a381e482SR0ronoa impl SerioDriver for Ps2MouseDriver { 215a381e482SR0ronoa fn write_wakeup( 216a381e482SR0ronoa &self, 217a381e482SR0ronoa _device: &Arc<dyn SerioDevice>, 218a381e482SR0ronoa ) -> Result<(), system_error::SystemError> { 219a381e482SR0ronoa todo!() 220a381e482SR0ronoa } 221a381e482SR0ronoa 222a381e482SR0ronoa fn interrupt( 223a381e482SR0ronoa &self, 224a381e482SR0ronoa device: &Arc<dyn SerioDevice>, 225a381e482SR0ronoa _char: u8, 226a381e482SR0ronoa _int: u8, 227a381e482SR0ronoa ) -> Result<(), system_error::SystemError> { 228a381e482SR0ronoa let device = device 229a381e482SR0ronoa .clone() 230a381e482SR0ronoa .arc_any() 231a381e482SR0ronoa .downcast::<Ps2MouseDevice>() 232a381e482SR0ronoa .map_err(|_| SystemError::EINVAL)?; 233a381e482SR0ronoa device.process_packet()?; 234a381e482SR0ronoa Ok(()) 235a381e482SR0ronoa } 236a381e482SR0ronoa 237a381e482SR0ronoa fn connect(&self, device: &Arc<dyn SerioDevice>) -> Result<(), system_error::SystemError> { 238a381e482SR0ronoa let device = device 239a381e482SR0ronoa .clone() 240a381e482SR0ronoa .arc_any() 241a381e482SR0ronoa .downcast::<Ps2MouseDevice>() 242a381e482SR0ronoa .map_err(|_| SystemError::EINVAL)?; 243a381e482SR0ronoa 244a381e482SR0ronoa device.set_driver(Some(self.inner.lock_irqsave().self_ref.clone())); 245a381e482SR0ronoa 246a381e482SR0ronoa device.init()?; 247*e2841179SLoGin irq_manager().request_irq( 248*e2841179SLoGin PS2_MOUSE_IRQ_NUM, 249*e2841179SLoGin "psmouse".to_string(), 250*e2841179SLoGin &Ps2MouseIrqHandler, 251*e2841179SLoGin IrqHandleFlags::IRQF_SHARED | IrqHandleFlags::IRQF_TRIGGER_RISING, 252*e2841179SLoGin Some(DeviceId::new(Some(Self::NAME), None).unwrap()), 253*e2841179SLoGin )?; 254a381e482SR0ronoa return Ok(()); 255a381e482SR0ronoa } 256a381e482SR0ronoa 257a381e482SR0ronoa fn reconnect(&self, _device: &Arc<dyn SerioDevice>) -> Result<(), system_error::SystemError> { 258a381e482SR0ronoa todo!() 259a381e482SR0ronoa } 260a381e482SR0ronoa 261a381e482SR0ronoa fn fast_reconnect( 262a381e482SR0ronoa &self, 263a381e482SR0ronoa _device: &Arc<dyn SerioDevice>, 264a381e482SR0ronoa ) -> Result<(), system_error::SystemError> { 265a381e482SR0ronoa todo!() 266a381e482SR0ronoa } 267a381e482SR0ronoa 268a381e482SR0ronoa fn disconnect(&self, _device: &Arc<dyn SerioDevice>) -> Result<(), system_error::SystemError> { 269a381e482SR0ronoa todo!() 270a381e482SR0ronoa } 271a381e482SR0ronoa 272a381e482SR0ronoa fn cleanup(&self, _device: &Arc<dyn SerioDevice>) -> Result<(), system_error::SystemError> { 273a381e482SR0ronoa todo!() 274a381e482SR0ronoa } 275a381e482SR0ronoa } 276a381e482SR0ronoa 277a381e482SR0ronoa #[unified_init(INITCALL_DEVICE)] 278a381e482SR0ronoa fn ps2_mouse_driver_init() -> Result<(), SystemError> { 279a381e482SR0ronoa kdebug!("Ps2_mouse_drive initing..."); 280a381e482SR0ronoa let driver = Ps2MouseDriver::new(); 281a381e482SR0ronoa serio_driver_manager().register(driver.clone())?; 282a381e482SR0ronoa unsafe { PS2_MOUSE_DRIVER = Some(driver) }; 283a381e482SR0ronoa return Ok(()); 284a381e482SR0ronoa } 285