serio_driver.rs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. use alloc::sync::Arc;
  2. use system_error::SystemError;
  3. use crate::driver::base::device::{
  4. bus::Bus,
  5. driver::{driver_manager, Driver},
  6. };
  7. use super::{serio_bus, serio_device::SerioDevice};
  8. /// 实现该trait的设备驱动实例应挂载在serio总线上,同时应该实现Driver trait
  9. ///
  10. /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#67
  11. pub trait SerioDriver: Driver {
  12. // 写入时唤醒设备
  13. fn write_wakeup(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>;
  14. /// # 函数功能
  15. /// 中断函数
  16. ///
  17. /// ## 参数
  18. /// - device: Serio设备
  19. /// - data: 端口数据
  20. /// - flag: 状态掩码
  21. ///
  22. /// ## 返回值
  23. /// 无
  24. ///
  25. /// todo:https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c?fi=__serio_register_driver#989
  26. fn interrupt(
  27. &self,
  28. device: &Arc<dyn SerioDevice>,
  29. data: u8,
  30. flag: u8,
  31. ) -> Result<(), SystemError>;
  32. /// Serio驱动连接设备
  33. fn connect(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>;
  34. /// 重新连接设备
  35. fn reconnect(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>;
  36. /// 快速重连设备
  37. fn fast_reconnect(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>;
  38. /// 驱动断开设备
  39. fn disconnect(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>;
  40. /// 清除设备状态
  41. fn cleanup(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>;
  42. }
  43. ///todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#810
  44. #[inline(always)]
  45. pub fn serio_driver_manager() -> &'static SerioDriverManager {
  46. &SerioDriverManager
  47. }
  48. pub struct SerioDriverManager;
  49. #[allow(dead_code)]
  50. impl SerioDriverManager {
  51. /// # 函数功能
  52. /// 注册Serio驱动
  53. ///
  54. /// ## 参数
  55. /// - driver 待注册的Serio驱动
  56. ///
  57. /// ## 返回值
  58. /// 无
  59. pub fn register(&self, driver: Arc<dyn SerioDriver>) -> Result<(), SystemError> {
  60. driver.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc<dyn Bus>))));
  61. return driver_manager().register(driver as Arc<dyn Driver>);
  62. }
  63. /// # 函数功能
  64. /// 卸载Serio驱动
  65. ///
  66. /// ## 参数
  67. /// - driver 待卸载的Serio驱动
  68. ///
  69. /// ## 返回值
  70. /// 无
  71. #[allow(dead_code)]
  72. pub fn unregister(&self, driver: &Arc<dyn SerioDriver>) {
  73. driver_manager().unregister(&(driver.clone() as Arc<dyn Driver>));
  74. }
  75. }