Skip to content

Instantly share code, notes, and snippets.

@bzar

bzar/test_rtc.c Secret

Created August 4, 2022 12:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bzar/f7bbdd0ca5c3d92fac8c3a4408c8054c to your computer and use it in GitHub Desktop.
Save bzar/f7bbdd0ca5c3d92fac8c3a4408c8054c to your computer and use it in GitHub Desktop.
#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/rtc.h>
#include <fcntl.h>
#include <unistd.h>
int main() {
int fd = open("/dev/rtc0", O_RDONLY);
if(fd == -1) {
printf("Error opening /dev/rtc0\n");
return 1;
}
struct rtc_time rtc_tm;
printf("Reading previous alarm\n");
if(ioctl(fd, RTC_ALM_READ, &rtc_tm) == -1) {
printf("Error reading alarm\n");
return 1;
}
printf("Previous RTC alarm date/time is %d-%d-%d, %02d:%02d:%02d.\n",
rtc_tm.tm_year + 1900, rtc_tm.tm_mon + 1, rtc_tm.tm_mday,
rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
printf("Reading current time\n");
if(ioctl(fd, RTC_RD_TIME, &rtc_tm) == -1) {
printf("Error reading current time\n");
return 1;
}
printf("Current RTC date/time is %d-%d-%d, %02d:%02d:%02d.\n",
rtc_tm.tm_year + 1900, rtc_tm.tm_mon + 1, rtc_tm.tm_mday,
rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
printf("Setting alarm\n");
rtc_tm.tm_sec += 10;
if (rtc_tm.tm_sec >= 60) {
rtc_tm.tm_sec %= 60;
rtc_tm.tm_min++;
}
if (rtc_tm.tm_min == 60) {
rtc_tm.tm_min = 0;
rtc_tm.tm_hour++;
}
if (rtc_tm.tm_hour == 24) {
rtc_tm.tm_hour = 0;
}
printf("Alarm date/time is %d-%d-%d, %02d:%02d:%02d.\n",
rtc_tm.tm_year + 1900, rtc_tm.tm_mon + 1, rtc_tm.tm_mday,
rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
if(ioctl(fd, RTC_ALM_SET, &rtc_tm) == -1) {
printf("Error setting alarm\n");
return 1;
}
printf("Enabling alarm interrupts\n");
if(ioctl(fd, RTC_AIE_ON, 0) == -1) {
printf("Error enabling alarm interrupt\n");
return 1;
}
printf("Reading alarm back\n");
if(ioctl(fd, RTC_ALM_READ, &rtc_tm) == -1) {
printf("Error reading alarm\n");
return 1;
}
printf("Current RTC alarm date/time is %d-%d-%d, %02d:%02d:%02d.\n",
rtc_tm.tm_year + 1900, rtc_tm.tm_mon + 1, rtc_tm.tm_mday,
rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec);
printf("Enabling alarm interrupts AGAIN\n");
if(ioctl(fd, RTC_AIE_ON, 0) == -1) {
printf("Error enabling alarm interrupt AGAIN\n");
return 1;
}
printf("Flushing I/O...\n");
sync();
fflush(stdout);
usleep(10 * 1000);
printf("Waiting for alarm...\n");
unsigned long dummy;
if(read(fd, &dummy, sizeof(dummy)) == -1) {
printf("Error waiting for alarm interrupt\n");
return 1;
}
/*
printf("Suspending to memory\n");
int power = open("/sys/power/state", O_WRONLY);
if(write(power, "mem", 3) == -1) {
printf("Error suspending\n");
return 1;
}
close(power);
*/
printf("Alarm detected!\n");
printf("Disabling alarm interrupts\n");
if(ioctl(fd, RTC_AIE_OFF, 0) == -1) {
printf("Error disabling alarm interrupt\n");
return 1;
}
close(fd);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment