From 34288fea43407fcf4ff530dea89030d656055804 Mon Sep 17 00:00:00 2001 From: Barry Wardell Date: Wed, 14 Nov 2007 16:53:31 +0000 Subject: FS#8157: H10 RTC alarm with some changes by me. The settings keymap had to be changed slightly, but it seems to work better for all setting screens with the new keymap. Thanks to git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15620 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/rtc/rtc_e8564.c | 138 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 133 insertions(+), 5 deletions(-) (limited to 'firmware/drivers/rtc/rtc_e8564.c') diff --git a/firmware/drivers/rtc/rtc_e8564.c b/firmware/drivers/rtc/rtc_e8564.c index c3ae9349f4..0e81ee276d 100644 --- a/firmware/drivers/rtc/rtc_e8564.c +++ b/firmware/drivers/rtc/rtc_e8564.c @@ -7,7 +7,8 @@ * \/ \/ \/ \/ \/ * $Id$ * - * Copyright (C) 2002 by Linus Nielsen Feltzing, Uwe Freese, Laurent Baum + * Copyright (C) 2002 by Linus Nielsen Feltzing, Uwe Freese, Laurent Baum, + * Przemyslaw Holubowski * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. @@ -25,12 +26,27 @@ #include /* RTC registers */ -#define RTC_CTRL1 0x00 -#define RTC_CTRL2 0x01 +#define RTC_CTRL1 0x00 +#define RTC_CTRL2 0x01 +#define RTC_ALARM_MINUTES 0x09 +#define RTC_ALARM_HOURS 0x0A +#define RTC_ALARM_DAY 0x0B +#define RTC_ALARM_WDAY 0x0C +#define RTC_TIMER_CTRL 0x0E +#define RTC_TIMER 0x0F /* Control 2 register flags */ -#define RTC_TF 0x04 -#define RTC_AF 0x08 +#define RTC_TIE 0x01 +#define RTC_AIE 0x02 +#define RTC_TF 0x04 +#define RTC_AF 0x08 +#define RTC_TI_TP 0x10 + +/* Alarm registers flags */ +#define RTC_AE 0x80 + +/* Timer register flags */ +#define RTC_TE 0x80 void rtc_init(void) { @@ -82,3 +98,115 @@ int rtc_write_datetime(unsigned char* buf) return 1; } +void rtc_set_alarm(int h, int m) +{ + unsigned char buf[4]={0}; + int rv=0; + int i=0; + + /* clear alarm interrupt */ + rv = i2c_readbytes(0x51,RTC_CTRL2,1,buf); + buf[0] &= RTC_AF; + pp_i2c_send(0x51, RTC_CTRL2,buf[0]); + + /* prepare new alarm */ + if( m >= 0 ) + buf[0] = (((m/10) << 4) | m%10); + else + /* ignore minutes comparison query */ + buf[0] = RTC_AE; + + if( h >= 0 ) + buf[1] = (((h/10) << 4) | h%10); + else + /* ignore hours comparison query */ + buf[1] = RTC_AE; + + /* ignore day and wday */ + buf[2] = RTC_AE; + buf[3] = RTC_AE; + + /* write new alarm */ + for(;i<4;i++) + pp_i2c_send(0x51, RTC_ALARM_MINUTES+i,buf[i]); + + /* note: alarm is not enabled at the point */ +} + +void rtc_get_alarm(int *h, int *m) +{ + unsigned char buf[4]={0}; + + /* get alarm preset */ + i2c_readbytes(0x51, RTC_ALARM_MINUTES,4,buf); + + *m = ((buf[0] >> 4) & 0x7)*10 + (buf[0] & 0x0f); + *h = ((buf[1] >> 4) & 0x3)*10 + (buf[1] & 0x0f); + +} + +bool rtc_enable_alarm(bool enable) +{ + unsigned char tmp=0; + int rv=0; + + if(enable) + { + /* enable alarm interrupt */ + rv = i2c_readbytes(0x51,RTC_CTRL2,1,&tmp); + tmp |= RTC_AIE; + pp_i2c_send(0x51, RTC_CTRL2,tmp); + } + else + { + /* disable alarm interrupt */ + rv = i2c_readbytes(0x51,RTC_CTRL2,1,&tmp); + tmp &= ~RTC_AIE; + pp_i2c_send(0x51, RTC_CTRL2,tmp); + } + + return false; +} + +bool rtc_check_alarm_started(bool release_alarm) +{ + static bool alarm_state, run_before = false; + unsigned char tmp=0; + bool started; + int rv=0; + + if (run_before) + { + started = alarm_state; + alarm_state &= ~release_alarm; + } + else + { + /* read Control 2 register which contains alarm flag */ + rv = i2c_readbytes(0x51,RTC_CTRL2,1,&tmp); + + alarm_state = started = tmp & (RTC_AF | RTC_AIE); + + if(release_alarm) + { + rv = i2c_readbytes(0x51,RTC_CTRL2,1,&tmp); + /* clear alarm interrupt enable and alarm flag */ + tmp &= ~(RTC_AF | RTC_AIE); + pp_i2c_send(0x51, RTC_CTRL2,tmp); + } + run_before = true; + } + + return started; +} + +bool rtc_check_alarm_flag(void) +{ + unsigned char tmp=0; + int rv=0; + + /* read Control 2 register which contains alarm flag */ + rv = i2c_readbytes(0x51,RTC_CTRL2,1,&tmp); + + return (tmp & RTC_AF); +} -- cgit v1.2.3