bus.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. use super::{LockedSysFSInode, SYS_BUS_INODE};
  2. use crate::{filesystem::vfs::IndexNode, kdebug, syscall::SystemError};
  3. use alloc::sync::Arc;
  4. /// @brief: 注册bus,在sys/bus下生成文件夹
  5. /// @parameter bus_name: 总线文件夹名
  6. /// @return: 操作成功,返回inode,操作失败,返回错误码
  7. #[inline]
  8. #[allow(dead_code)]
  9. pub fn bus_register(bus_name: &str) -> Result<Arc<dyn IndexNode>, SystemError> {
  10. let binding: Arc<dyn IndexNode> = SYS_BUS_INODE();
  11. kdebug!("Before bus_register: ls /sys/bus/: {:?}", binding.list());
  12. binding
  13. .as_any_ref()
  14. .downcast_ref::<LockedSysFSInode>()
  15. .ok_or(SystemError::E2BIG)
  16. .unwrap()
  17. .add_dir(bus_name)
  18. }
  19. /// @brief: 注销bus,在sys/bus删除文件夹
  20. /// @parameter bus_name: 总线文件夹名
  21. /// @return: 操作成功,返回(),操作失败,返回错误码
  22. #[inline]
  23. #[allow(dead_code)]
  24. pub fn bus_unregister(bus_name: &str) -> Result<(), SystemError> {
  25. let binding: Arc<dyn IndexNode> = SYS_BUS_INODE();
  26. binding
  27. .as_any_ref()
  28. .downcast_ref::<LockedSysFSInode>()
  29. .ok_or(SystemError::E2BIG)
  30. .unwrap()
  31. .remove(bus_name)
  32. }
  33. /// @brief: 在相应总线文件夹下生成devices和drivers文件夹
  34. /// @parameter inode: 总线文件夹inode
  35. /// @return: 操作成功,返回devices inode和drivers inode,操作失败,返回错误码
  36. #[inline]
  37. #[allow(dead_code)]
  38. pub fn bus_init(
  39. inode: &Arc<dyn IndexNode>,
  40. ) -> Result<(Arc<dyn IndexNode>, Arc<dyn IndexNode>), SystemError> {
  41. match inode.as_any_ref().downcast_ref::<LockedSysFSInode>() {
  42. Some(lock_bus) => match lock_bus.add_dir("devices") {
  43. Ok(devices) => match lock_bus.add_dir("drivers") {
  44. Ok(drivers) => Ok((devices, drivers)),
  45. Err(err) => Err(err),
  46. },
  47. Err(err) => Err(err),
  48. },
  49. None => Err(SystemError::E2BIG),
  50. }
  51. }