Talk:Wishlist/Alarm daemon

From Openmoko

(Difference between revisions)
Jump to: navigation, search
m
 

Latest revision as of 19:00, 12 March 2010

After asking on the mailing list how to wake up a system on specific time I was asked to document what I found out.

The fist one is a C program (may be run on x86) which shows what are the request codes for different ioctl calls:

#include <stdio.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>

int main() {
	printf("RTC_RD_TIME = %d\n", RTC_RD_TIME);
	printf("RTC_SET_TIME = %d\n", RTC_SET_TIME);
	printf("RTC_ALM_READ = %d\n", RTC_ALM_READ);
	printf("RTC_ALM_SET = %d\n", RTC_ALM_SET);
	printf("RTC_IRQP_READ = %d\n", RTC_IRQP_READ);
	printf("RTC_IRQP_SET = %d\n", RTC_IRQP_SET);
	printf("RTC_AIE_ON = %d\n", RTC_AIE_ON);
	printf("RTC_AIE_OFF = %d\n", RTC_AIE_OFF);
	printf("RTC_UIE_ON = %d\n", RTC_UIE_ON);
	printf("RTC_UIE_OFF = %d\n", RTC_UIE_OFF);
	printf("RTC_PIE_ON = %d\n", RTC_PIE_ON);
	printf("RTC_PIE_OFF = %d\n", RTC_PIE_OFF);
	printf("RTC_EPOCH_READ = %d\n", RTC_EPOCH_READ);
	printf("RTC_EPOCH_SET = %d\n", RTC_EPOCH_SET);
}

This sample script wake up the system after 5 minutes. It requires python-fcntl and python-datetime to run.

import fcntl, struct, datetime

RTC_RD_TIME = -2145095671
RTC_SET_TIME = 1076129802
RTC_ALM_READ = -2145095672
RTC_ALM_SET = 1076129799
RTC_IRQP_READ = -2147192821
RTC_IRQP_SET = 1074032652
RTC_AIE_ON = 28673
RTC_AIE_OFF = 28674
RTC_UIE_ON = 28675
RTC_UIE_OFF = 28676
RTC_PIE_ON = 28677
RTC_PIE_OFF = 28678
RTC_EPOCH_READ = -2147192819
RTC_EPOCH_SET = 1074032654
	
def pack_data(data):
        return struct.pack('iiiiiiiii',
                           data.second, data.minute, data.hour,
                           data.day, data.month - 1, data.year - 1900,
                           0, 0, 0);

def unpack_data(rtc_data):
        data = struct.unpack('iiiiiiiii', rtc_data)
        datetime.datetime(rtc_data[5] + 1900, rtc_data[4] + 1, rtc_data[3],
                          rtc_data[2], rtc_data[1], rtc_data[0])

rtc = open("/dev/rtc0", "r")
fcntl.ioctl(rtc, RTC_ALM_SET,
            pack_data(datetime.datetime.utcnow() +
                      datetime.timedelta(0, 5*60)))
fcntl.ioctl(rtc, RTC_AIE_ON, 0) # In this call the 3rd argument is ignored

Please note however that the year, month and day are ignore while setting the interrupt. Also the /dev/rtc device do not seems to work.

About the powering down. It can be handle by script that: - Normally a interrupt will be set some time before alarm - On shutdown the interrupt is move a bit into future

--Uzytkownik 19:49, 31 July 2008 (UTC)

Personal tools

After asking on the mailing list how to wake up a system on specific time I was asked to document what I found out.

The fist one is a C program (may be run on x86) which shows what are the request codes for different ioctl calls:

#include <stdio.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>

int main() {
	printf("RTC_RD_TIME = %d\n", RTC_RD_TIME);
	printf("RTC_SET_TIME = %d\n", RTC_SET_TIME);
	printf("RTC_ALM_READ = %d\n", RTC_ALM_READ);
	printf("RTC_ALM_SET = %d\n", RTC_ALM_SET);
	printf("RTC_IRQP_READ = %d\n", RTC_IRQP_READ);
	printf("RTC_IRQP_SET = %d\n", RTC_IRQP_SET);
	printf("RTC_AIE_ON = %d\n", RTC_AIE_ON);
	printf("RTC_AIE_OFF = %d\n", RTC_AIE_OFF);
	printf("RTC_UIE_ON = %d\n", RTC_UIE_ON);
	printf("RTC_UIE_OFF = %d\n", RTC_UIE_OFF);
	printf("RTC_PIE_ON = %d\n", RTC_PIE_ON);
	printf("RTC_PIE_OFF = %d\n", RTC_PIE_OFF);
	printf("RTC_EPOCH_READ = %d\n", RTC_EPOCH_READ);
	printf("RTC_EPOCH_SET = %d\n", RTC_EPOCH_SET);
}

This sample script wake up the system after 5 minutes. It requires python-fcntl and python-datetime to run.

import fcntl, struct, datetime

RTC_RD_TIME = -2145095671
RTC_SET_TIME = 1076129802
RTC_ALM_READ = -2145095672
RTC_ALM_SET = 1076129799
RTC_IRQP_READ = -2147192821
RTC_IRQP_SET = 1074032652
RTC_AIE_ON = 28673
RTC_AIE_OFF = 28674
RTC_UIE_ON = 28675
RTC_UIE_OFF = 28676
RTC_PIE_ON = 28677
RTC_PIE_OFF = 28678
RTC_EPOCH_READ = -2147192819
RTC_EPOCH_SET = 1074032654
	
def pack_data(data):
        return struct.pack('iiiiiiiii',
                           data.second, data.minute, data.hour,
                           data.day, data.month - 1, data.year - 1900,
                           0, 0, 0);

def unpack_data(rtc_data):
        data = struct.unpack('iiiiiiiii', rtc_data)
        datetime.datetime(rtc_data[5] + 1900, rtc_data[4] + 1, rtc_data[3],
                          rtc_data[2], rtc_data[1], rtc_data[0])

rtc = open("/dev/rtc0", "r")
fcntl.ioctl(rtc, RTC_ALM_SET,
            pack_data(datetime.datetime.utcnow() +
                      datetime.timedelta(0, 5*60)))
fcntl.ioctl(rtc, RTC_AIE_ON, 0) # In this call the 3rd argument is ignored

Please note however that the year, month and day are ignore while setting the interrupt. Also the /dev/rtc device do not seems to work.

About the powering down. It can be handle by script that: - Normally a interrupt will be set some time before alarm - On shutdown the interrupt is move a bit into future

--Uzytkownik 19:49, 31 July 2008 (UTC)