summaryrefslogtreecommitdiff
path: root/firmware/drivers/rtc
diff options
context:
space:
mode:
authorBarry Wardell <rockbox@barrywardell.net>2007-11-14 16:53:31 +0000
committerBarry Wardell <rockbox@barrywardell.net>2007-11-14 16:53:31 +0000
commit34288fea43407fcf4ff530dea89030d656055804 (patch)
treeff62742953f342849b7e21cc4b538de38f97ff1a /firmware/drivers/rtc
parente18125eec2bc4d48cb8857313b52d458bc352075 (diff)
downloadrockbox-34288fea43407fcf4ff530dea89030d656055804.tar.gz
rockbox-34288fea43407fcf4ff530dea89030d656055804.zip
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
Diffstat (limited to 'firmware/drivers/rtc')
-rw-r--r--firmware/drivers/rtc/rtc_e8564.c138
1 files changed, 133 insertions, 5 deletions
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 @@
7 * \/ \/ \/ \/ \/ 7 * \/ \/ \/ \/ \/
8 * $Id$ 8 * $Id$
9 * 9 *
10 * Copyright (C) 2002 by Linus Nielsen Feltzing, Uwe Freese, Laurent Baum 10 * Copyright (C) 2002 by Linus Nielsen Feltzing, Uwe Freese, Laurent Baum,
11 * Przemyslaw Holubowski
11 * 12 *
12 * All files in this archive are subject to the GNU General Public License. 13 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement. 14 * See the file COPYING in the source tree root for full license agreement.
@@ -25,12 +26,27 @@
25#include <stdbool.h> 26#include <stdbool.h>
26 27
27/* RTC registers */ 28/* RTC registers */
28#define RTC_CTRL1 0x00 29#define RTC_CTRL1 0x00
29#define RTC_CTRL2 0x01 30#define RTC_CTRL2 0x01
31#define RTC_ALARM_MINUTES 0x09
32#define RTC_ALARM_HOURS 0x0A
33#define RTC_ALARM_DAY 0x0B
34#define RTC_ALARM_WDAY 0x0C
35#define RTC_TIMER_CTRL 0x0E
36#define RTC_TIMER 0x0F
30 37
31/* Control 2 register flags */ 38/* Control 2 register flags */
32#define RTC_TF 0x04 39#define RTC_TIE 0x01
33#define RTC_AF 0x08 40#define RTC_AIE 0x02
41#define RTC_TF 0x04
42#define RTC_AF 0x08
43#define RTC_TI_TP 0x10
44
45/* Alarm registers flags */
46#define RTC_AE 0x80
47
48/* Timer register flags */
49#define RTC_TE 0x80
34 50
35void rtc_init(void) 51void rtc_init(void)
36{ 52{
@@ -82,3 +98,115 @@ int rtc_write_datetime(unsigned char* buf)
82 return 1; 98 return 1;
83} 99}
84 100
101void rtc_set_alarm(int h, int m)
102{
103 unsigned char buf[4]={0};
104 int rv=0;
105 int i=0;
106
107 /* clear alarm interrupt */
108 rv = i2c_readbytes(0x51,RTC_CTRL2,1,buf);
109 buf[0] &= RTC_AF;
110 pp_i2c_send(0x51, RTC_CTRL2,buf[0]);
111
112 /* prepare new alarm */
113 if( m >= 0 )
114 buf[0] = (((m/10) << 4) | m%10);
115 else
116 /* ignore minutes comparison query */
117 buf[0] = RTC_AE;
118
119 if( h >= 0 )
120 buf[1] = (((h/10) << 4) | h%10);
121 else
122 /* ignore hours comparison query */
123 buf[1] = RTC_AE;
124
125 /* ignore day and wday */
126 buf[2] = RTC_AE;
127 buf[3] = RTC_AE;
128
129 /* write new alarm */
130 for(;i<4;i++)
131 pp_i2c_send(0x51, RTC_ALARM_MINUTES+i,buf[i]);
132
133 /* note: alarm is not enabled at the point */
134}
135
136void rtc_get_alarm(int *h, int *m)
137{
138 unsigned char buf[4]={0};
139
140 /* get alarm preset */
141 i2c_readbytes(0x51, RTC_ALARM_MINUTES,4,buf);
142
143 *m = ((buf[0] >> 4) & 0x7)*10 + (buf[0] & 0x0f);
144 *h = ((buf[1] >> 4) & 0x3)*10 + (buf[1] & 0x0f);
145
146}
147
148bool rtc_enable_alarm(bool enable)
149{
150 unsigned char tmp=0;
151 int rv=0;
152
153 if(enable)
154 {
155 /* enable alarm interrupt */
156 rv = i2c_readbytes(0x51,RTC_CTRL2,1,&tmp);
157 tmp |= RTC_AIE;
158 pp_i2c_send(0x51, RTC_CTRL2,tmp);
159 }
160 else
161 {
162 /* disable alarm interrupt */
163 rv = i2c_readbytes(0x51,RTC_CTRL2,1,&tmp);
164 tmp &= ~RTC_AIE;
165 pp_i2c_send(0x51, RTC_CTRL2,tmp);
166 }
167
168 return false;
169}
170
171bool rtc_check_alarm_started(bool release_alarm)
172{
173 static bool alarm_state, run_before = false;
174 unsigned char tmp=0;
175 bool started;
176 int rv=0;
177
178 if (run_before)
179 {
180 started = alarm_state;
181 alarm_state &= ~release_alarm;
182 }
183 else
184 {
185 /* read Control 2 register which contains alarm flag */
186 rv = i2c_readbytes(0x51,RTC_CTRL2,1,&tmp);
187
188 alarm_state = started = tmp & (RTC_AF | RTC_AIE);
189
190 if(release_alarm)
191 {
192 rv = i2c_readbytes(0x51,RTC_CTRL2,1,&tmp);
193 /* clear alarm interrupt enable and alarm flag */
194 tmp &= ~(RTC_AF | RTC_AIE);
195 pp_i2c_send(0x51, RTC_CTRL2,tmp);
196 }
197 run_before = true;
198 }
199
200 return started;
201}
202
203bool rtc_check_alarm_flag(void)
204{
205 unsigned char tmp=0;
206 int rv=0;
207
208 /* read Control 2 register which contains alarm flag */
209 rv = i2c_readbytes(0x51,RTC_CTRL2,1,&tmp);
210
211 return (tmp & RTC_AF);
212}