ps_mouse_device.rs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686
  1. use core::hint::spin_loop;
  2. use alloc::{
  3. string::ToString,
  4. sync::{Arc, Weak},
  5. vec::Vec,
  6. };
  7. use kdepends::ringbuffer::{AllocRingBuffer, RingBuffer};
  8. use system_error::SystemError;
  9. use crate::{
  10. arch::{io::PortIOArch, CurrentIrqArch, CurrentPortIOArch},
  11. driver::{
  12. base::{
  13. class::Class,
  14. device::{
  15. bus::Bus, device_manager, device_number::DeviceNumber, driver::Driver, Device,
  16. DeviceType, IdTable,
  17. },
  18. kobject::{KObjType, KObject, KObjectState, LockedKObjectState},
  19. kset::KSet,
  20. },
  21. input::{
  22. ps2_dev::ps2_device::Ps2Device,
  23. serio::serio_device::{serio_device_manager, SerioDevice},
  24. },
  25. },
  26. exception::InterruptArch,
  27. filesystem::{
  28. devfs::{devfs_register, DevFS, DeviceINode},
  29. kernfs::KernFSInode,
  30. vfs::{
  31. core::generate_inode_id, syscall::ModeType, utils::DName, FilePrivateData, FileSystem,
  32. FileType, IndexNode, Metadata,
  33. },
  34. },
  35. libs::{
  36. rwlock::{RwLockReadGuard, RwLockWriteGuard},
  37. spinlock::{SpinLock, SpinLockGuard},
  38. },
  39. time::PosixTimeSpec,
  40. };
  41. static mut PS2_MOUSE_DEVICE: Option<Arc<Ps2MouseDevice>> = None;
  42. pub fn ps2_mouse_device() -> Option<Arc<Ps2MouseDevice>> {
  43. unsafe { PS2_MOUSE_DEVICE.clone() }
  44. }
  45. const ADDRESS_PORT_ADDRESS: u16 = 0x64;
  46. const DATA_PORT_ADDRESS: u16 = 0x60;
  47. const KEYBOARD_COMMAND_ENABLE_PS2_MOUSE_PORT: u8 = 0xa8;
  48. const KEYBOARD_COMMAND_SEND_TO_PS2_MOUSE: u8 = 0xd4;
  49. const MOUSE_BUFFER_CAPACITY: usize = 15;
  50. bitflags! {
  51. /// Represents the flags currently set for the mouse.
  52. #[derive(Default)]
  53. pub struct MouseFlags: u8 {
  54. /// Whether or not the left mouse button is pressed.
  55. const LEFT_BUTTON = 0b0000_0001;
  56. /// Whether or not the right mouse button is pressed.
  57. const RIGHT_BUTTON = 0b0000_0010;
  58. /// Whether or not the middle mouse button is pressed.
  59. const MIDDLE_BUTTON = 0b0000_0100;
  60. /// Whether or not the packet is valid or not.
  61. const ALWAYS_ONE = 0b0000_1000;
  62. /// Whether or not the x delta is negative.
  63. const X_SIGN = 0b0001_0000;
  64. /// Whether or not the y delta is negative.
  65. const Y_SIGN = 0b0010_0000;
  66. /// Whether or not the x delta overflowed.
  67. const X_OVERFLOW = 0b0100_0000;
  68. /// Whether or not the y delta overflowed.
  69. const Y_OVERFLOW = 0b1000_0000;
  70. }
  71. }
  72. #[derive(Debug)]
  73. enum PsMouseCommand {
  74. SampleRate(u8),
  75. EnablePacketStreaming,
  76. // SetDefaults = 0xF6,
  77. InitKeyboard,
  78. GetMouseId,
  79. SetSampleRate,
  80. }
  81. impl From<PsMouseCommand> for u8 {
  82. fn from(val: PsMouseCommand) -> Self {
  83. match val {
  84. PsMouseCommand::SampleRate(x) => x,
  85. PsMouseCommand::EnablePacketStreaming => 0xf4,
  86. PsMouseCommand::InitKeyboard => 0x47,
  87. PsMouseCommand::GetMouseId => 0xf2,
  88. PsMouseCommand::SetSampleRate => 0xf3,
  89. }
  90. }
  91. }
  92. #[derive(Debug)]
  93. pub struct MouseState {
  94. flags: MouseFlags,
  95. x: i16,
  96. y: i16,
  97. }
  98. #[allow(dead_code)]
  99. impl MouseState {
  100. /// Returns a new `MouseState`.
  101. pub const fn new() -> MouseState {
  102. MouseState {
  103. flags: MouseFlags::empty(),
  104. x: 0,
  105. y: 0,
  106. }
  107. }
  108. /// Returns true if the left mouse button is currently down.
  109. pub fn left_button_down(&self) -> bool {
  110. self.flags.contains(MouseFlags::LEFT_BUTTON)
  111. }
  112. /// Returns true if the left mouse button is currently up.
  113. pub fn left_button_up(&self) -> bool {
  114. !self.flags.contains(MouseFlags::LEFT_BUTTON)
  115. }
  116. /// Returns true if the right mouse button is currently down.
  117. pub fn right_button_down(&self) -> bool {
  118. self.flags.contains(MouseFlags::RIGHT_BUTTON)
  119. }
  120. /// Returns true if the right mouse button is currently up.
  121. pub fn right_button_up(&self) -> bool {
  122. !self.flags.contains(MouseFlags::RIGHT_BUTTON)
  123. }
  124. /// Returns true if the x axis has moved.
  125. pub fn x_moved(&self) -> bool {
  126. self.x != 0
  127. }
  128. /// Returns true if the y axis has moved.
  129. pub fn y_moved(&self) -> bool {
  130. self.y != 0
  131. }
  132. /// Returns true if the x or y axis has moved.
  133. pub fn moved(&self) -> bool {
  134. self.x_moved() || self.y_moved()
  135. }
  136. /// Returns the x delta of the mouse state.
  137. pub fn get_x(&self) -> i16 {
  138. self.x
  139. }
  140. /// Returns the y delta of the mouse state.
  141. pub fn get_y(&self) -> i16 {
  142. self.y
  143. }
  144. }
  145. #[derive(Debug)]
  146. #[cast_to([sync] Device, SerioDevice)]
  147. pub struct Ps2MouseDevice {
  148. inner: SpinLock<InnerPs2MouseDevice>,
  149. kobj_state: LockedKObjectState,
  150. }
  151. impl Ps2MouseDevice {
  152. pub const NAME: &'static str = "psmouse";
  153. pub fn new() -> Self {
  154. let r = Self {
  155. inner: SpinLock::new(InnerPs2MouseDevice {
  156. bus: None,
  157. class: None,
  158. driver: None,
  159. kern_inode: None,
  160. parent: None,
  161. kset: None,
  162. kobj_type: None,
  163. current_packet: 0,
  164. current_state: MouseState::new(),
  165. buf: AllocRingBuffer::new(MOUSE_BUFFER_CAPACITY),
  166. devfs_metadata: Metadata {
  167. dev_id: 1,
  168. inode_id: generate_inode_id(),
  169. size: 4096,
  170. blk_size: 0,
  171. blocks: 0,
  172. atime: PosixTimeSpec::default(),
  173. mtime: PosixTimeSpec::default(),
  174. ctime: PosixTimeSpec::default(),
  175. file_type: FileType::CharDevice, // 文件夹,block设备,char设备
  176. mode: ModeType::from_bits_truncate(0o644),
  177. nlinks: 1,
  178. uid: 0,
  179. gid: 0,
  180. raw_dev: DeviceNumber::default(), // 这里用来作为device number
  181. },
  182. device_inode_fs: None,
  183. }),
  184. kobj_state: LockedKObjectState::new(None),
  185. };
  186. return r;
  187. }
  188. pub fn init(&self) -> Result<(), SystemError> {
  189. let _irq_guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
  190. self.write_control_port(KEYBOARD_COMMAND_ENABLE_PS2_MOUSE_PORT)?;
  191. for _i in 0..1000 {
  192. for _j in 0..1000 {
  193. spin_loop();
  194. }
  195. }
  196. self.read_data_port().ok();
  197. self.send_command_to_ps2mouse(PsMouseCommand::EnablePacketStreaming)
  198. .map_err(|e| {
  199. kerror!("ps2 mouse init error: {:?}", e);
  200. e
  201. })?;
  202. self.read_data_port().ok();
  203. for _i in 0..1000 {
  204. for _j in 0..1000 {
  205. spin_loop();
  206. }
  207. }
  208. // self.send_command_to_ps2mouse(PsMouseCommand::InitKeyboard)?;
  209. self.do_send_command(DATA_PORT_ADDRESS as u8, PsMouseCommand::InitKeyboard.into())?;
  210. self.read_data_port().ok();
  211. for _i in 0..1000 {
  212. for _j in 0..1000 {
  213. spin_loop();
  214. }
  215. }
  216. self.set_sample_rate(20)?;
  217. // self.get_mouse_id()?;
  218. Ok(())
  219. }
  220. #[allow(dead_code)]
  221. pub fn get_mouse_id(&self) -> Result<(), SystemError> {
  222. self.send_command_to_ps2mouse(PsMouseCommand::GetMouseId)?;
  223. let _mouse_id = self.read_data_port()?;
  224. Ok(())
  225. }
  226. /// 设置鼠标采样率
  227. ///
  228. /// `hz` 合法值为 10,20,40,60,80,100,200
  229. pub fn set_sample_rate(&self, hz: u8) -> Result<(), SystemError> {
  230. const SAMPLE_RATE: [u8; 7] = [10, 20, 40, 60, 80, 100, 200];
  231. if !SAMPLE_RATE.contains(&hz) {
  232. return Err(SystemError::EINVAL);
  233. }
  234. self.send_command_to_ps2mouse(PsMouseCommand::SetSampleRate)?;
  235. self.read_data_port().ok();
  236. for _i in 0..1000 {
  237. for _j in 0..1000 {
  238. spin_loop();
  239. }
  240. }
  241. self.send_command_to_ps2mouse(PsMouseCommand::SampleRate(hz))?;
  242. for _i in 0..1000 {
  243. for _j in 0..1000 {
  244. spin_loop();
  245. }
  246. }
  247. self.read_data_port().ok();
  248. Ok(())
  249. }
  250. /// # 函数的功能
  251. /// 鼠标设备处理数据包
  252. pub fn process_packet(&self) -> Result<(), SystemError> {
  253. let packet = self.read_data_port()?;
  254. let mut guard = self.inner.lock();
  255. guard.buf.push(packet); // 更新缓冲区
  256. match guard.current_packet {
  257. 0 => {
  258. let flags: MouseFlags = MouseFlags::from_bits_truncate(packet);
  259. if !flags.contains(MouseFlags::ALWAYS_ONE) {
  260. return Ok(());
  261. }
  262. guard.current_state.flags = flags;
  263. }
  264. 1 => {
  265. let flags = guard.current_state.flags;
  266. if !flags.contains(MouseFlags::X_OVERFLOW) {
  267. guard.current_state.x = self.get_x_movement(packet, flags);
  268. }
  269. }
  270. 2 => {
  271. let flags = guard.current_state.flags;
  272. if !flags.contains(MouseFlags::Y_OVERFLOW) {
  273. guard.current_state.y = self.get_y_movement(packet, flags);
  274. }
  275. // kdebug!(
  276. // "Ps2MouseDevice packet : flags:{}, x:{}, y:{}\n",
  277. // guard.current_state.flags.bits,
  278. // guard.current_state.x,
  279. // guard.current_state.y
  280. // );
  281. }
  282. _ => unreachable!(),
  283. }
  284. guard.current_packet = (guard.current_packet + 1) % 3;
  285. Ok(())
  286. }
  287. fn get_x_movement(&self, packet: u8, flags: MouseFlags) -> i16 {
  288. if flags.contains(MouseFlags::X_SIGN) {
  289. return self.sign_extend(packet);
  290. } else {
  291. return packet as i16;
  292. }
  293. }
  294. fn get_y_movement(&self, packet: u8, flags: MouseFlags) -> i16 {
  295. if flags.contains(MouseFlags::Y_SIGN) {
  296. return self.sign_extend(packet);
  297. } else {
  298. return packet as i16;
  299. }
  300. }
  301. fn sign_extend(&self, packet: u8) -> i16 {
  302. ((packet as u16) | 0xFF00) as i16
  303. }
  304. fn read_data_port(&self) -> Result<u8, SystemError> {
  305. self.wait_for_write()?;
  306. let cmd = unsafe { CurrentPortIOArch::in8(ADDRESS_PORT_ADDRESS) };
  307. if (cmd & 0x21) == 0x21 {
  308. let data = unsafe { CurrentPortIOArch::in8(DATA_PORT_ADDRESS) };
  309. return Ok(data);
  310. } else {
  311. return Err(SystemError::ENODATA);
  312. }
  313. }
  314. #[inline(never)]
  315. fn send_command_to_ps2mouse(&self, command: PsMouseCommand) -> Result<(), SystemError> {
  316. self.do_send_command(KEYBOARD_COMMAND_SEND_TO_PS2_MOUSE, command.into())?;
  317. Ok(())
  318. }
  319. #[inline(never)]
  320. fn do_send_command(&self, ctrl: u8, command: u8) -> Result<(), SystemError> {
  321. self.write_control_port(ctrl)?;
  322. self.write_data_port(command)?;
  323. return Ok(());
  324. }
  325. fn write_data_port(&self, data: u8) -> Result<(), SystemError> {
  326. self.wait_for_write()?;
  327. unsafe {
  328. CurrentPortIOArch::out8(DATA_PORT_ADDRESS, data);
  329. }
  330. Ok(())
  331. }
  332. fn write_control_port(&self, command: u8) -> Result<(), SystemError> {
  333. self.wait_for_write()?;
  334. unsafe {
  335. CurrentPortIOArch::out8(ADDRESS_PORT_ADDRESS, command);
  336. }
  337. Ok(())
  338. }
  339. fn wait_for_read(&self) -> Result<(), SystemError> {
  340. let timeout = 100_000;
  341. for _ in 0..timeout {
  342. let value = unsafe { CurrentPortIOArch::in8(ADDRESS_PORT_ADDRESS) };
  343. if (value & 0x1) == 0x1 {
  344. return Ok(());
  345. }
  346. }
  347. Err(SystemError::ETIMEDOUT)
  348. }
  349. fn wait_for_write(&self) -> Result<(), SystemError> {
  350. let timeout = 100_000;
  351. for _ in 0..timeout {
  352. let value = unsafe { CurrentPortIOArch::in8(ADDRESS_PORT_ADDRESS) };
  353. if (value & 0x2) == 0 {
  354. return Ok(());
  355. }
  356. }
  357. Err(SystemError::ETIMEDOUT)
  358. }
  359. }
  360. #[derive(Debug)]
  361. struct InnerPs2MouseDevice {
  362. bus: Option<Weak<dyn Bus>>,
  363. class: Option<Weak<dyn Class>>,
  364. driver: Option<Weak<dyn Driver>>,
  365. kern_inode: Option<Arc<KernFSInode>>,
  366. parent: Option<Weak<dyn KObject>>,
  367. kset: Option<Arc<KSet>>,
  368. kobj_type: Option<&'static dyn KObjType>,
  369. /// 鼠标数据
  370. current_state: MouseState,
  371. current_packet: u8,
  372. /// 鼠标数据环形缓冲区
  373. buf: AllocRingBuffer<u8>,
  374. /// device inode要求的字段
  375. device_inode_fs: Option<Weak<DevFS>>,
  376. devfs_metadata: Metadata,
  377. }
  378. impl Device for Ps2MouseDevice {
  379. fn is_dead(&self) -> bool {
  380. false
  381. }
  382. fn dev_type(&self) -> DeviceType {
  383. DeviceType::Char
  384. }
  385. fn id_table(&self) -> IdTable {
  386. IdTable::new(self.name().to_string(), None)
  387. }
  388. fn set_bus(&self, bus: Option<alloc::sync::Weak<dyn Bus>>) {
  389. self.inner.lock_irqsave().bus = bus;
  390. }
  391. fn set_class(&self, class: Option<alloc::sync::Weak<dyn Class>>) {
  392. self.inner.lock_irqsave().class = class;
  393. }
  394. fn driver(&self) -> Option<alloc::sync::Arc<dyn Driver>> {
  395. self.inner.lock_irqsave().driver.clone()?.upgrade()
  396. }
  397. fn set_driver(&self, driver: Option<alloc::sync::Weak<dyn Driver>>) {
  398. self.inner.lock_irqsave().driver = driver;
  399. }
  400. fn can_match(&self) -> bool {
  401. true
  402. }
  403. fn set_can_match(&self, _can_match: bool) {}
  404. fn state_synced(&self) -> bool {
  405. true
  406. }
  407. fn bus(&self) -> Option<alloc::sync::Weak<dyn Bus>> {
  408. self.inner.lock_irqsave().bus.clone()
  409. }
  410. fn class(&self) -> Option<Arc<dyn Class>> {
  411. let mut guard = self.inner.lock_irqsave();
  412. let r = guard.class.clone()?.upgrade();
  413. if r.is_none() {
  414. guard.class = None;
  415. }
  416. return r;
  417. }
  418. }
  419. impl SerioDevice for Ps2MouseDevice {
  420. fn write(
  421. &self,
  422. _device: &alloc::sync::Arc<dyn SerioDevice>,
  423. _data: u8,
  424. ) -> Result<(), system_error::SystemError> {
  425. todo!()
  426. }
  427. fn open(
  428. &self,
  429. _device: &alloc::sync::Arc<dyn SerioDevice>,
  430. ) -> Result<(), system_error::SystemError> {
  431. todo!()
  432. }
  433. fn close(
  434. &self,
  435. _device: &alloc::sync::Arc<dyn SerioDevice>,
  436. ) -> Result<(), system_error::SystemError> {
  437. todo!()
  438. }
  439. fn start(
  440. &self,
  441. _device: &alloc::sync::Arc<dyn SerioDevice>,
  442. ) -> Result<(), system_error::SystemError> {
  443. todo!()
  444. }
  445. fn stop(
  446. &self,
  447. _device: &alloc::sync::Arc<dyn SerioDevice>,
  448. ) -> Result<(), system_error::SystemError> {
  449. todo!()
  450. }
  451. }
  452. impl KObject for Ps2MouseDevice {
  453. fn as_any_ref(&self) -> &dyn core::any::Any {
  454. self
  455. }
  456. fn set_inode(&self, inode: Option<alloc::sync::Arc<KernFSInode>>) {
  457. self.inner.lock_irqsave().kern_inode = inode;
  458. }
  459. fn inode(&self) -> Option<alloc::sync::Arc<KernFSInode>> {
  460. self.inner.lock_irqsave().kern_inode.clone()
  461. }
  462. fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> {
  463. self.inner.lock_irqsave().parent.clone()
  464. }
  465. fn set_parent(&self, parent: Option<alloc::sync::Weak<dyn KObject>>) {
  466. self.inner.lock_irqsave().parent = parent
  467. }
  468. fn kset(&self) -> Option<alloc::sync::Arc<KSet>> {
  469. self.inner.lock_irqsave().kset.clone()
  470. }
  471. fn set_kset(&self, kset: Option<alloc::sync::Arc<KSet>>) {
  472. self.inner.lock_irqsave().kset = kset;
  473. }
  474. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  475. self.inner.lock_irqsave().kobj_type
  476. }
  477. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  478. self.inner.lock_irqsave().kobj_type = ktype;
  479. }
  480. fn name(&self) -> alloc::string::String {
  481. Self::NAME.to_string()
  482. }
  483. fn set_name(&self, _name: alloc::string::String) {}
  484. fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
  485. self.kobj_state.read()
  486. }
  487. fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
  488. self.kobj_state.write()
  489. }
  490. fn set_kobj_state(&self, state: KObjectState) {
  491. *self.kobj_state.write() = state;
  492. }
  493. }
  494. impl DeviceINode for Ps2MouseDevice {
  495. fn set_fs(&self, fs: Weak<DevFS>) {
  496. self.inner.lock_irqsave().device_inode_fs = Some(fs);
  497. }
  498. }
  499. impl IndexNode for Ps2MouseDevice {
  500. fn open(
  501. &self,
  502. _data: SpinLockGuard<FilePrivateData>,
  503. _mode: &crate::filesystem::vfs::file::FileMode,
  504. ) -> Result<(), SystemError> {
  505. let mut guard = self.inner.lock_irqsave();
  506. guard.buf.clear();
  507. Ok(())
  508. }
  509. fn close(&self, _data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> {
  510. let mut guard = self.inner.lock_irqsave();
  511. guard.buf.clear();
  512. Ok(())
  513. }
  514. fn read_at(
  515. &self,
  516. _offset: usize,
  517. _len: usize,
  518. buf: &mut [u8],
  519. _data: SpinLockGuard<FilePrivateData>,
  520. ) -> Result<usize, SystemError> {
  521. let mut guard = self.inner.lock_irqsave();
  522. if guard.buf.len() >= 3 {
  523. for item in buf.iter_mut().take(3) {
  524. *item = guard.buf.dequeue().unwrap();
  525. }
  526. return Ok(3);
  527. } else {
  528. return Ok(0);
  529. }
  530. }
  531. fn write_at(
  532. &self,
  533. _offset: usize,
  534. _len: usize,
  535. _buf: &[u8],
  536. _data: SpinLockGuard<FilePrivateData>,
  537. ) -> Result<usize, SystemError> {
  538. return Err(SystemError::ENOSYS);
  539. }
  540. fn fs(&self) -> Arc<dyn FileSystem> {
  541. self.inner
  542. .lock_irqsave()
  543. .device_inode_fs
  544. .as_ref()
  545. .unwrap()
  546. .upgrade()
  547. .unwrap()
  548. }
  549. fn as_any_ref(&self) -> &dyn core::any::Any {
  550. self
  551. }
  552. fn list(&self) -> Result<Vec<alloc::string::String>, SystemError> {
  553. todo!()
  554. }
  555. fn metadata(&self) -> Result<Metadata, SystemError> {
  556. Ok(self.inner.lock_irqsave().devfs_metadata.clone())
  557. }
  558. fn resize(&self, _len: usize) -> Result<(), SystemError> {
  559. Ok(())
  560. }
  561. fn dname(&self) -> Result<DName, SystemError> {
  562. Ok(DName::from(self.name()))
  563. }
  564. }
  565. impl Ps2Device for Ps2MouseDevice {}
  566. pub fn rs_ps2_mouse_device_init(parent: Arc<dyn KObject>) -> Result<(), SystemError> {
  567. kdebug!("ps2_mouse_device initializing...");
  568. let psmouse = Arc::new(Ps2MouseDevice::new());
  569. device_manager().device_default_initialize(&(psmouse.clone() as Arc<dyn Device>));
  570. psmouse.set_parent(Some(Arc::downgrade(&parent)));
  571. serio_device_manager().register_port(psmouse.clone() as Arc<dyn SerioDevice>)?;
  572. devfs_register(&psmouse.name(), psmouse.clone()).map_err(|e| {
  573. kerror!(
  574. "register psmouse device '{}' to devfs failed: {:?}",
  575. psmouse.name(),
  576. e
  577. );
  578. device_manager().remove(&(psmouse.clone() as Arc<dyn Device>));
  579. e
  580. })?;
  581. unsafe { PS2_MOUSE_DEVICE = Some(psmouse) };
  582. return Ok(());
  583. }