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