1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2002 by Linus Nielsen Feltzing, Uwe Freese, Laurent Baum
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
20 ****************************************************************************/
29 #define RTC_DEV_WRITE (RTC_ADR | 0x00)
30 #define RTC_DEV_READ (RTC_ADR | 0x01)
37 /* Check + save alarm bit first, before the power thread starts watching */
38 rtc_check_alarm_started(false);
41 /* Clear the Stop bit if it is set */
42 data
= rtc_read(0x01);
44 rtc_write(0x01, 0x00);
46 /* Clear the HT bit if it is set */
47 data
= rtc_read(0x0c);
57 /* Clear Trec bit, write-protecting the RTC for 200ms when shutting off */
58 /* without this, the alarm won't work! */
60 data
= rtc_read(0x04);
64 rtc_write(0x04, data
);
67 /* Also, make sure that the OUT bit in register 8 is 1,
68 otherwise the player can't be turned off. */
69 rtc_write(8, rtc_read(8) | 0x80);
76 /* check whether the unit has been started by the RTC alarm function */
77 /* (check for AF, which => started using wakeup alarm) */
78 bool rtc_check_alarm_started(bool release_alarm
)
80 static bool alarm_state
, run_before
;
85 alarm_state
&= ~release_alarm
;
87 /* This call resets AF, so we store the state for later recall */
88 rc
= alarm_state
= rtc_check_alarm_flag();
95 * Checks the AL register. This call resets AL once read.
97 * We're only interested if ABE is set. AL is still raised regardless
98 * even if the unit is off when the alarm occurs.
100 bool rtc_check_alarm_flag(void)
102 return ( ( (rtc_read(0x0f) & 0x40) != 0) &&
103 (rtc_read(0x0a) & 0x20) );
106 /* set alarm time registers to the given time (repeat once per day) */
107 void rtc_set_alarm(int h
, int m
)
111 /* for daily alarm, RPT5=RPT4=on, RPT1=RPT2=RPT3=off */
113 rtc_write(0x0e, 0x00); /* seconds 0 and RTP1 */
114 rtc_write(0x0d, ((m
/ 10) << 4) | (m
% 10)); /* minutes and RPT2 */
115 rtc_write(0x0c, ((h
/ 10) << 4) | (h
% 10)); /* hour and RPT3 */
116 rtc_write(0x0b, 0xc1); /* set date 01 and RPT4 and RTP5 */
118 /* set month to 1, if it's invalid, the rtc does an alarm every second instead */
119 data
= rtc_read(0x0a);
122 rtc_write(0x0a, data
);
125 /* read out the current alarm time */
126 void rtc_get_alarm(int *h
, int *m
)
130 data
= rtc_read(0x0c);
131 *h
= ((data
& 0x30) >> 4) * 10 + (data
& 0x0f);
133 data
= rtc_read(0x0d);
134 *m
= ((data
& 0x70) >> 4) * 10 + (data
& 0x0f);
137 /* turn alarm on or off by setting the alarm flag enable */
138 /* the alarm is automatically disabled when the RTC gets Vcc power at startup */
139 /* avoid that an alarm occurs when the device is on because this locks the ON key forever */
140 /* returns false if alarm was set and alarm flag (output) is off */
141 /* returns true if alarm flag went on, which would lock the device, so the alarm was disabled again */
142 bool rtc_enable_alarm(bool enable
)
144 unsigned char data
= rtc_read(0x0a);
147 data
|= 0xa0; /* turn bit d7=AFE and d5=ABE on */
150 data
&= 0x5f; /* turn bit d7=AFE and d5=ABE off */
151 rtc_write(0x0a, data
);
153 /* check if alarm flag AF is off (as it should be) */
154 /* in some cases enabling the alarm results in an activated AF flag */
155 /* this should not happen, but it does */
156 /* if you know why, tell me! */
157 /* for now, we try again forever in this case */
158 while (rtc_check_alarm_flag()) /* on */
160 data
&= 0x5f; /* turn bit d7=AFE and d5=ABE off */
161 rtc_write(0x0a, data
);
163 rtc_check_alarm_flag();
164 data
|= 0xa0; /* turn bit d7=AFE and d5=ABE on */
165 rtc_write(0x0a, data
);
168 return false; /* all ok */
171 #endif /* HAVE_RTC_ALARM */
173 int rtc_write(unsigned char address
, unsigned char value
)
176 unsigned char buf
[2];
183 /* send run command */
184 if (i2c_write(RTC_DEV_WRITE
,buf
,2))
193 int rtc_read(unsigned char address
)
196 unsigned char buf
[1];
202 /* send read command */
203 if (i2c_write(RTC_DEV_READ
,buf
,1) >= 0)
206 i2c_outb(RTC_DEV_READ
);
219 int rtc_read_multiple(unsigned char address
, unsigned char *buf
, int numbytes
)
222 unsigned char obuf
[1];
229 /* send read command */
230 if (i2c_write(RTC_DEV_READ
, obuf
, 1) >= 0)
233 i2c_outb(RTC_DEV_READ
);
236 for(i
= 0;i
< numbytes
-1;i
++)
253 int rtc_read_datetime(unsigned char* buf
) {
256 rc
= rtc_read_multiple(1, buf
, 7);
265 int rtc_write_datetime(unsigned char* buf
) {
273 for (i
= 0; i
< 7 ; i
++)
275 rc
|= rtc_write(i
+1, buf
[i
]);
277 rc
|= rtc_write(8, 0x80); /* Out=1, calibration = 0 */