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