class.rs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. use alloc::{
  2. string::ToString,
  3. sync::{Arc, Weak},
  4. };
  5. use log::info;
  6. use system_error::SystemError;
  7. use unified_init::macros::unified_init;
  8. use crate::{
  9. driver::base::{
  10. class::{class_manager, Class},
  11. device::{device_manager, sys_dev_char_kset, CommonAttrGroup},
  12. kobject::KObject,
  13. subsys::SubSysPrivate,
  14. },
  15. filesystem::sysfs::AttributeGroup,
  16. init::initcall::INITCALL_SUBSYS,
  17. time::{timekeeping::do_settimeofday64, PosixTimeSpec},
  18. };
  19. use super::{interface::rtc_read_time, register_default_rtc, sysfs::RtcGeneralDevice};
  20. /// `/sys/class/rtc` 的 class 实例
  21. static mut CLASS_RTC_INSTANCE: Option<Arc<RtcClass>> = None;
  22. /// 获取 `/sys/class/rtc` 的 class 实例
  23. #[inline(always)]
  24. #[allow(dead_code)]
  25. pub fn sys_class_rtc_instance() -> Option<&'static Arc<RtcClass>> {
  26. unsafe { CLASS_RTC_INSTANCE.as_ref() }
  27. }
  28. /// 初始化帧缓冲区子系统
  29. #[unified_init(INITCALL_SUBSYS)]
  30. pub fn fbmem_init() -> Result<(), SystemError> {
  31. let rtc_class = RtcClass::new();
  32. class_manager().class_register(&(rtc_class.clone() as Arc<dyn Class>))?;
  33. unsafe {
  34. CLASS_RTC_INSTANCE = Some(rtc_class);
  35. }
  36. return Ok(());
  37. }
  38. /// `/sys/class/rtc` 类
  39. #[derive(Debug)]
  40. pub struct RtcClass {
  41. subsystem: SubSysPrivate,
  42. }
  43. impl RtcClass {
  44. const NAME: &'static str = "rtc";
  45. pub fn new() -> Arc<Self> {
  46. let r = Self {
  47. subsystem: SubSysPrivate::new(Self::NAME.to_string(), None, None, &[]),
  48. };
  49. let r = Arc::new(r);
  50. r.subsystem()
  51. .set_class(Some(Arc::downgrade(&r) as Weak<dyn Class>));
  52. return r;
  53. }
  54. }
  55. impl Class for RtcClass {
  56. fn name(&self) -> &'static str {
  57. return Self::NAME;
  58. }
  59. fn dev_kobj(&self) -> Option<Arc<dyn KObject>> {
  60. Some(sys_dev_char_kset() as Arc<dyn KObject>)
  61. }
  62. fn set_dev_kobj(&self, _kobj: Arc<dyn KObject>) {
  63. unimplemented!("RtcClass::set_dev_kobj");
  64. }
  65. fn subsystem(&self) -> &SubSysPrivate {
  66. return &self.subsystem;
  67. }
  68. fn dev_groups(&self) -> &'static [&'static dyn AttributeGroup] {
  69. return &[&CommonAttrGroup];
  70. }
  71. }
  72. /// 注册rtc通用设备
  73. pub(super) fn rtc_register_device(dev: &Arc<RtcGeneralDevice>) -> Result<(), SystemError> {
  74. device_manager().add_device(dev.clone())?;
  75. register_default_rtc(dev.clone());
  76. // 把硬件时间同步到系统时间
  77. rtc_hctosys(dev);
  78. return Ok(());
  79. }
  80. fn rtc_hctosys(dev: &Arc<RtcGeneralDevice>) {
  81. let r = rtc_read_time(dev);
  82. if let Err(e) = r {
  83. dev.set_hc2sys_result(Err(e));
  84. return;
  85. }
  86. let time = r.unwrap();
  87. let timespec64: PosixTimeSpec = time.into();
  88. let r = do_settimeofday64(timespec64);
  89. dev.set_hc2sys_result(r);
  90. info!(
  91. "Setting system clock to {} {} UTC ({})",
  92. time.date_string(),
  93. time.time_string(),
  94. timespec64.tv_sec
  95. );
  96. }