1 use alloc::sync::Arc;
2 use system_error::SystemError;
3 use unified_init::macros::unified_init;
4
5 use crate::{
6 driver::{
7 base::{
8 device::{device_manager, Device},
9 kobject::KObject,
10 platform::{
11 platform_device::{platform_device_manager, PlatformDevice},
12 platform_driver::{platform_driver_manager, PlatformDriver},
13 },
14 },
15 input::ps2_mouse::ps_mouse_device::rs_ps2_mouse_device_init,
16 },
17 init::initcall::INITCALL_DEVICE,
18 };
19
20 use self::{
21 i8042_device::I8042PlatformDevice, i8042_driver::I8042Driver, i8042_ports::I8042AuxPort,
22 };
23
24 use super::serio_device::{serio_device_manager, SerioDevice};
25
26 pub mod i8042_device;
27 pub mod i8042_driver;
28 pub mod i8042_ports;
29
30 static mut I8042_PLATFORM_DEVICE: Option<Arc<I8042PlatformDevice>> = None;
31
i8042_platform_device() -> Arc<I8042PlatformDevice>32 pub fn i8042_platform_device() -> Arc<I8042PlatformDevice> {
33 unsafe { I8042_PLATFORM_DEVICE.clone().unwrap() }
34 }
35
36 // TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#1612
37 #[unified_init(INITCALL_DEVICE)]
i8042_init() -> Result<(), SystemError>38 pub fn i8042_init() -> Result<(), SystemError> {
39 kdebug!("i8042 initializing...");
40 let i8042_device = Arc::new(I8042PlatformDevice::new());
41 device_manager().device_default_initialize(&(i8042_device.clone() as Arc<dyn Device>));
42 platform_device_manager().device_add(i8042_device.clone() as Arc<dyn PlatformDevice>)?;
43 unsafe {
44 I8042_PLATFORM_DEVICE = Some(i8042_device);
45 }
46
47 let i8042_driver = I8042Driver::new();
48 platform_driver_manager().register(i8042_driver.clone() as Arc<dyn PlatformDriver>)?;
49 Ok(())
50 }
51
52 // TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#441
i8042_start(_serio: &Arc<dyn SerioDevice>) -> Result<(), SystemError>53 pub fn i8042_start(_serio: &Arc<dyn SerioDevice>) -> Result<(), SystemError> {
54 todo!()
55 }
56
57 // TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#471
i8042_stop(_serio: &Arc<dyn SerioDevice>) -> Result<(), SystemError>58 pub fn i8042_stop(_serio: &Arc<dyn SerioDevice>) -> Result<(), SystemError> {
59 todo!()
60 }
61
62 /// # 函数的功能
63 /// 创建i8042 Aux设备
64 ///
65 /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#i8042_setup_aux
i8042_setup_aux() -> Result<(), SystemError>66 pub fn i8042_setup_aux() -> Result<(), SystemError> {
67 let aux_port = Arc::new(I8042AuxPort::new());
68 aux_port.set_parent(Some(Arc::downgrade(
69 &(i8042_platform_device() as Arc<dyn KObject>),
70 )));
71 serio_device_manager().register_port(aux_port.clone() as Arc<dyn SerioDevice>)?;
72
73 rs_ps2_mouse_device_init(aux_port.clone() as Arc<dyn KObject>)?;
74 Ok(())
75 }
76