uboot/drivers/rtc/pcf8563.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2001
   3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   4 *
   5 * See file CREDITS for list of people who contributed to this
   6 * project.
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License as
  10 * published by the Free Software Foundation; either version 2 of
  11 * the License, or (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  21 * MA 02111-1307 USA
  22 */
  23
  24/*
  25 * Date & Time support for Philips PCF8563 RTC
  26 */
  27
  28/* #define      DEBUG   */
  29
  30#include <common.h>
  31#include <command.h>
  32#include <rtc.h>
  33#include <i2c.h>
  34
  35#if defined(CONFIG_CMD_DATE)
  36
  37static uchar rtc_read  (uchar reg);
  38static void  rtc_write (uchar reg, uchar val);
  39
  40/* ------------------------------------------------------------------------- */
  41
  42int rtc_get (struct rtc_time *tmp)
  43{
  44        int rel = 0;
  45        uchar sec, min, hour, mday, wday, mon_cent, year;
  46
  47        sec     = rtc_read (0x02);
  48        min     = rtc_read (0x03);
  49        hour    = rtc_read (0x04);
  50        mday    = rtc_read (0x05);
  51        wday    = rtc_read (0x06);
  52        mon_cent= rtc_read (0x07);
  53        year    = rtc_read (0x08);
  54
  55        debug ( "Get RTC year: %02x mon/cent: %02x mday: %02x wday: %02x "
  56                "hr: %02x min: %02x sec: %02x\n",
  57                year, mon_cent, mday, wday,
  58                hour, min, sec );
  59        debug ( "Alarms: wday: %02x day: %02x hour: %02x min: %02x\n",
  60                rtc_read (0x0C),
  61                rtc_read (0x0B),
  62                rtc_read (0x0A),
  63                rtc_read (0x09) );
  64
  65        if (sec & 0x80) {
  66                puts ("### Warning: RTC Low Voltage - date/time not reliable\n");
  67                rel = -1;
  68        }
  69
  70        tmp->tm_sec  = bcd2bin (sec  & 0x7F);
  71        tmp->tm_min  = bcd2bin (min  & 0x7F);
  72        tmp->tm_hour = bcd2bin (hour & 0x3F);
  73        tmp->tm_mday = bcd2bin (mday & 0x3F);
  74        tmp->tm_mon  = bcd2bin (mon_cent & 0x1F);
  75        tmp->tm_year = bcd2bin (year) + ((mon_cent & 0x80) ? 2000 : 1900);
  76        tmp->tm_wday = bcd2bin (wday & 0x07);
  77        tmp->tm_yday = 0;
  78        tmp->tm_isdst= 0;
  79
  80        debug ( "Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
  81                tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
  82                tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
  83
  84        return rel;
  85}
  86
  87int rtc_set (struct rtc_time *tmp)
  88{
  89        uchar century;
  90
  91        debug ( "Set DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
  92                tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
  93                tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
  94
  95        rtc_write (0x08, bin2bcd(tmp->tm_year % 100));
  96
  97        century = (tmp->tm_year >= 2000) ? 0x80 : 0;
  98        rtc_write (0x07, bin2bcd(tmp->tm_mon) | century);
  99
 100        rtc_write (0x06, bin2bcd(tmp->tm_wday));
 101        rtc_write (0x05, bin2bcd(tmp->tm_mday));
 102        rtc_write (0x04, bin2bcd(tmp->tm_hour));
 103        rtc_write (0x03, bin2bcd(tmp->tm_min ));
 104        rtc_write (0x02, bin2bcd(tmp->tm_sec ));
 105
 106        return 0;
 107}
 108
 109void rtc_reset (void)
 110{
 111        /* clear all control & status registers */
 112        rtc_write (0x00, 0x00);
 113        rtc_write (0x01, 0x00);
 114        rtc_write (0x0D, 0x00);
 115
 116        /* clear Voltage Low bit */
 117        rtc_write (0x02, rtc_read (0x02) & 0x7F);
 118
 119        /* reset all alarms */
 120        rtc_write (0x09, 0x00);
 121        rtc_write (0x0A, 0x00);
 122        rtc_write (0x0B, 0x00);
 123        rtc_write (0x0C, 0x00);
 124}
 125
 126/* ------------------------------------------------------------------------- */
 127
 128static uchar rtc_read (uchar reg)
 129{
 130        return (i2c_reg_read (CONFIG_SYS_I2C_RTC_ADDR, reg));
 131}
 132
 133static void rtc_write (uchar reg, uchar val)
 134{
 135        i2c_reg_write (CONFIG_SYS_I2C_RTC_ADDR, reg, val);
 136}
 137
 138#endif
 139