mod.rs 2.5 KB

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