Blame view

drivers/rtc/pcf8563.c 2.84 KB
fe8c2806c   wdenk   Initial revision
1
2
3
4
  /*
   * (C) Copyright 2001
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
5
   * SPDX-License-Identifier:	GPL-2.0+
fe8c2806c   wdenk   Initial revision
6
7
8
9
10
11
12
13
14
15
16
17
   */
  
  /*
   * Date & Time support for Philips PCF8563 RTC
   */
  
  /* #define	DEBUG	*/
  
  #include <common.h>
  #include <command.h>
  #include <rtc.h>
  #include <i2c.h>
871c18dd3   Michal Simek   rtc: Clean driver...
18
  #if defined(CONFIG_CMD_DATE)
fe8c2806c   wdenk   Initial revision
19
20
21
  
  static uchar rtc_read  (uchar reg);
  static void  rtc_write (uchar reg, uchar val);
fe8c2806c   wdenk   Initial revision
22
23
  
  /* ------------------------------------------------------------------------- */
b73a19e16   Yuri Tikhonov   LWMON5: POST RTC fix
24
  int rtc_get (struct rtc_time *tmp)
fe8c2806c   wdenk   Initial revision
25
  {
b73a19e16   Yuri Tikhonov   LWMON5: POST RTC fix
26
  	int rel = 0;
fe8c2806c   wdenk   Initial revision
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
  	uchar sec, min, hour, mday, wday, mon_cent, year;
  
  	sec	= rtc_read (0x02);
  	min	= rtc_read (0x03);
  	hour	= rtc_read (0x04);
  	mday	= rtc_read (0x05);
  	wday	= rtc_read (0x06);
  	mon_cent= rtc_read (0x07);
  	year	= rtc_read (0x08);
  
  	debug ( "Get RTC year: %02x mon/cent: %02x mday: %02x wday: %02x "
  		"hr: %02x min: %02x sec: %02x
  ",
  		year, mon_cent, mday, wday,
  		hour, min, sec );
  	debug ( "Alarms: wday: %02x day: %02x hour: %02x min: %02x
  ",
  		rtc_read (0x0C),
  		rtc_read (0x0B),
  		rtc_read (0x0A),
  		rtc_read (0x09) );
  
  	if (sec & 0x80) {
4b9206ed5   wdenk   * Patches by Thom...
50
51
  		puts ("### Warning: RTC Low Voltage - date/time not reliable
  ");
b73a19e16   Yuri Tikhonov   LWMON5: POST RTC fix
52
  		rel = -1;
fe8c2806c   wdenk   Initial revision
53
54
55
56
57
58
59
  	}
  
  	tmp->tm_sec  = bcd2bin (sec  & 0x7F);
  	tmp->tm_min  = bcd2bin (min  & 0x7F);
  	tmp->tm_hour = bcd2bin (hour & 0x3F);
  	tmp->tm_mday = bcd2bin (mday & 0x3F);
  	tmp->tm_mon  = bcd2bin (mon_cent & 0x1F);
df930e9b3   Benoît Thébaudeau   rtc: pcf8563: Mak...
60
  	tmp->tm_year = bcd2bin (year) + ((mon_cent & 0x80) ? 1900 : 2000);
fe8c2806c   wdenk   Initial revision
61
62
63
64
65
66
67
68
  	tmp->tm_wday = bcd2bin (wday & 0x07);
  	tmp->tm_yday = 0;
  	tmp->tm_isdst= 0;
  
  	debug ( "Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d
  ",
  		tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
  		tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
b73a19e16   Yuri Tikhonov   LWMON5: POST RTC fix
69
70
  
  	return rel;
fe8c2806c   wdenk   Initial revision
71
  }
d1e231941   Jean-Christophe PLAGNIOL-VILLARD   rtc: allow rtc_se...
72
  int rtc_set (struct rtc_time *tmp)
fe8c2806c   wdenk   Initial revision
73
74
75
76
77
78
79
80
81
  {
  	uchar century;
  
  	debug ( "Set DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d
  ",
  		tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
  		tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
  
  	rtc_write (0x08, bin2bcd(tmp->tm_year % 100));
df930e9b3   Benoît Thébaudeau   rtc: pcf8563: Mak...
82
  	century = (tmp->tm_year >= 2000) ? 0 : 0x80;
fe8c2806c   wdenk   Initial revision
83
84
85
86
87
88
89
  	rtc_write (0x07, bin2bcd(tmp->tm_mon) | century);
  
  	rtc_write (0x06, bin2bcd(tmp->tm_wday));
  	rtc_write (0x05, bin2bcd(tmp->tm_mday));
  	rtc_write (0x04, bin2bcd(tmp->tm_hour));
  	rtc_write (0x03, bin2bcd(tmp->tm_min ));
  	rtc_write (0x02, bin2bcd(tmp->tm_sec ));
d1e231941   Jean-Christophe PLAGNIOL-VILLARD   rtc: allow rtc_se...
90
91
  
  	return 0;
fe8c2806c   wdenk   Initial revision
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  }
  
  void rtc_reset (void)
  {
  	/* clear all control & status registers */
  	rtc_write (0x00, 0x00);
  	rtc_write (0x01, 0x00);
  	rtc_write (0x0D, 0x00);
  
  	/* clear Voltage Low bit */
  	rtc_write (0x02, rtc_read (0x02) & 0x7F);
  
  	/* reset all alarms */
  	rtc_write (0x09, 0x00);
  	rtc_write (0x0A, 0x00);
  	rtc_write (0x0B, 0x00);
  	rtc_write (0x0C, 0x00);
  }
  
  /* ------------------------------------------------------------------------- */
  
  static uchar rtc_read (uchar reg)
  {
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
115
  	return (i2c_reg_read (CONFIG_SYS_I2C_RTC_ADDR, reg));
fe8c2806c   wdenk   Initial revision
116
117
118
119
  }
  
  static void rtc_write (uchar reg, uchar val)
  {
6d0f6bcf3   Jean-Christophe PLAGNIOL-VILLARD   rename CFG_ macro...
120
  	i2c_reg_write (CONFIG_SYS_I2C_RTC_ADDR, reg, val);
fe8c2806c   wdenk   Initial revision
121
  }
068b60a0e   Jon Loeliger   cpu/ rtc/ include...
122
  #endif