xref: /DragonOS/kernel/src/driver/input/serio/i8042/i8042_ports.rs (revision 28fe4ad2a0b0d8b5abf1f0cb402b1c3204b42242)
19993c0fcSR0ronoa use alloc::{
29993c0fcSR0ronoa     string::{String, ToString},
39993c0fcSR0ronoa     sync::{Arc, Weak},
49993c0fcSR0ronoa };
59993c0fcSR0ronoa use system_error::SystemError;
69993c0fcSR0ronoa 
79993c0fcSR0ronoa use crate::{
89993c0fcSR0ronoa     driver::{
99993c0fcSR0ronoa         base::{
109993c0fcSR0ronoa             class::Class,
11*28fe4ad2S黄铭涛             device::{bus::Bus, driver::Driver, Device, DeviceCommonData, DeviceType, IdTable},
12*28fe4ad2S黄铭涛             kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
139993c0fcSR0ronoa             kset::KSet,
149993c0fcSR0ronoa         },
159993c0fcSR0ronoa         input::serio::serio_device::SerioDevice,
169993c0fcSR0ronoa     },
179993c0fcSR0ronoa     filesystem::kernfs::KernFSInode,
189993c0fcSR0ronoa     libs::{
199993c0fcSR0ronoa         rwlock::{RwLockReadGuard, RwLockWriteGuard},
20*28fe4ad2S黄铭涛         spinlock::{SpinLock, SpinLockGuard},
219993c0fcSR0ronoa     },
229993c0fcSR0ronoa };
239993c0fcSR0ronoa 
249993c0fcSR0ronoa use super::{i8042_start, i8042_stop};
259993c0fcSR0ronoa 
269993c0fcSR0ronoa #[derive(Debug)]
279993c0fcSR0ronoa #[cast_to([sync] Device)]
289993c0fcSR0ronoa pub struct I8042AuxPort {
299993c0fcSR0ronoa     inner: SpinLock<InnerI8042AuxPort>,
309993c0fcSR0ronoa     kobj_state: LockedKObjectState,
319993c0fcSR0ronoa }
329993c0fcSR0ronoa 
339993c0fcSR0ronoa #[derive(Debug)]
349993c0fcSR0ronoa pub struct InnerI8042AuxPort {
35*28fe4ad2S黄铭涛     device_common: DeviceCommonData,
36*28fe4ad2S黄铭涛     kobject_common: KObjectCommonData,
379993c0fcSR0ronoa }
389993c0fcSR0ronoa 
399993c0fcSR0ronoa impl I8042AuxPort {
409993c0fcSR0ronoa     pub const NAME: &'static str = "serio1";
new() -> Self419993c0fcSR0ronoa     pub fn new() -> Self {
429993c0fcSR0ronoa         return Self {
439993c0fcSR0ronoa             inner: SpinLock::new(InnerI8042AuxPort {
44*28fe4ad2S黄铭涛                 device_common: DeviceCommonData::default(),
45*28fe4ad2S黄铭涛                 kobject_common: KObjectCommonData::default(),
469993c0fcSR0ronoa             }),
479993c0fcSR0ronoa             kobj_state: LockedKObjectState::new(None),
489993c0fcSR0ronoa         };
499993c0fcSR0ronoa     }
50*28fe4ad2S黄铭涛 
inner(&self) -> SpinLockGuard<InnerI8042AuxPort>51*28fe4ad2S黄铭涛     fn inner(&self) -> SpinLockGuard<InnerI8042AuxPort> {
52*28fe4ad2S黄铭涛         self.inner.lock()
53*28fe4ad2S黄铭涛     }
549993c0fcSR0ronoa }
559993c0fcSR0ronoa 
569993c0fcSR0ronoa impl Device for I8042AuxPort {
dev_type(&self) -> DeviceType579993c0fcSR0ronoa     fn dev_type(&self) -> DeviceType {
589993c0fcSR0ronoa         DeviceType::Char
599993c0fcSR0ronoa     }
609993c0fcSR0ronoa 
id_table(&self) -> IdTable619993c0fcSR0ronoa     fn id_table(&self) -> IdTable {
629993c0fcSR0ronoa         IdTable::new(self.name(), None)
639993c0fcSR0ronoa     }
649993c0fcSR0ronoa 
bus(&self) -> Option<Weak<dyn Bus>>659993c0fcSR0ronoa     fn bus(&self) -> Option<Weak<dyn Bus>> {
66*28fe4ad2S黄铭涛         self.inner().device_common.bus.clone()
679993c0fcSR0ronoa     }
689993c0fcSR0ronoa 
set_bus(&self, bus: Option<Weak<dyn Bus>>)699993c0fcSR0ronoa     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
70*28fe4ad2S黄铭涛         self.inner().device_common.bus = bus;
719993c0fcSR0ronoa     }
729993c0fcSR0ronoa 
set_class(&self, class: Option<Weak<dyn Class>>)734256da7fSLoGin     fn set_class(&self, class: Option<Weak<dyn Class>>) {
74*28fe4ad2S黄铭涛         self.inner().device_common.class = class;
759993c0fcSR0ronoa     }
769993c0fcSR0ronoa 
class(&self) -> Option<Arc<dyn Class>>774256da7fSLoGin     fn class(&self) -> Option<Arc<dyn Class>> {
78*28fe4ad2S黄铭涛         let mut guard = self.inner();
79*28fe4ad2S黄铭涛         let r = guard.device_common.class.clone()?.upgrade();
804256da7fSLoGin         if r.is_none() {
81*28fe4ad2S黄铭涛             guard.device_common.class = None;
824256da7fSLoGin         }
834256da7fSLoGin         return r;
844256da7fSLoGin     }
854256da7fSLoGin 
driver(&self) -> Option<Arc<dyn Driver>>869993c0fcSR0ronoa     fn driver(&self) -> Option<Arc<dyn Driver>> {
87*28fe4ad2S黄铭涛         self.inner().device_common.driver.clone()?.upgrade()
889993c0fcSR0ronoa     }
899993c0fcSR0ronoa 
set_driver(&self, driver: Option<Weak<dyn Driver>>)909993c0fcSR0ronoa     fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
91*28fe4ad2S黄铭涛         self.inner().device_common.driver = driver;
929993c0fcSR0ronoa     }
939993c0fcSR0ronoa 
is_dead(&self) -> bool949993c0fcSR0ronoa     fn is_dead(&self) -> bool {
959993c0fcSR0ronoa         false
969993c0fcSR0ronoa     }
979993c0fcSR0ronoa 
can_match(&self) -> bool989993c0fcSR0ronoa     fn can_match(&self) -> bool {
999993c0fcSR0ronoa         true
1009993c0fcSR0ronoa     }
1019993c0fcSR0ronoa 
set_can_match(&self, _can_match: bool)1029993c0fcSR0ronoa     fn set_can_match(&self, _can_match: bool) {}
1039993c0fcSR0ronoa 
state_synced(&self) -> bool1049993c0fcSR0ronoa     fn state_synced(&self) -> bool {
1059993c0fcSR0ronoa         true
1069993c0fcSR0ronoa     }
107*28fe4ad2S黄铭涛 
dev_parent(&self) -> Option<Weak<dyn Device>>108*28fe4ad2S黄铭涛     fn dev_parent(&self) -> Option<Weak<dyn Device>> {
109*28fe4ad2S黄铭涛         self.inner().device_common.get_parent_weak_or_clear()
110*28fe4ad2S黄铭涛     }
111*28fe4ad2S黄铭涛 
set_dev_parent(&self, parent: Option<Weak<dyn Device>>)112*28fe4ad2S黄铭涛     fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
113*28fe4ad2S黄铭涛         self.inner().device_common.parent = parent;
114*28fe4ad2S黄铭涛     }
1159993c0fcSR0ronoa }
1169993c0fcSR0ronoa 
1179993c0fcSR0ronoa impl KObject for I8042AuxPort {
as_any_ref(&self) -> &dyn core::any::Any1189993c0fcSR0ronoa     fn as_any_ref(&self) -> &dyn core::any::Any {
1199993c0fcSR0ronoa         self
1209993c0fcSR0ronoa     }
1219993c0fcSR0ronoa 
set_inode(&self, inode: Option<Arc<KernFSInode>>)1229993c0fcSR0ronoa     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
123*28fe4ad2S黄铭涛         self.inner().kobject_common.kern_inode = inode;
1249993c0fcSR0ronoa     }
1259993c0fcSR0ronoa 
inode(&self) -> Option<Arc<KernFSInode>>1269993c0fcSR0ronoa     fn inode(&self) -> Option<Arc<KernFSInode>> {
127*28fe4ad2S黄铭涛         self.inner().kobject_common.kern_inode.clone()
1289993c0fcSR0ronoa     }
1299993c0fcSR0ronoa 
parent(&self) -> Option<Weak<dyn KObject>>1309993c0fcSR0ronoa     fn parent(&self) -> Option<Weak<dyn KObject>> {
131*28fe4ad2S黄铭涛         self.inner().kobject_common.parent.clone()
1329993c0fcSR0ronoa     }
1339993c0fcSR0ronoa 
set_parent(&self, parent: Option<Weak<dyn KObject>>)1349993c0fcSR0ronoa     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
135*28fe4ad2S黄铭涛         self.inner().kobject_common.parent = parent;
1369993c0fcSR0ronoa     }
1379993c0fcSR0ronoa 
kset(&self) -> Option<Arc<KSet>>1389993c0fcSR0ronoa     fn kset(&self) -> Option<Arc<KSet>> {
139*28fe4ad2S黄铭涛         self.inner().kobject_common.kset.clone()
1409993c0fcSR0ronoa     }
1419993c0fcSR0ronoa 
set_kset(&self, kset: Option<Arc<KSet>>)1429993c0fcSR0ronoa     fn set_kset(&self, kset: Option<Arc<KSet>>) {
143*28fe4ad2S黄铭涛         self.inner().kobject_common.kset = kset;
1449993c0fcSR0ronoa     }
1459993c0fcSR0ronoa 
kobj_type(&self) -> Option<&'static dyn KObjType>1469993c0fcSR0ronoa     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
147*28fe4ad2S黄铭涛         self.inner().kobject_common.kobj_type
1489993c0fcSR0ronoa     }
1499993c0fcSR0ronoa 
set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)1509993c0fcSR0ronoa     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
151*28fe4ad2S黄铭涛         self.inner().kobject_common.kobj_type = ktype;
1529993c0fcSR0ronoa     }
1539993c0fcSR0ronoa 
name(&self) -> String1549993c0fcSR0ronoa     fn name(&self) -> String {
1559993c0fcSR0ronoa         Self::NAME.to_string()
1569993c0fcSR0ronoa     }
1579993c0fcSR0ronoa 
set_name(&self, _name: String)1589993c0fcSR0ronoa     fn set_name(&self, _name: String) {
1599993c0fcSR0ronoa         // do nothing
1609993c0fcSR0ronoa     }
1619993c0fcSR0ronoa 
kobj_state(&self) -> RwLockReadGuard<KObjectState>1629993c0fcSR0ronoa     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
1639993c0fcSR0ronoa         self.kobj_state.read()
1649993c0fcSR0ronoa     }
1659993c0fcSR0ronoa 
kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>1669993c0fcSR0ronoa     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
1679993c0fcSR0ronoa         self.kobj_state.write()
1689993c0fcSR0ronoa     }
1699993c0fcSR0ronoa 
set_kobj_state(&self, state: KObjectState)1709993c0fcSR0ronoa     fn set_kobj_state(&self, state: KObjectState) {
1719993c0fcSR0ronoa         *self.kobj_state.write() = state;
1729993c0fcSR0ronoa     }
1739993c0fcSR0ronoa }
1749993c0fcSR0ronoa 
1759993c0fcSR0ronoa impl SerioDevice for I8042AuxPort {
1769993c0fcSR0ronoa     // TODO: https://code.dragonos.org.cn/xref/linux-6.1.9/drivers/input/serio/i8042.c#387
write(&self, _device: &Arc<dyn SerioDevice>, _data: u8) -> Result<(), SystemError>1779993c0fcSR0ronoa     fn write(&self, _device: &Arc<dyn SerioDevice>, _data: u8) -> Result<(), SystemError> {
1789993c0fcSR0ronoa         todo!()
1799993c0fcSR0ronoa     }
1809993c0fcSR0ronoa 
open(&self, _device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>1819993c0fcSR0ronoa     fn open(&self, _device: &Arc<dyn SerioDevice>) -> Result<(), SystemError> {
1829993c0fcSR0ronoa         Ok(())
1839993c0fcSR0ronoa     }
1849993c0fcSR0ronoa 
close(&self, _device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>1859993c0fcSR0ronoa     fn close(&self, _device: &Arc<dyn SerioDevice>) -> Result<(), SystemError> {
1869993c0fcSR0ronoa         Ok(())
1879993c0fcSR0ronoa     }
1889993c0fcSR0ronoa 
start(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>1899993c0fcSR0ronoa     fn start(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError> {
1909993c0fcSR0ronoa         i8042_start(device)
1919993c0fcSR0ronoa     }
1929993c0fcSR0ronoa 
stop(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError>1939993c0fcSR0ronoa     fn stop(&self, device: &Arc<dyn SerioDevice>) -> Result<(), SystemError> {
1949993c0fcSR0ronoa         i8042_stop(device)
1959993c0fcSR0ronoa     }
1969993c0fcSR0ronoa }
197