1 use alloc::sync::Arc;
2 use system_error::SystemError;
3
4 use crate::driver::base::device::{bus::Bus, device_manager, Device};
5
6 use super::serio_bus;
7
8 /// 串行设备,实现该trait的设备实例挂载在serio总线上,同时应该实现Device trait
9 ///
10 /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#20
11 #[allow(dead_code)]
12 pub trait SerioDevice: Device {
13 /// # 函数功能
14 ///
15 /// Serio设备写入数据
16 ///
17 /// ## 参数
18 ///
19 /// - data 写入的数据
20 ///
21 /// ## 返回值
22 ///
23 /// 无
write(&self, device: &Arc<dyn SerioDevice>, data: u8) -> Result<(), SystemError>24 fn write(&self, device: &Arc<dyn SerioDevice>, data: u8) -> Result<(), SystemError>;
25 /// Serio设备连接驱动时调用
open(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>26 fn open(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>;
27 /// Serio设备断开驱动时调用
close(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>28 fn close(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>;
29 /// Serio设备初始化时调用
start(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>30 fn start(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>;
31 /// Serio设备销毁时调用
stop(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>32 fn stop(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>;
33 }
34
35 #[inline(always)]
serio_device_manager() -> &'static SerioDeviceManager36 pub fn serio_device_manager() -> &'static SerioDeviceManager {
37 &SerioDeviceManager
38 }
39
40 pub struct SerioDeviceManager;
41
42 impl SerioDeviceManager {
43 /// # 函数功能
44 /// 注册Serio设备
45 ///
46 /// ## 参数
47 /// - device 待注册的设备
48 ///
49 /// ## 返回值
50 /// 无
register_port(&self, device: Arc<dyn SerioDevice>) -> Result<(), SystemError>51 pub fn register_port(&self, device: Arc<dyn SerioDevice>) -> Result<(), SystemError> {
52 self.init_port(device)
53 }
54
55 /// # 函数功能
56 /// 初始化Serio设备
57 ///
58 /// ## 参数
59 /// - device 待初始化的Serio设备
60 ///
61 /// ## 返回值
62 /// 无
63 ///
64 /// todo:https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#494
init_port(&self, device: Arc<dyn SerioDevice>) -> Result<(), SystemError>65 pub fn init_port(&self, device: Arc<dyn SerioDevice>) -> Result<(), SystemError> {
66 device.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc<dyn Bus>))));
67 device_manager().add_device(device.clone() as Arc<dyn Device>)?;
68 Ok(())
69 }
70 }
71