From 523df0f5da749e3058d49506bc7b1191f9e8ea77 Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Wed, 3 Jan 2024 20:28:05 +0800 Subject: [PATCH 01/11] =?UTF-8?q?=E6=96=B0=E5=A2=9Eserio=E6=80=BB=E7=BA=BF?= =?UTF-8?q?=E5=92=8C=E7=9B=B8=E5=85=B3trait?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/driver/base/init.rs | 3 +- kernel/src/driver/input/mod.rs | 2 + kernel/src/driver/input/ps2_dev/mod.rs | 1 + kernel/src/driver/input/ps2_dev/ps2_device.rs | 8 ++ kernel/src/driver/input/serio/mod.rs | 32 +++++ kernel/src/driver/input/serio/serio_device.rs | 14 ++ kernel/src/driver/input/serio/serio_driver.rs | 20 +++ kernel/src/driver/input/serio/subsys.rs | 125 ++++++++++++++++++ kernel/src/driver/mod.rs | 1 + 9 files changed, 205 insertions(+), 1 deletion(-) create mode 100644 kernel/src/driver/input/mod.rs create mode 100644 kernel/src/driver/input/ps2_dev/mod.rs create mode 100644 kernel/src/driver/input/ps2_dev/ps2_device.rs create mode 100644 kernel/src/driver/input/serio/mod.rs create mode 100644 kernel/src/driver/input/serio/serio_device.rs create mode 100644 kernel/src/driver/input/serio/serio_driver.rs create mode 100644 kernel/src/driver/input/serio/subsys.rs diff --git a/kernel/src/driver/base/init.rs b/kernel/src/driver/base/init.rs index ac95cb6be..3b1e8eb62 100644 --- a/kernel/src/driver/base/init.rs +++ b/kernel/src/driver/base/init.rs @@ -1,4 +1,4 @@ -use crate::driver::tty::tty_device::tty_init; +use crate::driver::{tty::tty_device::tty_init, input::serio::serio_bus_init}; use system_error::SystemError; use unified_init::{define_public_unified_initializer_slice, unified_init}; @@ -20,6 +20,7 @@ pub(super) fn driver_init() -> Result<(), SystemError> { firmware_init()?; hypervisor_init()?; platform_bus_init()?; + serio_bus_init()?; cpu_device_manager().init()?; subsystem_init()?; // 至此,已完成设备驱动模型的初始化 diff --git a/kernel/src/driver/input/mod.rs b/kernel/src/driver/input/mod.rs new file mode 100644 index 000000000..6f9a93303 --- /dev/null +++ b/kernel/src/driver/input/mod.rs @@ -0,0 +1,2 @@ +pub mod serio; +pub mod ps2_dev; \ No newline at end of file diff --git a/kernel/src/driver/input/ps2_dev/mod.rs b/kernel/src/driver/input/ps2_dev/mod.rs new file mode 100644 index 000000000..3e656df9f --- /dev/null +++ b/kernel/src/driver/input/ps2_dev/mod.rs @@ -0,0 +1 @@ +pub mod ps2_device; \ No newline at end of file diff --git a/kernel/src/driver/input/ps2_dev/ps2_device.rs b/kernel/src/driver/input/ps2_dev/ps2_device.rs new file mode 100644 index 000000000..8da46fded --- /dev/null +++ b/kernel/src/driver/input/ps2_dev/ps2_device.rs @@ -0,0 +1,8 @@ +use crate::driver::{base::device::Device, input::serio::serio_device::SerioDevice}; + + + +// todo: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/libps2.h#33 +pub trait Ps2Device : Device + SerioDevice { + +} \ No newline at end of file diff --git a/kernel/src/driver/input/serio/mod.rs b/kernel/src/driver/input/serio/mod.rs new file mode 100644 index 000000000..809483d30 --- /dev/null +++ b/kernel/src/driver/input/serio/mod.rs @@ -0,0 +1,32 @@ +use alloc::sync::Arc; +use system_error::SystemError; + +use crate::driver::base::device::bus::{bus_register, Bus}; + +use self::subsys::SerioBus; + +pub mod serio_device; +pub mod serio_driver; +pub mod subsys; + + +static mut SERIO_BUS: Option> = None; + +#[allow(dead_code)] +#[inline(always)] +pub fn serio_bus() -> Arc { + unsafe { + SERIO_BUS.clone().unwrap() + } +} + +/// @brief: 初始化serio总线 +/// +/// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#1024 +pub fn serio_bus_init() -> Result<(), SystemError> { + let serio_bus = SerioBus::new(); + let r = bus_register(serio_bus.clone() as Arc); + unsafe { SERIO_BUS = Some(serio_bus) }; + + return r; +} diff --git a/kernel/src/driver/input/serio/serio_device.rs b/kernel/src/driver/input/serio/serio_device.rs new file mode 100644 index 000000000..dcf18625c --- /dev/null +++ b/kernel/src/driver/input/serio/serio_device.rs @@ -0,0 +1,14 @@ +use alloc::sync::Arc; +use system_error::SystemError; + +use crate::driver::base::device::Device; + + +/// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#20 +pub trait SerioDevice: Device { + fn write(&self, device: & Arc, data: u8) -> Result<(), SystemError>; + fn open(&self, device: & Arc) -> Result<(), SystemError>; + fn close(&self, device: & Arc) -> Result<(), SystemError>; + fn start(&self, device: & Arc) -> Result<(), SystemError>; + fn stop(&self, device: & Arc) -> Result<(), SystemError>; +} \ No newline at end of file diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs new file mode 100644 index 000000000..54d0cd6c4 --- /dev/null +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -0,0 +1,20 @@ +use alloc::sync::Arc; +use system_error::SystemError; + +use crate::driver::base::device::driver::Driver; + +use super::serio_device::SerioDevice; + +/// @brief: 实现该trait的设备驱动实例应挂载在serio总线上, +/// 同时应该实现Driver trait +/// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#67 +pub trait SerioDriver: Driver { + + fn write_wakeup(&self, device: &Arc) -> Result<(), SystemError>; + fn interrupt(&self, device: &Arc, char: u8, int: u8) -> Result<(), SystemError>; + fn connect(&self, device: &Arc) -> Result<(), SystemError>; + fn reconnect(&self, device: &Arc) -> Result<(), SystemError>; + fn fast_reconnect(&self, device: &Arc) -> Result<(), SystemError>; + fn disconnect(&self, device: &Arc) -> Result<(), SystemError>; + fn cleanup(&self, device: &Arc) -> Result<(), SystemError>; +} \ No newline at end of file diff --git a/kernel/src/driver/input/serio/subsys.rs b/kernel/src/driver/input/serio/subsys.rs new file mode 100644 index 000000000..a233cf5c5 --- /dev/null +++ b/kernel/src/driver/input/serio/subsys.rs @@ -0,0 +1,125 @@ +use alloc::{sync::{Arc, Weak}, string::{ToString, String}}; +use intertrait::cast::CastArc; +use system_error::SystemError; + +use crate::{driver::{base::{subsys::SubSysPrivate, device::{bus::Bus, Device, driver::Driver}, kobject::KObject}, acpi::acpi_manager}, filesystem::{sysfs::{AttributeGroup, Attribute}, vfs::syscall::ModeType}}; + +use super::{serio_device::SerioDevice, serio_driver::SerioDriver}; + + + + +#[derive(Debug)] +pub struct SerioBus { + private: SubSysPrivate, +} + +impl SerioBus { + pub fn new() -> Arc { + let w: Weak = Weak::new(); + let private = SubSysPrivate::new("serio".to_string(), Some(w), None, &[]); + let bus = Arc::new(Self { private }); + bus.subsystem() + .set_bus(Some(Arc::downgrade(&(bus.clone() as Arc)))); + + return bus; + } +} + +impl Bus for SerioBus { + + fn name(&self) -> String { + return "serio".to_string(); + } + + fn dev_name(&self) -> String { + return self.name(); + } + + fn dev_groups(&self) -> &'static [&'static dyn AttributeGroup] { + return &[&SerioDeviceAttrGroup]; + } + + fn subsystem(&self) -> &SubSysPrivate { + return &self.private; + } + + fn probe(&self, device: &Arc) -> Result<(), SystemError> { + let drv = device.driver().ok_or(SystemError::EINVAL)?; + let pdrv = drv.cast::().map_err(|_|{ + kerror!("SerioBus::probe() failed: device.driver() is not a SerioDriver. Device: '{:?}'", device.name()); + SystemError::EINVAL + })?; + + let pdev = device.clone().cast::().map_err(|_| { + kerror!( + "SerioBus::probe() failed: device is not a SerioDevice. Device: '{:?}'", + device.name() + ); + SystemError::EINVAL + })?; + + return pdrv.connect(&pdev); + } + + fn remove(&self, _device: &Arc) -> Result<(), SystemError> { + todo!() + } + + fn sync_state(&self, _device: &Arc) { + todo!() + } + + fn shutdown(&self, _device: &Arc) { + todo!() + } + + fn resume(&self, _device: &Arc) -> Result<(), SystemError> { + todo!() + } + + fn match_device( + &self, + device: &Arc, + driver: &Arc, + ) -> Result { + // 尝试从 ACPI 中匹配 + if let Ok(x) = acpi_manager().driver_match_device(driver, device) { + if x { + return Ok(true); + } + } + + // 尝试从 ID table 中匹配 + if let Some(drv_id_table) = driver.id_table() { + let pdev = device + .clone() + .cast::() + .map_err(|_| SystemError::EINVAL)?; + if drv_id_table.name().eq(&pdev.name()) { + return Ok(true); + } + } + + // 尝试根据设备名称匹配 + return Ok(device.name().eq(&driver.name())); + } +} + +#[derive(Debug)] +pub struct SerioDeviceAttrGroup; + +impl AttributeGroup for SerioDeviceAttrGroup { + fn name(&self) -> Option<&str> { + None + } + + // todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#473 + fn attrs(&self) -> &[&'static dyn Attribute] { + return &[]; + } + + fn is_visible(&self, _kobj: Arc, attr: &dyn Attribute) -> Option { + None + } +} \ No newline at end of file diff --git a/kernel/src/driver/mod.rs b/kernel/src/driver/mod.rs index ee5767ac1..1044a8994 100644 --- a/kernel/src/driver/mod.rs +++ b/kernel/src/driver/mod.rs @@ -8,3 +8,4 @@ pub mod timers; pub mod tty; pub mod video; pub mod virtio; +pub mod input; \ No newline at end of file From adde819f5835c89d46e9ccd357ff6a1b4db8353e Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Wed, 3 Jan 2024 23:03:04 +0800 Subject: [PATCH 02/11] =?UTF-8?q?=E8=A1=A5=E5=85=85SerioDeviceManager?= =?UTF-8?q?=E5=92=8CSerioDriverManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/driver/input/serio/serio_device.rs | 25 +++++++++++++++++-- kernel/src/driver/input/serio/serio_driver.rs | 21 ++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/kernel/src/driver/input/serio/serio_device.rs b/kernel/src/driver/input/serio/serio_device.rs index dcf18625c..8d2a6df16 100644 --- a/kernel/src/driver/input/serio/serio_device.rs +++ b/kernel/src/driver/input/serio/serio_device.rs @@ -1,7 +1,9 @@ use alloc::sync::Arc; use system_error::SystemError; -use crate::driver::base::device::Device; +use crate::driver::base::device::{Device, bus::Bus}; + +use super::serio_bus; /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#20 @@ -11,4 +13,23 @@ pub trait SerioDevice: Device { fn close(&self, device: & Arc) -> Result<(), SystemError>; fn start(&self, device: & Arc) -> Result<(), SystemError>; fn stop(&self, device: & Arc) -> Result<(), SystemError>; -} \ No newline at end of file +} + +#[inline(always)] +pub fn serio_device_manager() -> &'static SerioDeviceManager { + &SerioDeviceManager +} + +pub struct SerioDeviceManager; + +impl SerioDeviceManager { + pub fn register_port(&self, device: Arc) -> Result<(), SystemError> { + self.init_port(device) + } + + //todo:https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#494 + pub fn init_port(&self, device: Arc) -> Result<(), SystemError> { + device.set_bus(Some(serio_bus() as Arc)); + Ok(()) + } +} \ No newline at end of file diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs index 54d0cd6c4..726b58add 100644 --- a/kernel/src/driver/input/serio/serio_driver.rs +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -1,9 +1,9 @@ use alloc::sync::Arc; use system_error::SystemError; -use crate::driver::base::device::driver::Driver; +use crate::driver::base::device::{driver::{Driver, driver_manager}, bus::Bus}; -use super::serio_device::SerioDevice; +use super::{serio_device::SerioDevice, serio_bus}; /// @brief: 实现该trait的设备驱动实例应挂载在serio总线上, /// 同时应该实现Driver trait @@ -17,4 +17,21 @@ pub trait SerioDriver: Driver { fn fast_reconnect(&self, device: &Arc) -> Result<(), SystemError>; fn disconnect(&self, device: &Arc) -> Result<(), SystemError>; fn cleanup(&self, device: &Arc) -> Result<(), SystemError>; +} + +//todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#810 + +pub struct SerioDriverManager; + +impl SerioDriverManager { + + pub fn register(&self, driver: Arc) -> Result<(), SystemError> { + driver.set_bus(Some(serio_bus() as Arc)); + return driver_manager().register(driver as Arc); + } + + #[allow(dead_code)] + pub fn unregister(&self, driver: &Arc) { + driver_manager().unregister(&(driver.clone() as Arc)); + } } \ No newline at end of file From d6482a2e1ccfe05a07461f70f74262017af58bfe Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Wed, 3 Jan 2024 20:28:05 +0800 Subject: [PATCH 03/11] =?UTF-8?q?=E6=96=B0=E5=A2=9Eserio=E6=80=BB=E7=BA=BF?= =?UTF-8?q?=E5=92=8C=E7=9B=B8=E5=85=B3trait?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/driver/base/init.rs | 2 + kernel/src/driver/input/mod.rs | 2 + kernel/src/driver/input/ps2_dev/mod.rs | 1 + kernel/src/driver/input/ps2_dev/ps2_device.rs | 8 ++ kernel/src/driver/input/serio/mod.rs | 32 +++++ kernel/src/driver/input/serio/serio_device.rs | 14 ++ kernel/src/driver/input/serio/serio_driver.rs | 20 +++ kernel/src/driver/input/serio/subsys.rs | 125 ++++++++++++++++++ kernel/src/driver/mod.rs | 1 + 9 files changed, 205 insertions(+) create mode 100644 kernel/src/driver/input/mod.rs create mode 100644 kernel/src/driver/input/ps2_dev/mod.rs create mode 100644 kernel/src/driver/input/ps2_dev/ps2_device.rs create mode 100644 kernel/src/driver/input/serio/mod.rs create mode 100644 kernel/src/driver/input/serio/serio_device.rs create mode 100644 kernel/src/driver/input/serio/serio_driver.rs create mode 100644 kernel/src/driver/input/serio/subsys.rs diff --git a/kernel/src/driver/base/init.rs b/kernel/src/driver/base/init.rs index 6629f903d..7d9649eb7 100644 --- a/kernel/src/driver/base/init.rs +++ b/kernel/src/driver/base/init.rs @@ -1,3 +1,4 @@ +use crate::driver::{tty::tty_device::tty_init, input::serio::serio_bus_init}; use system_error::SystemError; use super::{ @@ -16,6 +17,7 @@ pub(super) fn driver_init() -> Result<(), SystemError> { firmware_init()?; hypervisor_init()?; platform_bus_init()?; + serio_bus_init()?; cpu_device_manager().init()?; // 至此,已完成设备驱动模型的初始化 diff --git a/kernel/src/driver/input/mod.rs b/kernel/src/driver/input/mod.rs new file mode 100644 index 000000000..6f9a93303 --- /dev/null +++ b/kernel/src/driver/input/mod.rs @@ -0,0 +1,2 @@ +pub mod serio; +pub mod ps2_dev; \ No newline at end of file diff --git a/kernel/src/driver/input/ps2_dev/mod.rs b/kernel/src/driver/input/ps2_dev/mod.rs new file mode 100644 index 000000000..3e656df9f --- /dev/null +++ b/kernel/src/driver/input/ps2_dev/mod.rs @@ -0,0 +1 @@ +pub mod ps2_device; \ No newline at end of file diff --git a/kernel/src/driver/input/ps2_dev/ps2_device.rs b/kernel/src/driver/input/ps2_dev/ps2_device.rs new file mode 100644 index 000000000..8da46fded --- /dev/null +++ b/kernel/src/driver/input/ps2_dev/ps2_device.rs @@ -0,0 +1,8 @@ +use crate::driver::{base::device::Device, input::serio::serio_device::SerioDevice}; + + + +// todo: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/libps2.h#33 +pub trait Ps2Device : Device + SerioDevice { + +} \ No newline at end of file diff --git a/kernel/src/driver/input/serio/mod.rs b/kernel/src/driver/input/serio/mod.rs new file mode 100644 index 000000000..809483d30 --- /dev/null +++ b/kernel/src/driver/input/serio/mod.rs @@ -0,0 +1,32 @@ +use alloc::sync::Arc; +use system_error::SystemError; + +use crate::driver::base::device::bus::{bus_register, Bus}; + +use self::subsys::SerioBus; + +pub mod serio_device; +pub mod serio_driver; +pub mod subsys; + + +static mut SERIO_BUS: Option> = None; + +#[allow(dead_code)] +#[inline(always)] +pub fn serio_bus() -> Arc { + unsafe { + SERIO_BUS.clone().unwrap() + } +} + +/// @brief: 初始化serio总线 +/// +/// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#1024 +pub fn serio_bus_init() -> Result<(), SystemError> { + let serio_bus = SerioBus::new(); + let r = bus_register(serio_bus.clone() as Arc); + unsafe { SERIO_BUS = Some(serio_bus) }; + + return r; +} diff --git a/kernel/src/driver/input/serio/serio_device.rs b/kernel/src/driver/input/serio/serio_device.rs new file mode 100644 index 000000000..dcf18625c --- /dev/null +++ b/kernel/src/driver/input/serio/serio_device.rs @@ -0,0 +1,14 @@ +use alloc::sync::Arc; +use system_error::SystemError; + +use crate::driver::base::device::Device; + + +/// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#20 +pub trait SerioDevice: Device { + fn write(&self, device: & Arc, data: u8) -> Result<(), SystemError>; + fn open(&self, device: & Arc) -> Result<(), SystemError>; + fn close(&self, device: & Arc) -> Result<(), SystemError>; + fn start(&self, device: & Arc) -> Result<(), SystemError>; + fn stop(&self, device: & Arc) -> Result<(), SystemError>; +} \ No newline at end of file diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs new file mode 100644 index 000000000..54d0cd6c4 --- /dev/null +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -0,0 +1,20 @@ +use alloc::sync::Arc; +use system_error::SystemError; + +use crate::driver::base::device::driver::Driver; + +use super::serio_device::SerioDevice; + +/// @brief: 实现该trait的设备驱动实例应挂载在serio总线上, +/// 同时应该实现Driver trait +/// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#67 +pub trait SerioDriver: Driver { + + fn write_wakeup(&self, device: &Arc) -> Result<(), SystemError>; + fn interrupt(&self, device: &Arc, char: u8, int: u8) -> Result<(), SystemError>; + fn connect(&self, device: &Arc) -> Result<(), SystemError>; + fn reconnect(&self, device: &Arc) -> Result<(), SystemError>; + fn fast_reconnect(&self, device: &Arc) -> Result<(), SystemError>; + fn disconnect(&self, device: &Arc) -> Result<(), SystemError>; + fn cleanup(&self, device: &Arc) -> Result<(), SystemError>; +} \ No newline at end of file diff --git a/kernel/src/driver/input/serio/subsys.rs b/kernel/src/driver/input/serio/subsys.rs new file mode 100644 index 000000000..a233cf5c5 --- /dev/null +++ b/kernel/src/driver/input/serio/subsys.rs @@ -0,0 +1,125 @@ +use alloc::{sync::{Arc, Weak}, string::{ToString, String}}; +use intertrait::cast::CastArc; +use system_error::SystemError; + +use crate::{driver::{base::{subsys::SubSysPrivate, device::{bus::Bus, Device, driver::Driver}, kobject::KObject}, acpi::acpi_manager}, filesystem::{sysfs::{AttributeGroup, Attribute}, vfs::syscall::ModeType}}; + +use super::{serio_device::SerioDevice, serio_driver::SerioDriver}; + + + + +#[derive(Debug)] +pub struct SerioBus { + private: SubSysPrivate, +} + +impl SerioBus { + pub fn new() -> Arc { + let w: Weak = Weak::new(); + let private = SubSysPrivate::new("serio".to_string(), Some(w), None, &[]); + let bus = Arc::new(Self { private }); + bus.subsystem() + .set_bus(Some(Arc::downgrade(&(bus.clone() as Arc)))); + + return bus; + } +} + +impl Bus for SerioBus { + + fn name(&self) -> String { + return "serio".to_string(); + } + + fn dev_name(&self) -> String { + return self.name(); + } + + fn dev_groups(&self) -> &'static [&'static dyn AttributeGroup] { + return &[&SerioDeviceAttrGroup]; + } + + fn subsystem(&self) -> &SubSysPrivate { + return &self.private; + } + + fn probe(&self, device: &Arc) -> Result<(), SystemError> { + let drv = device.driver().ok_or(SystemError::EINVAL)?; + let pdrv = drv.cast::().map_err(|_|{ + kerror!("SerioBus::probe() failed: device.driver() is not a SerioDriver. Device: '{:?}'", device.name()); + SystemError::EINVAL + })?; + + let pdev = device.clone().cast::().map_err(|_| { + kerror!( + "SerioBus::probe() failed: device is not a SerioDevice. Device: '{:?}'", + device.name() + ); + SystemError::EINVAL + })?; + + return pdrv.connect(&pdev); + } + + fn remove(&self, _device: &Arc) -> Result<(), SystemError> { + todo!() + } + + fn sync_state(&self, _device: &Arc) { + todo!() + } + + fn shutdown(&self, _device: &Arc) { + todo!() + } + + fn resume(&self, _device: &Arc) -> Result<(), SystemError> { + todo!() + } + + fn match_device( + &self, + device: &Arc, + driver: &Arc, + ) -> Result { + // 尝试从 ACPI 中匹配 + if let Ok(x) = acpi_manager().driver_match_device(driver, device) { + if x { + return Ok(true); + } + } + + // 尝试从 ID table 中匹配 + if let Some(drv_id_table) = driver.id_table() { + let pdev = device + .clone() + .cast::() + .map_err(|_| SystemError::EINVAL)?; + if drv_id_table.name().eq(&pdev.name()) { + return Ok(true); + } + } + + // 尝试根据设备名称匹配 + return Ok(device.name().eq(&driver.name())); + } +} + +#[derive(Debug)] +pub struct SerioDeviceAttrGroup; + +impl AttributeGroup for SerioDeviceAttrGroup { + fn name(&self) -> Option<&str> { + None + } + + // todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#473 + fn attrs(&self) -> &[&'static dyn Attribute] { + return &[]; + } + + fn is_visible(&self, _kobj: Arc, attr: &dyn Attribute) -> Option { + None + } +} \ No newline at end of file diff --git a/kernel/src/driver/mod.rs b/kernel/src/driver/mod.rs index e506ca0e4..2db9dd529 100644 --- a/kernel/src/driver/mod.rs +++ b/kernel/src/driver/mod.rs @@ -9,3 +9,4 @@ pub mod timers; pub mod tty; pub mod video; pub mod virtio; +pub mod input; \ No newline at end of file From d7d34c640a7397e9cc5421176128a590689c332b Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Wed, 3 Jan 2024 23:03:04 +0800 Subject: [PATCH 04/11] =?UTF-8?q?=E8=A1=A5=E5=85=85SerioDeviceManager?= =?UTF-8?q?=E5=92=8CSerioDriverManager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/driver/input/serio/serio_device.rs | 25 +++++++++++++++++-- kernel/src/driver/input/serio/serio_driver.rs | 21 ++++++++++++++-- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/kernel/src/driver/input/serio/serio_device.rs b/kernel/src/driver/input/serio/serio_device.rs index dcf18625c..8d2a6df16 100644 --- a/kernel/src/driver/input/serio/serio_device.rs +++ b/kernel/src/driver/input/serio/serio_device.rs @@ -1,7 +1,9 @@ use alloc::sync::Arc; use system_error::SystemError; -use crate::driver::base::device::Device; +use crate::driver::base::device::{Device, bus::Bus}; + +use super::serio_bus; /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#20 @@ -11,4 +13,23 @@ pub trait SerioDevice: Device { fn close(&self, device: & Arc) -> Result<(), SystemError>; fn start(&self, device: & Arc) -> Result<(), SystemError>; fn stop(&self, device: & Arc) -> Result<(), SystemError>; -} \ No newline at end of file +} + +#[inline(always)] +pub fn serio_device_manager() -> &'static SerioDeviceManager { + &SerioDeviceManager +} + +pub struct SerioDeviceManager; + +impl SerioDeviceManager { + pub fn register_port(&self, device: Arc) -> Result<(), SystemError> { + self.init_port(device) + } + + //todo:https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#494 + pub fn init_port(&self, device: Arc) -> Result<(), SystemError> { + device.set_bus(Some(serio_bus() as Arc)); + Ok(()) + } +} \ No newline at end of file diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs index 54d0cd6c4..726b58add 100644 --- a/kernel/src/driver/input/serio/serio_driver.rs +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -1,9 +1,9 @@ use alloc::sync::Arc; use system_error::SystemError; -use crate::driver::base::device::driver::Driver; +use crate::driver::base::device::{driver::{Driver, driver_manager}, bus::Bus}; -use super::serio_device::SerioDevice; +use super::{serio_device::SerioDevice, serio_bus}; /// @brief: 实现该trait的设备驱动实例应挂载在serio总线上, /// 同时应该实现Driver trait @@ -17,4 +17,21 @@ pub trait SerioDriver: Driver { fn fast_reconnect(&self, device: &Arc) -> Result<(), SystemError>; fn disconnect(&self, device: &Arc) -> Result<(), SystemError>; fn cleanup(&self, device: &Arc) -> Result<(), SystemError>; +} + +//todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#810 + +pub struct SerioDriverManager; + +impl SerioDriverManager { + + pub fn register(&self, driver: Arc) -> Result<(), SystemError> { + driver.set_bus(Some(serio_bus() as Arc)); + return driver_manager().register(driver as Arc); + } + + #[allow(dead_code)] + pub fn unregister(&self, driver: &Arc) { + driver_manager().unregister(&(driver.clone() as Arc)); + } } \ No newline at end of file From 0c9135d2ccc2c17a9b7c2eb8a144a4bc087f6d47 Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Thu, 4 Jan 2024 10:25:55 +0800 Subject: [PATCH 05/11] fix error --- kernel/src/driver/input/serio/mod.rs | 1 + kernel/src/driver/input/serio/serio_device.rs | 2 +- kernel/src/driver/input/serio/serio_driver.rs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/kernel/src/driver/input/serio/mod.rs b/kernel/src/driver/input/serio/mod.rs index 809483d30..ba837f52e 100644 --- a/kernel/src/driver/input/serio/mod.rs +++ b/kernel/src/driver/input/serio/mod.rs @@ -20,6 +20,7 @@ pub fn serio_bus() -> Arc { } } + /// @brief: 初始化serio总线 /// /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#1024 diff --git a/kernel/src/driver/input/serio/serio_device.rs b/kernel/src/driver/input/serio/serio_device.rs index 8d2a6df16..7315b8b4a 100644 --- a/kernel/src/driver/input/serio/serio_device.rs +++ b/kernel/src/driver/input/serio/serio_device.rs @@ -29,7 +29,7 @@ impl SerioDeviceManager { //todo:https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#494 pub fn init_port(&self, device: Arc) -> Result<(), SystemError> { - device.set_bus(Some(serio_bus() as Arc)); + device.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc)))); Ok(()) } } \ No newline at end of file diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs index 726b58add..93eeaf6f9 100644 --- a/kernel/src/driver/input/serio/serio_driver.rs +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -26,7 +26,7 @@ pub struct SerioDriverManager; impl SerioDriverManager { pub fn register(&self, driver: Arc) -> Result<(), SystemError> { - driver.set_bus(Some(serio_bus() as Arc)); + driver.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc)))); return driver_manager().register(driver as Arc); } From da44289450bbf6ffc98c899127dcefede551467c Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Thu, 4 Jan 2024 10:55:32 +0800 Subject: [PATCH 06/11] make fmt --- kernel/src/driver/base/init.rs | 2 +- kernel/src/driver/input/mod.rs | 2 +- kernel/src/driver/input/ps2_dev/mod.rs | 2 +- kernel/src/driver/input/ps2_dev/ps2_device.rs | 6 +--- kernel/src/driver/input/serio/mod.rs | 10 ++---- kernel/src/driver/input/serio/serio_device.rs | 17 +++++---- kernel/src/driver/input/serio/serio_driver.rs | 20 +++++++---- kernel/src/driver/input/serio/subsys.rs | 35 +++++++++++++------ kernel/src/driver/mod.rs | 2 +- 9 files changed, 54 insertions(+), 42 deletions(-) diff --git a/kernel/src/driver/base/init.rs b/kernel/src/driver/base/init.rs index 7d9649eb7..b0546a24c 100644 --- a/kernel/src/driver/base/init.rs +++ b/kernel/src/driver/base/init.rs @@ -1,4 +1,4 @@ -use crate::driver::{tty::tty_device::tty_init, input::serio::serio_bus_init}; +use crate::driver::{input::serio::serio_bus_init, tty::tty_device::tty_init}; use system_error::SystemError; use super::{ diff --git a/kernel/src/driver/input/mod.rs b/kernel/src/driver/input/mod.rs index 6f9a93303..d3a1a5456 100644 --- a/kernel/src/driver/input/mod.rs +++ b/kernel/src/driver/input/mod.rs @@ -1,2 +1,2 @@ +pub mod ps2_dev; pub mod serio; -pub mod ps2_dev; \ No newline at end of file diff --git a/kernel/src/driver/input/ps2_dev/mod.rs b/kernel/src/driver/input/ps2_dev/mod.rs index 3e656df9f..feedb8745 100644 --- a/kernel/src/driver/input/ps2_dev/mod.rs +++ b/kernel/src/driver/input/ps2_dev/mod.rs @@ -1 +1 @@ -pub mod ps2_device; \ No newline at end of file +pub mod ps2_device; diff --git a/kernel/src/driver/input/ps2_dev/ps2_device.rs b/kernel/src/driver/input/ps2_dev/ps2_device.rs index 8da46fded..26050c7d5 100644 --- a/kernel/src/driver/input/ps2_dev/ps2_device.rs +++ b/kernel/src/driver/input/ps2_dev/ps2_device.rs @@ -1,8 +1,4 @@ use crate::driver::{base::device::Device, input::serio::serio_device::SerioDevice}; - - // todo: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/libps2.h#33 -pub trait Ps2Device : Device + SerioDevice { - -} \ No newline at end of file +pub trait Ps2Device: Device + SerioDevice {} diff --git a/kernel/src/driver/input/serio/mod.rs b/kernel/src/driver/input/serio/mod.rs index ba837f52e..4a934bef2 100644 --- a/kernel/src/driver/input/serio/mod.rs +++ b/kernel/src/driver/input/serio/mod.rs @@ -9,25 +9,21 @@ pub mod serio_device; pub mod serio_driver; pub mod subsys; - static mut SERIO_BUS: Option> = None; #[allow(dead_code)] #[inline(always)] pub fn serio_bus() -> Arc { - unsafe { - SERIO_BUS.clone().unwrap() - } + unsafe { SERIO_BUS.clone().unwrap() } } - /// @brief: 初始化serio总线 -/// +/// /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#1024 pub fn serio_bus_init() -> Result<(), SystemError> { let serio_bus = SerioBus::new(); let r = bus_register(serio_bus.clone() as Arc); unsafe { SERIO_BUS = Some(serio_bus) }; - + return r; } diff --git a/kernel/src/driver/input/serio/serio_device.rs b/kernel/src/driver/input/serio/serio_device.rs index 7315b8b4a..07c4f7a98 100644 --- a/kernel/src/driver/input/serio/serio_device.rs +++ b/kernel/src/driver/input/serio/serio_device.rs @@ -1,19 +1,18 @@ use alloc::sync::Arc; use system_error::SystemError; -use crate::driver::base::device::{Device, bus::Bus}; +use crate::driver::base::device::{bus::Bus, Device}; use super::serio_bus; - /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#20 pub trait SerioDevice: Device { - fn write(&self, device: & Arc, data: u8) -> Result<(), SystemError>; - fn open(&self, device: & Arc) -> Result<(), SystemError>; - fn close(&self, device: & Arc) -> Result<(), SystemError>; - fn start(&self, device: & Arc) -> Result<(), SystemError>; - fn stop(&self, device: & Arc) -> Result<(), SystemError>; -} + fn write(&self, device: &Arc, data: u8) -> Result<(), SystemError>; + fn open(&self, device: &Arc) -> Result<(), SystemError>; + fn close(&self, device: &Arc) -> Result<(), SystemError>; + fn start(&self, device: &Arc) -> Result<(), SystemError>; + fn stop(&self, device: &Arc) -> Result<(), SystemError>; +} #[inline(always)] pub fn serio_device_manager() -> &'static SerioDeviceManager { @@ -32,4 +31,4 @@ impl SerioDeviceManager { device.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc)))); Ok(()) } -} \ No newline at end of file +} diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs index 93eeaf6f9..9b88f5a11 100644 --- a/kernel/src/driver/input/serio/serio_driver.rs +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -1,17 +1,24 @@ use alloc::sync::Arc; use system_error::SystemError; -use crate::driver::base::device::{driver::{Driver, driver_manager}, bus::Bus}; +use crate::driver::base::device::{ + bus::Bus, + driver::{driver_manager, Driver}, +}; -use super::{serio_device::SerioDevice, serio_bus}; +use super::{serio_bus, serio_device::SerioDevice}; /// @brief: 实现该trait的设备驱动实例应挂载在serio总线上, /// 同时应该实现Driver trait /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#67 pub trait SerioDriver: Driver { - fn write_wakeup(&self, device: &Arc) -> Result<(), SystemError>; - fn interrupt(&self, device: &Arc, char: u8, int: u8) -> Result<(), SystemError>; + fn interrupt( + &self, + device: &Arc, + char: u8, + int: u8, + ) -> Result<(), SystemError>; fn connect(&self, device: &Arc) -> Result<(), SystemError>; fn reconnect(&self, device: &Arc) -> Result<(), SystemError>; fn fast_reconnect(&self, device: &Arc) -> Result<(), SystemError>; @@ -24,14 +31,13 @@ pub trait SerioDriver: Driver { pub struct SerioDriverManager; impl SerioDriverManager { - pub fn register(&self, driver: Arc) -> Result<(), SystemError> { driver.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc)))); return driver_manager().register(driver as Arc); - } + } #[allow(dead_code)] pub fn unregister(&self, driver: &Arc) { driver_manager().unregister(&(driver.clone() as Arc)); } -} \ No newline at end of file +} diff --git a/kernel/src/driver/input/serio/subsys.rs b/kernel/src/driver/input/serio/subsys.rs index a233cf5c5..d74ac5aeb 100644 --- a/kernel/src/driver/input/serio/subsys.rs +++ b/kernel/src/driver/input/serio/subsys.rs @@ -1,14 +1,27 @@ -use alloc::{sync::{Arc, Weak}, string::{ToString, String}}; +use alloc::{ + string::{String, ToString}, + sync::{Arc, Weak}, +}; use intertrait::cast::CastArc; use system_error::SystemError; -use crate::{driver::{base::{subsys::SubSysPrivate, device::{bus::Bus, Device, driver::Driver}, kobject::KObject}, acpi::acpi_manager}, filesystem::{sysfs::{AttributeGroup, Attribute}, vfs::syscall::ModeType}}; +use crate::{ + driver::{ + acpi::acpi_manager, + base::{ + device::{bus::Bus, driver::Driver, Device}, + kobject::KObject, + subsys::SubSysPrivate, + }, + }, + filesystem::{ + sysfs::{Attribute, AttributeGroup}, + vfs::syscall::ModeType, + }, +}; use super::{serio_device::SerioDevice, serio_driver::SerioDriver}; - - - #[derive(Debug)] pub struct SerioBus { private: SubSysPrivate, @@ -27,7 +40,6 @@ impl SerioBus { } impl Bus for SerioBus { - fn name(&self) -> String { return "serio".to_string(); } @@ -46,8 +58,11 @@ impl Bus for SerioBus { fn probe(&self, device: &Arc) -> Result<(), SystemError> { let drv = device.driver().ok_or(SystemError::EINVAL)?; - let pdrv = drv.cast::().map_err(|_|{ - kerror!("SerioBus::probe() failed: device.driver() is not a SerioDriver. Device: '{:?}'", device.name()); + let pdrv = drv.cast::().map_err(|_| { + kerror!( + "SerioBus::probe() failed: device.driver() is not a SerioDriver. Device: '{:?}'", + device.name() + ); SystemError::EINVAL })?; @@ -113,7 +128,7 @@ impl AttributeGroup for SerioDeviceAttrGroup { fn name(&self) -> Option<&str> { None } - + // todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#473 fn attrs(&self) -> &[&'static dyn Attribute] { return &[]; @@ -122,4 +137,4 @@ impl AttributeGroup for SerioDeviceAttrGroup { fn is_visible(&self, _kobj: Arc, attr: &dyn Attribute) -> Option { None } -} \ No newline at end of file +} diff --git a/kernel/src/driver/mod.rs b/kernel/src/driver/mod.rs index 2db9dd529..0c8c9aacd 100644 --- a/kernel/src/driver/mod.rs +++ b/kernel/src/driver/mod.rs @@ -1,6 +1,7 @@ pub mod acpi; pub mod base; pub mod disk; +pub mod input; pub mod keyboard; pub mod net; pub mod open_firmware; @@ -9,4 +10,3 @@ pub mod timers; pub mod tty; pub mod video; pub mod virtio; -pub mod input; \ No newline at end of file From 33faa8ae972ef56ce27e9161d002b452560fb03e Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Thu, 4 Jan 2024 11:10:04 +0800 Subject: [PATCH 07/11] fix warning --- kernel/src/driver/base/init.rs | 2 +- kernel/src/driver/input/serio/serio_device.rs | 2 ++ kernel/src/driver/input/serio/serio_driver.rs | 1 + kernel/src/driver/input/serio/subsys.rs | 2 +- 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/kernel/src/driver/base/init.rs b/kernel/src/driver/base/init.rs index b0546a24c..9bf3f0645 100644 --- a/kernel/src/driver/base/init.rs +++ b/kernel/src/driver/base/init.rs @@ -1,4 +1,4 @@ -use crate::driver::{input::serio::serio_bus_init, tty::tty_device::tty_init}; +use crate::driver::input::serio::serio_bus_init; use system_error::SystemError; use super::{ diff --git a/kernel/src/driver/input/serio/serio_device.rs b/kernel/src/driver/input/serio/serio_device.rs index 07c4f7a98..21915dd4b 100644 --- a/kernel/src/driver/input/serio/serio_device.rs +++ b/kernel/src/driver/input/serio/serio_device.rs @@ -14,6 +14,7 @@ pub trait SerioDevice: Device { fn stop(&self, device: &Arc) -> Result<(), SystemError>; } +#[allow(dead_code)] #[inline(always)] pub fn serio_device_manager() -> &'static SerioDeviceManager { &SerioDeviceManager @@ -21,6 +22,7 @@ pub fn serio_device_manager() -> &'static SerioDeviceManager { pub struct SerioDeviceManager; +#[allow(dead_code)] impl SerioDeviceManager { pub fn register_port(&self, device: Arc) -> Result<(), SystemError> { self.init_port(device) diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs index 9b88f5a11..115a17e3a 100644 --- a/kernel/src/driver/input/serio/serio_driver.rs +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -30,6 +30,7 @@ pub trait SerioDriver: Driver { pub struct SerioDriverManager; +#[allow(dead_code)] impl SerioDriverManager { pub fn register(&self, driver: Arc) -> Result<(), SystemError> { driver.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc)))); diff --git a/kernel/src/driver/input/serio/subsys.rs b/kernel/src/driver/input/serio/subsys.rs index d74ac5aeb..c997bdcd5 100644 --- a/kernel/src/driver/input/serio/subsys.rs +++ b/kernel/src/driver/input/serio/subsys.rs @@ -134,7 +134,7 @@ impl AttributeGroup for SerioDeviceAttrGroup { return &[]; } - fn is_visible(&self, _kobj: Arc, attr: &dyn Attribute) -> Option { + fn is_visible(&self, _kobj: Arc, _attr: &dyn Attribute) -> Option { None } } From 0ec638274d281e6c7f0cb78cd9ea0c0fc14e6273 Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Mon, 15 Jan 2024 17:10:54 +0800 Subject: [PATCH 08/11] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/driver/input/serio/mod.rs | 3 ++- kernel/src/driver/input/serio/serio_device.rs | 13 +++++++++ kernel/src/driver/input/serio/serio_driver.rs | 27 +++++++++++++++---- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/kernel/src/driver/input/serio/mod.rs b/kernel/src/driver/input/serio/mod.rs index 4a934bef2..7b5df05e8 100644 --- a/kernel/src/driver/input/serio/mod.rs +++ b/kernel/src/driver/input/serio/mod.rs @@ -18,7 +18,8 @@ pub fn serio_bus() -> Arc { } /// @brief: 初始化serio总线 -/// +/// @return: None +/// /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#1024 pub fn serio_bus_init() -> Result<(), SystemError> { let serio_bus = SerioBus::new(); diff --git a/kernel/src/driver/input/serio/serio_device.rs b/kernel/src/driver/input/serio/serio_device.rs index 21915dd4b..2d402272e 100644 --- a/kernel/src/driver/input/serio/serio_device.rs +++ b/kernel/src/driver/input/serio/serio_device.rs @@ -7,10 +7,17 @@ use super::serio_bus; /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#20 pub trait SerioDevice: Device { + /// @brief: Serio设备写入数据 + /// @parametrr: data 数据 + /// @return: None fn write(&self, device: &Arc, data: u8) -> Result<(), SystemError>; + // Serio设备连接驱动时调用 fn open(&self, device: &Arc) -> Result<(), SystemError>; + // Serio设备断开驱动时调用 fn close(&self, device: &Arc) -> Result<(), SystemError>; + // Serio设备初始化时调用 fn start(&self, device: &Arc) -> Result<(), SystemError>; + // Serio设备销毁时调用 fn stop(&self, device: &Arc) -> Result<(), SystemError>; } @@ -24,10 +31,16 @@ pub struct SerioDeviceManager; #[allow(dead_code)] impl SerioDeviceManager { + /// @brief: 注册Serio设备 + /// @parameter: device 待注册的设备 + /// @return: None pub fn register_port(&self, device: Arc) -> Result<(), SystemError> { self.init_port(device) } + /// @brief: 初始化Serio设备 + /// @parameter: device 待初始化的Serio设备 + /// @return: None //todo:https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#494 pub fn init_port(&self, device: Arc) -> Result<(), SystemError> { device.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc)))); diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs index 115a17e3a..44d1dbd89 100644 --- a/kernel/src/driver/input/serio/serio_driver.rs +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -8,21 +8,32 @@ use crate::driver::base::device::{ use super::{serio_bus, serio_device::SerioDevice}; -/// @brief: 实现该trait的设备驱动实例应挂载在serio总线上, -/// 同时应该实现Driver trait +/// @brief: 实现该trait的设备驱动实例应挂载在serio总线上,同时应该实现Driver trait /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#67 pub trait SerioDriver: Driver { + // 写入时唤醒设备 fn write_wakeup(&self, device: &Arc) -> Result<(), SystemError>; + /// @brief: 中断函数 + /// @parameter: + /// device: Serio设备 + /// data: 端口数据 + /// flag: 状态掩码 + /// @return: None fn interrupt( &self, device: &Arc, - char: u8, - int: u8, + data: u8, + flag: u8, ) -> Result<(), SystemError>; + // Serio驱动连接设备 fn connect(&self, device: &Arc) -> Result<(), SystemError>; + // 重新连接设备 fn reconnect(&self, device: &Arc) -> Result<(), SystemError>; + // 快速重连设备 fn fast_reconnect(&self, device: &Arc) -> Result<(), SystemError>; + // 驱动断开设备 fn disconnect(&self, device: &Arc) -> Result<(), SystemError>; + // 清除设备状态 fn cleanup(&self, device: &Arc) -> Result<(), SystemError>; } @@ -32,11 +43,17 @@ pub struct SerioDriverManager; #[allow(dead_code)] impl SerioDriverManager { + /// @brief: 注册Serio驱动 + /// @parameter: 待注册的Serio驱动 + /// @return: None pub fn register(&self, driver: Arc) -> Result<(), SystemError> { driver.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc)))); return driver_manager().register(driver as Arc); } - + + /// @brief: 卸载Serio驱动 + /// @parameter: 待卸载的Serio驱动 + /// @return: None #[allow(dead_code)] pub fn unregister(&self, driver: &Arc) { driver_manager().unregister(&(driver.clone() as Arc)); From 2e0d581876a1c31a0bb0d0ed764316161fedb326 Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Mon, 15 Jan 2024 17:12:12 +0800 Subject: [PATCH 09/11] make fmt --- kernel/src/driver/input/serio/mod.rs | 2 +- kernel/src/driver/input/serio/serio_driver.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel/src/driver/input/serio/mod.rs b/kernel/src/driver/input/serio/mod.rs index 7b5df05e8..cc0714ea5 100644 --- a/kernel/src/driver/input/serio/mod.rs +++ b/kernel/src/driver/input/serio/mod.rs @@ -19,7 +19,7 @@ pub fn serio_bus() -> Arc { /// @brief: 初始化serio总线 /// @return: None -/// +/// /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#1024 pub fn serio_bus_init() -> Result<(), SystemError> { let serio_bus = SerioBus::new(); diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs index 44d1dbd89..d4b8dabe3 100644 --- a/kernel/src/driver/input/serio/serio_driver.rs +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -14,7 +14,7 @@ pub trait SerioDriver: Driver { // 写入时唤醒设备 fn write_wakeup(&self, device: &Arc) -> Result<(), SystemError>; /// @brief: 中断函数 - /// @parameter: + /// @parameter: /// device: Serio设备 /// data: 端口数据 /// flag: 状态掩码 @@ -50,7 +50,7 @@ impl SerioDriverManager { driver.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc)))); return driver_manager().register(driver as Arc); } - + /// @brief: 卸载Serio驱动 /// @parameter: 待卸载的Serio驱动 /// @return: None From fd02ef51f643a3479e793efeb63be54cfaf70aef Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Mon, 15 Jan 2024 19:48:01 +0800 Subject: [PATCH 10/11] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/driver/input/serio/serio_device.rs | 2 ++ kernel/src/driver/input/serio/serio_driver.rs | 1 + 2 files changed, 3 insertions(+) diff --git a/kernel/src/driver/input/serio/serio_device.rs b/kernel/src/driver/input/serio/serio_device.rs index 2d402272e..053990058 100644 --- a/kernel/src/driver/input/serio/serio_device.rs +++ b/kernel/src/driver/input/serio/serio_device.rs @@ -5,6 +5,8 @@ use crate::driver::base::device::{bus::Bus, Device}; use super::serio_bus; +/// @brief: 串行设备,实现该trait的设备实例挂载在serio总线上,同时应该实现Device trait +/// /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#20 pub trait SerioDevice: Device { /// @brief: Serio设备写入数据 diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs index d4b8dabe3..88e038e08 100644 --- a/kernel/src/driver/input/serio/serio_driver.rs +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -9,6 +9,7 @@ use crate::driver::base::device::{ use super::{serio_bus, serio_device::SerioDevice}; /// @brief: 实现该trait的设备驱动实例应挂载在serio总线上,同时应该实现Driver trait +/// /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#67 pub trait SerioDriver: Driver { // 写入时唤醒设备 From a1c5e603c66a07cced2e1c7ca02b595f12127a2c Mon Sep 17 00:00:00 2001 From: 2447742618 <2447742618@qq.com> Date: Tue, 16 Jan 2024 14:37:34 +0800 Subject: [PATCH 11/11] =?UTF-8?q?=E6=94=B9=E7=94=A8=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/driver/input/serio/mod.rs | 5 +- kernel/src/driver/input/serio/serio_device.rs | 49 +++++++++++------ kernel/src/driver/input/serio/serio_driver.rs | 53 ++++++++++++------- kernel/src/driver/input/serio/subsys.rs | 2 +- 4 files changed, 71 insertions(+), 38 deletions(-) diff --git a/kernel/src/driver/input/serio/mod.rs b/kernel/src/driver/input/serio/mod.rs index cc0714ea5..2c6186b7f 100644 --- a/kernel/src/driver/input/serio/mod.rs +++ b/kernel/src/driver/input/serio/mod.rs @@ -17,8 +17,9 @@ pub fn serio_bus() -> Arc { unsafe { SERIO_BUS.clone().unwrap() } } -/// @brief: 初始化serio总线 -/// @return: None +/// # 函数的功能 +/// +/// 初始化serio bus /// /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#1024 pub fn serio_bus_init() -> Result<(), SystemError> { diff --git a/kernel/src/driver/input/serio/serio_device.rs b/kernel/src/driver/input/serio/serio_device.rs index 053990058..89f2f771c 100644 --- a/kernel/src/driver/input/serio/serio_device.rs +++ b/kernel/src/driver/input/serio/serio_device.rs @@ -5,21 +5,29 @@ use crate::driver::base::device::{bus::Bus, Device}; use super::serio_bus; -/// @brief: 串行设备,实现该trait的设备实例挂载在serio总线上,同时应该实现Device trait +/// 串行设备,实现该trait的设备实例挂载在serio总线上,同时应该实现Device trait /// /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#20 pub trait SerioDevice: Device { - /// @brief: Serio设备写入数据 - /// @parametrr: data 数据 - /// @return: None + /// # 函数功能 + /// + /// Serio设备写入数据 + /// + /// ## 参数 + /// + /// - data 写入的数据 + /// + /// ## 返回值 + /// + /// 无 fn write(&self, device: &Arc, data: u8) -> Result<(), SystemError>; - // Serio设备连接驱动时调用 + /// Serio设备连接驱动时调用 fn open(&self, device: &Arc) -> Result<(), SystemError>; - // Serio设备断开驱动时调用 + /// Serio设备断开驱动时调用 fn close(&self, device: &Arc) -> Result<(), SystemError>; - // Serio设备初始化时调用 + /// Serio设备初始化时调用 fn start(&self, device: &Arc) -> Result<(), SystemError>; - // Serio设备销毁时调用 + /// Serio设备销毁时调用 fn stop(&self, device: &Arc) -> Result<(), SystemError>; } @@ -33,17 +41,28 @@ pub struct SerioDeviceManager; #[allow(dead_code)] impl SerioDeviceManager { - /// @brief: 注册Serio设备 - /// @parameter: device 待注册的设备 - /// @return: None + /// # 函数功能 + /// 注册Serio设备 + /// + /// ## 参数 + /// - device 待注册的设备 + /// + /// ## 返回值 + /// 无 pub fn register_port(&self, device: Arc) -> Result<(), SystemError> { self.init_port(device) } - /// @brief: 初始化Serio设备 - /// @parameter: device 待初始化的Serio设备 - /// @return: None - //todo:https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#494 + /// # 函数功能 + /// 初始化Serio设备 + /// + /// ## 参数 + /// - device 待初始化的Serio设备 + /// + /// ## 返回值 + /// 无 + /// + /// todo:https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#494 pub fn init_port(&self, device: Arc) -> Result<(), SystemError> { device.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc)))); Ok(()) diff --git a/kernel/src/driver/input/serio/serio_driver.rs b/kernel/src/driver/input/serio/serio_driver.rs index 88e038e08..8c0f9b185 100644 --- a/kernel/src/driver/input/serio/serio_driver.rs +++ b/kernel/src/driver/input/serio/serio_driver.rs @@ -8,53 +8,66 @@ use crate::driver::base::device::{ use super::{serio_bus, serio_device::SerioDevice}; -/// @brief: 实现该trait的设备驱动实例应挂载在serio总线上,同时应该实现Driver trait +/// 实现该trait的设备驱动实例应挂载在serio总线上,同时应该实现Driver trait /// /// 参考: https://code.dragonos.org.cn/xref/linux-6.1.9/include/linux/serio.h#67 pub trait SerioDriver: Driver { // 写入时唤醒设备 fn write_wakeup(&self, device: &Arc) -> Result<(), SystemError>; - /// @brief: 中断函数 - /// @parameter: - /// device: Serio设备 - /// data: 端口数据 - /// flag: 状态掩码 - /// @return: None + /// # 函数功能 + /// 中断函数 + /// + /// ## 参数 + /// - device: Serio设备 + /// - data: 端口数据 + /// - flag: 状态掩码 + /// + /// ## 返回值 + /// 无 fn interrupt( &self, device: &Arc, data: u8, flag: u8, ) -> Result<(), SystemError>; - // Serio驱动连接设备 + /// Serio驱动连接设备 fn connect(&self, device: &Arc) -> Result<(), SystemError>; - // 重新连接设备 + /// 重新连接设备 fn reconnect(&self, device: &Arc) -> Result<(), SystemError>; - // 快速重连设备 + /// 快速重连设备 fn fast_reconnect(&self, device: &Arc) -> Result<(), SystemError>; - // 驱动断开设备 + /// 驱动断开设备 fn disconnect(&self, device: &Arc) -> Result<(), SystemError>; - // 清除设备状态 + /// 清除设备状态 fn cleanup(&self, device: &Arc) -> Result<(), SystemError>; } -//todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#810 - +///todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#810 pub struct SerioDriverManager; #[allow(dead_code)] impl SerioDriverManager { - /// @brief: 注册Serio驱动 - /// @parameter: 待注册的Serio驱动 - /// @return: None + /// # 函数功能 + /// 注册Serio驱动 + /// + /// ## 参数 + /// - driver 待注册的Serio驱动 + /// + /// ## 返回值 + /// 无 pub fn register(&self, driver: Arc) -> Result<(), SystemError> { driver.set_bus(Some(Arc::downgrade(&(serio_bus() as Arc)))); return driver_manager().register(driver as Arc); } - /// @brief: 卸载Serio驱动 - /// @parameter: 待卸载的Serio驱动 - /// @return: None + /// # 函数功能 + /// 卸载Serio驱动 + /// + /// ## 参数 + /// - driver 待卸载的Serio驱动 + /// + /// ## 返回值 + /// 无 #[allow(dead_code)] pub fn unregister(&self, driver: &Arc) { driver_manager().unregister(&(driver.clone() as Arc)); diff --git a/kernel/src/driver/input/serio/subsys.rs b/kernel/src/driver/input/serio/subsys.rs index c997bdcd5..d3291a855 100644 --- a/kernel/src/driver/input/serio/subsys.rs +++ b/kernel/src/driver/input/serio/subsys.rs @@ -129,7 +129,7 @@ impl AttributeGroup for SerioDeviceAttrGroup { None } - // todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#473 + /// todo: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/serio.c#473 fn attrs(&self) -> &[&'static dyn Attribute] { return &[]; }