1 #include <lunaix/fs/twifs.h>
2 #include <lunaix/fs/twimap.h>
3 #include <lunaix/mm/valloc.h>
4 #include <lunaix/status.h>
8 const struct hwrtc* sysrtc;
9 static int rtc_count = 0;
14 hwrtc_walltime(datetime_t* dt)
16 sysrtc->get_walltime(sysrtc, dt);
20 hwrtc_ioctl(struct device* dev, u32_t req, va_list args)
22 struct hwrtc* rtc = (struct hwrtc*)dev->underlay;
31 datetime_t* dt = va_arg(args, datetime_t*);
32 rtc->set_walltime(rtc, dt);
35 ticks_t* freq = va_arg(args, ticks_t*);
41 return rtc->chfreq(rtc, *freq);
44 *freq = rtc->base_freq;
55 hwrtc_read(struct device* dev, void* buf, size_t offset, size_t len)
57 struct hwrtc* rtc = (struct hwrtc*)dev->underlay;
58 *((ticks_t*)buf) = rtc->get_counts(rtc);
60 return sizeof(ticks_t);
64 hwrtc_alloc_new(char* name)
66 struct hwrtc* rtc_instance = valloc(sizeof(struct hwrtc));
72 llist_append(&rtcs, &rtc_instance->rtc_list);
74 rtc_instance->id = rtc_count++;
75 rtc_instance->name = name;
76 struct device* rtcdev = device_allocsys(NULL, rtc_instance);
78 rtcdev->ops.exec_cmd = hwrtc_ioctl;
79 rtcdev->ops.read = hwrtc_read;
81 rtc_instance->rtc_dev = rtcdev;
87 hwrtc_register(struct devclass* class, struct hwrtc* rtc)
89 if (unlikely(!sysrtc)) {
93 class->variant = rtc->id;
94 register_device(rtc->rtc_dev, class, "rtc%d", rtc->id);
98 __hwrtc_readinfo(struct twimap* mapping)
100 struct hwrtc* rtc = twimap_data(mapping, struct hwrtc*);
101 twimap_printf(mapping, "name: %s\n", rtc->name);
102 twimap_printf(mapping, "frequency: %dHz\n", rtc->base_freq);
103 twimap_printf(mapping, "ticks count: %d\n", rtc->get_counts(rtc));
104 twimap_printf(mapping,
106 (rtc->state & RTC_STATE_MASKED) ? "no" : "yes");
109 rtc->get_walltime(rtc, &dt);
112 mapping, "recorded date: %d/%d/%d\n", dt.year, dt.month, dt.day);
114 mapping, "recorded time: %d:%d:%d\n", dt.hour, dt.minute, dt.second);
115 twimap_printf(mapping, "recorded weekday: %d\n", dt.weekday);
119 hwrtc_twifs_export(struct hwrtc* rtc)
121 const char* name = rtc->rtc_dev->name.value;
122 struct twimap* rtc_mapping = twifs_mapping(NULL, rtc, name);
123 rtc_mapping->read = __hwrtc_readinfo;
127 hwrtc_twifs_export_all()
129 struct hwrtc *pos, *next;
130 llist_for_each(pos, next, &rtcs, rtc_list)
132 hwrtc_twifs_export(pos);
135 EXPORT_TWIFS_PLUGIN(rtc_fsexport, hwrtc_twifs_export_all);