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