xref: /DragonOS/kernel/src/driver/input/ps2_mouse/ps_mouse_driver.rs (revision e28411791f090c421fe4b6fa5956fb1bd362a8d9)
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