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