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