uboot/drivers/rtc/s3c44b0_rtc.c
<<
>>
Prefs
   1/*
   2 * (C) Copyright 2004
   3 * DAVE Srl
   4 * http://www.dave-tech.it
   5 * http://www.wawnet.biz
   6 * mailto:info@wawnet.biz
   7 *
   8 * See file CREDITS for list of people who contributed to this
   9 * project.
  10 *
  11 * This program is free software; you can redistribute it and/or
  12 * modify it under the terms of the GNU General Public License as
  13 * published by the Free Software Foundation; either version 2 of
  14 * the License, or (at your option) any later version.
  15 *
  16 * This program is distributed in the hope that it will be useful,
  17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19 * GNU General Public License for more details.
  20 *
  21 * You should have received a copy of the GNU General Public License
  22 * along with this program; if not, write to the Free Software
  23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  24 * MA 02111-1307 USA
  25 */
  26
  27/*
  28 * S3C44B0 CPU specific code
  29 */
  30
  31#include <common.h>
  32#include <command.h>
  33#include <asm/hardware.h>
  34#include <rtc.h>
  35
  36int rtc_get (struct rtc_time* tm)
  37{
  38        RTCCON |= 1;
  39        tm->tm_year  = bcd2bin(BCDYEAR);
  40        tm->tm_mon   = bcd2bin(BCDMON);
  41        tm->tm_wday   = bcd2bin(BCDDATE);
  42        tm->tm_mday   = bcd2bin(BCDDAY);
  43        tm->tm_hour  = bcd2bin(BCDHOUR);
  44        tm->tm_min  = bcd2bin(BCDMIN);
  45        tm->tm_sec  = bcd2bin(BCDSEC);
  46
  47        if (tm->tm_sec==0) {
  48                /* we have to re-read the rtc data because of the "one second deviation" problem */
  49                /* see RTC datasheet for more info about it */
  50                tm->tm_year  = bcd2bin(BCDYEAR);
  51                tm->tm_mon   = bcd2bin(BCDMON);
  52                tm->tm_mday   = bcd2bin(BCDDAY);
  53                tm->tm_wday   = bcd2bin(BCDDATE);
  54                tm->tm_hour  = bcd2bin(BCDHOUR);
  55                tm->tm_min  = bcd2bin(BCDMIN);
  56                tm->tm_sec  = bcd2bin(BCDSEC);
  57        }
  58
  59        RTCCON &= ~1;
  60
  61        if(tm->tm_year >= 70)
  62                tm->tm_year += 1900;
  63        else
  64                tm->tm_year += 2000;
  65
  66        return 0;
  67}
  68
  69int rtc_set (struct rtc_time* tm)
  70{
  71        if(tm->tm_year < 2000)
  72                tm->tm_year -= 1900;
  73        else
  74                tm->tm_year -= 2000;
  75
  76        RTCCON |= 1;
  77        BCDYEAR = bin2bcd(tm->tm_year);
  78        BCDMON = bin2bcd(tm->tm_mon);
  79        BCDDAY = bin2bcd(tm->tm_mday);
  80        BCDDATE = bin2bcd(tm->tm_wday);
  81        BCDHOUR = bin2bcd(tm->tm_hour);
  82        BCDMIN = bin2bcd(tm->tm_min);
  83        BCDSEC = bin2bcd(tm->tm_sec);
  84        RTCCON &= 1;
  85
  86        return 0;
  87}
  88
  89void rtc_reset (void)
  90{
  91        RTCCON |= 1;
  92        BCDYEAR = 0;
  93        BCDMON = 0;
  94        BCDDAY = 0;
  95        BCDDATE = 0;
  96        BCDHOUR = 0;
  97        BCDMIN = 0;
  98        BCDSEC = 0;
  99        RTCCON &= 1;
 100}
 101