xref: /DragonOS/kernel/src/driver/input/serio/i8042/mod.rs (revision 28fe4ad2a0b0d8b5abf1f0cb402b1c3204b42242)
19993c0fcSR0ronoa use alloc::sync::Arc;
22eab6dd7S曾俊 use log::debug;
39993c0fcSR0ronoa use system_error::SystemError;
49993c0fcSR0ronoa use unified_init::macros::unified_init;
59993c0fcSR0ronoa 
69993c0fcSR0ronoa use crate::{
79621ab16SLoGin     driver::base::{
89993c0fcSR0ronoa         device::{device_manager, Device},
99993c0fcSR0ronoa         platform::{
109993c0fcSR0ronoa             platform_device::{platform_device_manager, PlatformDevice},
119993c0fcSR0ronoa             platform_driver::{platform_driver_manager, PlatformDriver},
129993c0fcSR0ronoa         },
139993c0fcSR0ronoa     },
149993c0fcSR0ronoa     init::initcall::INITCALL_DEVICE,
159993c0fcSR0ronoa };
169993c0fcSR0ronoa 
179993c0fcSR0ronoa use self::{
189993c0fcSR0ronoa     i8042_device::I8042PlatformDevice, i8042_driver::I8042Driver, i8042_ports::I8042AuxPort,
199993c0fcSR0ronoa };
209993c0fcSR0ronoa 
219993c0fcSR0ronoa use super::serio_device::{serio_device_manager, SerioDevice};
229993c0fcSR0ronoa 
239993c0fcSR0ronoa pub mod i8042_device;
249993c0fcSR0ronoa pub mod i8042_driver;
259993c0fcSR0ronoa pub mod i8042_ports;
269993c0fcSR0ronoa 
279993c0fcSR0ronoa static mut I8042_PLATFORM_DEVICE: Option<Arc<I8042PlatformDevice>> = None;
289993c0fcSR0ronoa 
i8042_platform_device() -> Arc<I8042PlatformDevice>299993c0fcSR0ronoa pub fn i8042_platform_device() -> Arc<I8042PlatformDevice> {
309993c0fcSR0ronoa     unsafe { I8042_PLATFORM_DEVICE.clone().unwrap() }
319993c0fcSR0ronoa }
329993c0fcSR0ronoa 
339993c0fcSR0ronoa // TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#1612
349993c0fcSR0ronoa #[unified_init(INITCALL_DEVICE)]
i8042_init() -> Result<(), SystemError>359993c0fcSR0ronoa pub fn i8042_init() -> Result<(), SystemError> {
362eab6dd7S曾俊     debug!("i8042 initializing...");
379993c0fcSR0ronoa     let i8042_device = Arc::new(I8042PlatformDevice::new());
389993c0fcSR0ronoa     device_manager().device_default_initialize(&(i8042_device.clone() as Arc<dyn Device>));
399993c0fcSR0ronoa     platform_device_manager().device_add(i8042_device.clone() as Arc<dyn PlatformDevice>)?;
409993c0fcSR0ronoa     unsafe {
419993c0fcSR0ronoa         I8042_PLATFORM_DEVICE = Some(i8042_device);
429993c0fcSR0ronoa     }
439993c0fcSR0ronoa 
449993c0fcSR0ronoa     let i8042_driver = I8042Driver::new();
459993c0fcSR0ronoa     platform_driver_manager().register(i8042_driver.clone() as Arc<dyn PlatformDriver>)?;
469993c0fcSR0ronoa     Ok(())
479993c0fcSR0ronoa }
489993c0fcSR0ronoa 
49bd70d2d1SLoGin /// TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#441
50bd70d2d1SLoGin #[allow(dead_code)]
i8042_start(_serio: &Arc<dyn SerioDevice>) -> Result<(), SystemError>519993c0fcSR0ronoa pub fn i8042_start(_serio: &Arc<dyn SerioDevice>) -> Result<(), SystemError> {
52bd70d2d1SLoGin     todo!("i8042_start")
539993c0fcSR0ronoa }
549993c0fcSR0ronoa 
55bd70d2d1SLoGin /// TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#471
56bd70d2d1SLoGin #[allow(dead_code)]
i8042_stop(_serio: &Arc<dyn SerioDevice>) -> Result<(), SystemError>579993c0fcSR0ronoa pub fn i8042_stop(_serio: &Arc<dyn SerioDevice>) -> Result<(), SystemError> {
58bd70d2d1SLoGin     todo!("i8042_stop")
599993c0fcSR0ronoa }
609993c0fcSR0ronoa 
619993c0fcSR0ronoa /// # 函数的功能
629993c0fcSR0ronoa /// 创建i8042 Aux设备
639993c0fcSR0ronoa ///
649993c0fcSR0ronoa /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#i8042_setup_aux
i8042_setup_aux() -> Result<(), SystemError>659993c0fcSR0ronoa pub fn i8042_setup_aux() -> Result<(), SystemError> {
669993c0fcSR0ronoa     let aux_port = Arc::new(I8042AuxPort::new());
67*28fe4ad2S黄铭涛     aux_port.set_dev_parent(Some(Arc::downgrade(
68*28fe4ad2S黄铭涛         &(i8042_platform_device() as Arc<dyn Device>),
699993c0fcSR0ronoa     )));
709993c0fcSR0ronoa     serio_device_manager().register_port(aux_port.clone() as Arc<dyn SerioDevice>)?;
719993c0fcSR0ronoa 
729621ab16SLoGin     #[cfg(target_arch = "x86_64")]
739621ab16SLoGin     crate::driver::input::ps2_mouse::ps_mouse_device::rs_ps2_mouse_device_init(
74*28fe4ad2S黄铭涛         aux_port.clone() as Arc<dyn Device>
759621ab16SLoGin     )?;
769993c0fcSR0ronoa     Ok(())
779993c0fcSR0ronoa }
78