diff options
author | Uwe Freese <thebreaker@rockbox.org> | 2003-01-22 12:50:34 +0000 |
---|---|---|
committer | Uwe Freese <thebreaker@rockbox.org> | 2003-01-22 12:50:34 +0000 |
commit | 86352ccc3f47bc0f6bdcdcdc7b752f0836900fcd (patch) | |
tree | 6bb892fcae88e04a3a45239236cd3dde97d8d7ce /firmware/drivers | |
parent | fa2229559802f7066b55cc2ab0761c9e742658f7 (diff) | |
download | rockbox-86352ccc3f47bc0f6bdcdcdc7b752f0836900fcd.tar.gz rockbox-86352ccc3f47bc0f6bdcdcdc7b752f0836900fcd.zip |
Code for alarm mod. Enable with adding -DHAVE_ALARM_MOD in Makefile (EXTRA_DEFINES).
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@3150 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/drivers')
-rw-r--r-- | firmware/drivers/rtc.c | 80 | ||||
-rw-r--r-- | firmware/drivers/rtc.h | 13 |
2 files changed, 90 insertions, 3 deletions
diff --git a/firmware/drivers/rtc.c b/firmware/drivers/rtc.c index d052247986..20b0b00a75 100644 --- a/firmware/drivers/rtc.c +++ b/firmware/drivers/rtc.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * \/ \/ \/ \/ \/ | 7 | * \/ \/ \/ \/ \/ |
8 | * $Id$ | 8 | * $Id$ |
9 | * | 9 | * |
10 | * Copyright (C) 2002 by Linus Nielsen Feltzing | 10 | * Copyright (C) 2002 by Linus Nielsen Feltzing, Uwe Freese |
11 | * | 11 | * |
12 | * All files in this archive are subject to the GNU General Public License. | 12 | * 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. | 13 | * See the file COPYING in the source tree root for full license agreement. |
@@ -20,6 +20,7 @@ | |||
20 | #ifdef HAVE_RTC | 20 | #ifdef HAVE_RTC |
21 | #include "i2c.h" | 21 | #include "i2c.h" |
22 | #include "rtc.h" | 22 | #include "rtc.h" |
23 | #include <stdbool.h> | ||
23 | 24 | ||
24 | #define RTC_ADR 0xd0 | 25 | #define RTC_ADR 0xd0 |
25 | #define RTC_DEV_WRITE (RTC_ADR | 0x00) | 26 | #define RTC_DEV_WRITE (RTC_ADR | 0x00) |
@@ -43,8 +44,85 @@ void rtc_init(void) | |||
43 | data &= ~0x40; | 44 | data &= ~0x40; |
44 | rtc_write(0x0c,data); | 45 | rtc_write(0x0c,data); |
45 | } | 46 | } |
47 | |||
48 | #ifdef HAVE_ALARM_MOD | ||
49 | |||
50 | /* Clear Trec bit, write-protecting the RTC for 200ms when shutting off */ | ||
51 | /* without this, the alarm won't work! */ | ||
52 | |||
53 | data = rtc_read(0x04); | ||
54 | if (data & 0x80) | ||
55 | { | ||
56 | data &= ~0x80; | ||
57 | rtc_write(0x04, data); | ||
58 | } | ||
59 | |||
60 | rtc_enable_alarm(false); | ||
61 | #endif | ||
62 | } | ||
63 | |||
64 | #ifdef HAVE_ALARM_MOD | ||
65 | |||
66 | /* set alarm time registers to the given time (repeat once per day) */ | ||
67 | void rtc_set_alarm(int h, int m) | ||
68 | { | ||
69 | unsigned char data; | ||
70 | |||
71 | /* for daily alarm, RPT5=RPT4=on, RPT1=RPT2=RPT3=off */ | ||
72 | |||
73 | rtc_write(0x0e, 0x00); /* seconds 0 and RTP1 */ | ||
74 | rtc_write(0x0d, ((m / 10) << 4) | (m % 10)); /* minutes and RPT2 */ | ||
75 | rtc_write(0x0c, ((h / 10) << 4) | (h % 10)); /* hour and RPT3 */ | ||
76 | rtc_write(0x0b, 0xc1); /* set date 01 and RPT4 and RTP5 */ | ||
77 | |||
78 | /* set month to 1, if it's invalid, the rtc does an alarm every second instead */ | ||
79 | data = rtc_read(0x0a); | ||
80 | data &= 0xe0; | ||
81 | data |= 0x01; | ||
82 | rtc_write(0x0a, data); | ||
46 | } | 83 | } |
47 | 84 | ||
85 | /* read out the current alarm time */ | ||
86 | void rtc_get_alarm(int *h, int *m) | ||
87 | { | ||
88 | unsigned char data; | ||
89 | |||
90 | data = rtc_read(0x0c); | ||
91 | *h = ((data & 0x30) >> 4) * 10 + (data & 0x0f); | ||
92 | |||
93 | data = rtc_read(0x0d); | ||
94 | *m = ((data & 0x70) >> 4) * 10 + (data & 0x0f); | ||
95 | } | ||
96 | |||
97 | /* turn alarm on or off by setting the alarm flag enable */ | ||
98 | /* the alarm is automatically disabled when the RTC gets Vcc power at startup */ | ||
99 | /* avoid that an alarm occurs when the device is on because this locks the ON key forever */ | ||
100 | /* returns false if alarm was set and alarm flag (output) is off */ | ||
101 | /* returns true if alarm flag went on, which would lock the device, so the alarm was disabled again */ | ||
102 | bool rtc_enable_alarm(bool enable) | ||
103 | { | ||
104 | unsigned char data = rtc_read(0x0a); | ||
105 | if (enable) | ||
106 | { | ||
107 | data |= 0xa0; /* turn bit d7=AFE and d5=ABE on */ | ||
108 | } | ||
109 | else | ||
110 | data &= 0x5f; /* turn bit d7=AFE and d5=ABE off */ | ||
111 | rtc_write(0x0a, data); | ||
112 | |||
113 | /* check if alarm flag AF is off (as it sould be) */ | ||
114 | if ((rtc_read(0x0f) & 0x40) != 0) /* on */ | ||
115 | { | ||
116 | data &= 0x5f; /* turn bit d7=AFE and d5=ABE off */ | ||
117 | rtc_write(0x0a, data); | ||
118 | return true; | ||
119 | } else { | ||
120 | return false; /* all ok */ | ||
121 | } | ||
122 | } | ||
123 | |||
124 | #endif /* HAVE_ALARM_MOD */ | ||
125 | |||
48 | int rtc_write(unsigned char address, unsigned char value) | 126 | int rtc_write(unsigned char address, unsigned char value) |
49 | { | 127 | { |
50 | int ret = 0; | 128 | int ret = 0; |
diff --git a/firmware/drivers/rtc.h b/firmware/drivers/rtc.h index 7b101ee62e..fd1cd50274 100644 --- a/firmware/drivers/rtc.h +++ b/firmware/drivers/rtc.h | |||
@@ -7,7 +7,7 @@ | |||
7 | * \/ \/ \/ \/ \/ | 7 | * \/ \/ \/ \/ \/ |
8 | * $Id$ | 8 | * $Id$ |
9 | * | 9 | * |
10 | * Copyright (C) 2002 by Linus Nielsen Feltzing | 10 | * Copyright (C) 2002 by Linus Nielsen Feltzing, Uwe Freese |
11 | * | 11 | * |
12 | * All files in this archive are subject to the GNU General Public License. | 12 | * 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. | 13 | * See the file COPYING in the source tree root for full license agreement. |
@@ -19,11 +19,20 @@ | |||
19 | #ifndef _RTC_H_ | 19 | #ifndef _RTC_H_ |
20 | #define _RTC_H_ | 20 | #define _RTC_H_ |
21 | 21 | ||
22 | #include <stdbool.h> | ||
23 | |||
22 | #ifdef HAVE_RTC | 24 | #ifdef HAVE_RTC |
23 | void rtc_init(void); | 25 | void rtc_init(void); |
24 | int rtc_read(unsigned char address); | 26 | int rtc_read(unsigned char address); |
25 | int rtc_read_multiple(unsigned char address, unsigned char *buf, int numbytes); | 27 | int rtc_read_multiple(unsigned char address, unsigned char *buf, int numbytes); |
26 | int rtc_write(unsigned char address, unsigned char value); | 28 | int rtc_write(unsigned char address, unsigned char value); |
27 | #endif | 29 | |
30 | #ifdef HAVE_ALARM_MOD | ||
31 | void rtc_set_alarm(int h, int m); | ||
32 | void rtc_get_alarm(int *h, int *m); | ||
33 | bool rtc_enable_alarm(bool enable); | ||
34 | #endif /* HAVE_ALARM_MOD */ | ||
35 | |||
36 | #endif /* HAVE_RTC */ | ||
28 | 37 | ||
29 | #endif | 38 | #endif |