diff options
Diffstat (limited to 'drivers/rtc')
-rw-r--r-- | drivers/rtc/Makefile | 4 | ||||
-rw-r--r-- | drivers/rtc/m41t11.c | 168 | ||||
-rw-r--r-- | drivers/rtc/m41t60.c | 239 | ||||
-rw-r--r-- | drivers/rtc/m41t94.c | 123 | ||||
-rw-r--r-- | drivers/rtc/m48t35ax.c | 135 | ||||
-rw-r--r-- | drivers/rtc/mc146818.c | 2 |
6 files changed, 1 insertions, 670 deletions
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index d621be6..009dd9d 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -27,11 +27,7 @@ obj-$(CONFIG_RTC_FTRTC010) += ftrtc010.o obj-$(CONFIG_SANDBOX) += i2c_rtc_emul.o obj-$(CONFIG_RTC_IMXDI) += imxdi.o obj-$(CONFIG_RTC_ISL1208) += isl1208.o -obj-$(CONFIG_RTC_M41T11) += m41t11.o -obj-$(CONFIG_RTC_M41T60) += m41t60.o obj-$(CONFIG_RTC_M41T62) += m41t62.o -obj-$(CONFIG_RTC_M41T94) += m41t94.o -obj-$(CONFIG_RTC_M48T35A) += m48t35ax.o obj-$(CONFIG_RTC_MAX6900) += max6900.o obj-$(CONFIG_RTC_MC13XXX) += mc13xxx-rtc.o obj-$(CONFIG_RTC_MC146818) += mc146818.o diff --git a/drivers/rtc/m41t11.c b/drivers/rtc/m41t11.c deleted file mode 100644 index 706b718..0000000 --- a/drivers/rtc/m41t11.c +++ /dev/null @@ -1,168 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2002 - * Andrew May, Viasat Inc, amay@viasat.com - */ - -/* - * M41T11 Serial Access Timekeeper(R) SRAM - * can you believe a trademark on that? - */ - -/* #define DEBUG 1 */ - -#include <common.h> -#include <command.h> -#include <log.h> -#include <rtc.h> -#include <i2c.h> - -/* - I Don't have an example config file but this - is what should be done. - -#define CONFIG_RTC_M41T11 1 -#define CONFIG_SYS_I2C_RTC_ADDR 0x68 -#if 0 -#define CONFIG_SYS_M41T11_EXT_CENTURY_DATA -#else -#define CONFIG_SYS_M41T11_BASE_YEAR 2000 -#endif -*/ - -/* ------------------------------------------------------------------------- */ -/* - these are simple defines for the chip local to here so they aren't too - verbose - DAY/DATE aren't nice but that is how they are on the data sheet -*/ -#define RTC_SEC_ADDR 0x0 -#define RTC_MIN_ADDR 0x1 -#define RTC_HOUR_ADDR 0x2 -#define RTC_DAY_ADDR 0x3 -#define RTC_DATE_ADDR 0x4 -#define RTC_MONTH_ADDR 0x5 -#define RTC_YEARS_ADDR 0x6 - -#define RTC_REG_CNT 7 - -#define RTC_CONTROL_ADDR 0x7 - - -#ifndef CONFIG_SYS_M41T11_EXT_CENTURY_DATA - -#define REG_CNT (RTC_REG_CNT+1) - -/* - you only get 00-99 for the year we will asume you - want from the year 2000 if you don't set the config -*/ -#ifndef CONFIG_SYS_M41T11_BASE_YEAR -#define CONFIG_SYS_M41T11_BASE_YEAR 2000 -#endif - -#else -/* we will store extra year info in byte 9*/ -#define M41T11_YEAR_DATA 0x8 -#define M41T11_YEAR_SIZE 1 -#define REG_CNT (RTC_REG_CNT+1+M41T11_YEAR_SIZE) -#endif - -#define M41T11_STORAGE_SZ (64-REG_CNT) - -int rtc_get (struct rtc_time *tmp) -{ - int rel = 0; - uchar data[RTC_REG_CNT]; - - i2c_read(CONFIG_SYS_I2C_RTC_ADDR, RTC_SEC_ADDR, 1, data, RTC_REG_CNT); - - if( data[RTC_SEC_ADDR] & 0x80 ){ - printf( "m41t11 RTC Clock stopped!!!\n" ); - rel = -1; - } - tmp->tm_sec = bcd2bin (data[RTC_SEC_ADDR] & 0x7F); - tmp->tm_min = bcd2bin (data[RTC_MIN_ADDR] & 0x7F); - tmp->tm_hour = bcd2bin (data[RTC_HOUR_ADDR] & 0x3F); - tmp->tm_mday = bcd2bin (data[RTC_DATE_ADDR] & 0x3F); - tmp->tm_mon = bcd2bin (data[RTC_MONTH_ADDR]& 0x1F); -#ifndef CONFIG_SYS_M41T11_EXT_CENTURY_DATA - tmp->tm_year = CONFIG_SYS_M41T11_BASE_YEAR - + bcd2bin(data[RTC_YEARS_ADDR]) - + ((data[RTC_HOUR_ADDR]&0x40) ? 100 : 0); -#else - { - unsigned char cent; - i2c_read(CONFIG_SYS_I2C_RTC_ADDR, M41T11_YEAR_DATA, 1, ¢, M41T11_YEAR_SIZE); - if( !(data[RTC_HOUR_ADDR] & 0x80) ){ - printf( "m41t11 RTC: cann't keep track of years without CEB set\n" ); - rel = -1; - } - if( (cent & 0x1) != ((data[RTC_HOUR_ADDR]&0x40)>>7) ){ - /*century flip store off new year*/ - cent += 1; - i2c_write(CONFIG_SYS_I2C_RTC_ADDR, M41T11_YEAR_DATA, 1, ¢, M41T11_YEAR_SIZE); - } - tmp->tm_year =((int)cent*100)+bcd2bin(data[RTC_YEARS_ADDR]); - } -#endif - tmp->tm_wday = bcd2bin (data[RTC_DAY_ADDR] & 0x07); - tmp->tm_yday = 0; - tmp->tm_isdst= 0; - - debug("Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n", - tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday, - tmp->tm_hour, tmp->tm_min, tmp->tm_sec); - - return rel; -} - -int rtc_set (struct rtc_time *tmp) -{ - uchar data[RTC_REG_CNT]; - - debug("Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n", - tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday, - tmp->tm_hour, tmp->tm_min, tmp->tm_sec); - - data[RTC_SEC_ADDR] = bin2bcd(tmp->tm_sec) & 0x7F;/*just in case*/ - data[RTC_MIN_ADDR] = bin2bcd(tmp->tm_min); - data[RTC_HOUR_ADDR] = bin2bcd(tmp->tm_hour) & 0x3F;/*handle cent stuff later*/ - data[RTC_DATE_ADDR] = bin2bcd(tmp->tm_mday) & 0x3F; - data[RTC_MONTH_ADDR] = bin2bcd(tmp->tm_mon); - data[RTC_DAY_ADDR] = bin2bcd(tmp->tm_wday) & 0x07; - - data[RTC_HOUR_ADDR] |= 0x80;/*we will always use CEB*/ - - data[RTC_YEARS_ADDR] = bin2bcd(tmp->tm_year%100);/*same thing either way*/ -#ifndef CONFIG_SYS_M41T11_EXT_CENTURY_DATA - if( ((tmp->tm_year - CONFIG_SYS_M41T11_BASE_YEAR) > 200) || - (tmp->tm_year < CONFIG_SYS_M41T11_BASE_YEAR) ){ - printf( "m41t11 RTC setting year out of range!!need recompile\n" ); - } - data[RTC_HOUR_ADDR] |= (tmp->tm_year - CONFIG_SYS_M41T11_BASE_YEAR) > 100 ? 0x40 : 0; -#else - { - unsigned char cent; - cent = tmp->tm_year ? tmp->tm_year / 100 : 0; - data[RTC_HOUR_ADDR] |= (cent & 0x1) ? 0x40 : 0; - i2c_write(CONFIG_SYS_I2C_RTC_ADDR, M41T11_YEAR_DATA, 1, ¢, M41T11_YEAR_SIZE); - } -#endif - i2c_write(CONFIG_SYS_I2C_RTC_ADDR, RTC_SEC_ADDR, 1, data, RTC_REG_CNT); - - return 0; -} - -void rtc_reset (void) -{ - unsigned char val; - /* clear all control & status registers */ - i2c_read(CONFIG_SYS_I2C_RTC_ADDR, RTC_SEC_ADDR, 1, &val, 1); - val = val & 0x7F;/*make sure we are running*/ - i2c_write(CONFIG_SYS_I2C_RTC_ADDR, RTC_SEC_ADDR, 1, &val, RTC_REG_CNT); - - i2c_read(CONFIG_SYS_I2C_RTC_ADDR, RTC_CONTROL_ADDR, 1, &val, 1); - val = val & 0x3F;/*turn off freq test keep calibration*/ - i2c_write(CONFIG_SYS_I2C_RTC_ADDR, RTC_CONTROL_ADDR, 1, &val, 1); -} diff --git a/drivers/rtc/m41t60.c b/drivers/rtc/m41t60.c deleted file mode 100644 index b8ad33e..0000000 --- a/drivers/rtc/m41t60.c +++ /dev/null @@ -1,239 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2007 - * Larry Johnson, lrj@acm.org - * - * based on rtc/m41t11.c which is ... - * - * (C) Copyright 2002 - * Andrew May, Viasat Inc, amay@viasat.com - */ - -/* - * STMicroelectronics M41T60 serial access real-time clock - */ - -/* #define DEBUG 1 */ - -#include <common.h> -#include <command.h> -#include <env.h> -#include <log.h> -#include <rtc.h> -#include <i2c.h> - -/* - * Convert between century and "century bits" (CB1 and CB0). These routines - * assume years are in the range 1900 - 2299. - */ - -static unsigned char year2cb(unsigned const year) -{ - if (year < 1900 || year >= 2300) - printf("M41T60 RTC: year %d out of range\n", year); - - return (year / 100) & 0x3; -} - -static unsigned cb2year(unsigned const cb) -{ - return 1900 + 100 * ((cb + 1) & 0x3); -} - -/* - * These are simple defines for the chip local to here so they aren't too - * verbose. DAY/DATE aren't nice but that is how they are on the data sheet. - */ -#define RTC_SEC 0x0 -#define RTC_MIN 0x1 -#define RTC_HOUR 0x2 -#define RTC_DAY 0x3 -#define RTC_DATE 0x4 -#define RTC_MONTH 0x5 -#define RTC_YEAR 0x6 - -#define RTC_REG_CNT 7 - -#define RTC_CTRL 0x7 - -#if defined(DEBUG) -static void rtc_dump(char const *const label) -{ - uchar data[8]; - - if (i2c_read(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, data, sizeof(data))) { - printf("I2C read failed in rtc_dump()\n"); - return; - } - printf("RTC dump %s: %02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n", - label, data[0], data[1], data[2], data[3], - data[4], data[5], data[6], data[7]); -} -#else -#define rtc_dump(label) -#endif - -static uchar *rtc_validate(void) -{ - /* - * This routine uses the OUT bit and the validity of the time values to - * determine whether there has been an initial power-up since the last - * time the routine was run. It assumes that the OUT bit is not being - * used for any other purpose. - */ - static const uchar daysInMonth[0x13] = { - 0x00, 0x31, 0x29, 0x31, 0x30, 0x31, 0x30, 0x31, - 0x31, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x31, 0x30, 0x31 - }; - static uchar data[8]; - uchar min, date, month, years; - - rtc_dump("begin validate"); - if (i2c_read(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, data, sizeof(data))) { - printf("I2C read failed in rtc_validate()\n"); - return 0; - } - /* - * If the OUT bit is "1", there has been a loss of power, so stop the - * oscillator so it can be "kick-started" as per data sheet. - */ - if (0x00 != (data[RTC_CTRL] & 0x80)) { - printf("M41T60 RTC clock lost power.\n"); - data[RTC_SEC] = 0x80; - if (i2c_write(CONFIG_SYS_I2C_RTC_ADDR, RTC_SEC, 1, data, 1)) { - printf("I2C write failed in rtc_validate()\n"); - return 0; - } - } - /* - * If the oscillator is stopped or the date is invalid, then reset the - * OUT bit to "0", reset the date registers, and start the oscillator. - */ - min = data[RTC_MIN] & 0x7F; - date = data[RTC_DATE]; - month = data[RTC_MONTH] & 0x3F; - years = data[RTC_YEAR]; - if (0x59 < data[RTC_SEC] || 0x09 < (data[RTC_SEC] & 0x0F) || - 0x59 < min || 0x09 < (min & 0x0F) || - 0x23 < data[RTC_HOUR] || 0x09 < (data[RTC_HOUR] & 0x0F) || - 0x07 < data[RTC_DAY] || 0x00 == data[RTC_DAY] || - 0x12 < month || - 0x99 < years || 0x09 < (years & 0x0F) || - daysInMonth[month] < date || 0x09 < (date & 0x0F) || 0x00 == date || - (0x29 == date && 0x02 == month && - ((0x00 != (years & 0x03)) || - (0x00 == years && 0x00 != (data[RTC_MONTH] & 0xC0))))) { - printf("Resetting M41T60 RTC clock.\n"); - /* - * Set to 00:00:00 1900-01-01 (Monday) - */ - data[RTC_SEC] = 0x00; - data[RTC_MIN] &= 0x80; /* preserve OFIE bit */ - data[RTC_HOUR] = 0x00; - data[RTC_DAY] = 0x02; - data[RTC_DATE] = 0x01; - data[RTC_MONTH] = 0xC1; - data[RTC_YEAR] = 0x00; - data[RTC_CTRL] &= 0x7F; /* reset OUT bit */ - - if (i2c_write(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, data, sizeof(data))) { - printf("I2C write failed in rtc_validate()\n"); - return 0; - } - } - return data; -} - -int rtc_get(struct rtc_time *tmp) -{ - uchar const *const data = rtc_validate(); - - if (!data) - return -1; - - tmp->tm_sec = bcd2bin(data[RTC_SEC] & 0x7F); - tmp->tm_min = bcd2bin(data[RTC_MIN] & 0x7F); - tmp->tm_hour = bcd2bin(data[RTC_HOUR] & 0x3F); - tmp->tm_mday = bcd2bin(data[RTC_DATE] & 0x3F); - tmp->tm_mon = bcd2bin(data[RTC_MONTH] & 0x1F); - tmp->tm_year = cb2year(data[RTC_MONTH] >> 6) + bcd2bin(data[RTC_YEAR]); - tmp->tm_wday = bcd2bin(data[RTC_DAY] & 0x07) - 1; - tmp->tm_yday = 0; - tmp->tm_isdst = 0; - - debug("Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n", - tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday, - tmp->tm_hour, tmp->tm_min, tmp->tm_sec); - - return 0; -} - -int rtc_set(struct rtc_time *tmp) -{ - uchar *const data = rtc_validate(); - - if (!data) - return -1; - - debug("Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n", - tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday, - tmp->tm_hour, tmp->tm_min, tmp->tm_sec); - - data[RTC_SEC] = (data[RTC_SEC] & 0x80) | (bin2bcd(tmp->tm_sec) & 0x7F); - data[RTC_MIN] = (data[RTC_MIN] & 0X80) | (bin2bcd(tmp->tm_min) & 0X7F); - data[RTC_HOUR] = bin2bcd(tmp->tm_hour) & 0x3F; - data[RTC_DATE] = bin2bcd(tmp->tm_mday) & 0x3F; - data[RTC_MONTH] = bin2bcd(tmp->tm_mon) & 0x1F; - data[RTC_YEAR] = bin2bcd(tmp->tm_year % 100); - data[RTC_MONTH] |= year2cb(tmp->tm_year) << 6; - data[RTC_DAY] = bin2bcd(tmp->tm_wday + 1) & 0x07; - if (i2c_write(CONFIG_SYS_I2C_RTC_ADDR, 0, 1, data, RTC_REG_CNT)) { - printf("I2C write failed in rtc_set()\n"); - return -1; - } - - return 0; -} - -void rtc_reset(void) -{ - uchar *const data = rtc_validate(); - char const *const s = env_get("rtccal"); - - if (!data) - return; - - rtc_dump("begin reset"); - /* - * If environmental variable "rtccal" is present, it must be a hex value - * between 0x00 and 0x3F, inclusive. The five least-significan bits - * represent the calibration magnitude, and the sixth bit the sign bit. - * If these do not match the contents of the hardware register, that - * register is updated. The value 0x00 imples no correction. Consult - * the M41T60 documentation for further details. - */ - if (s) { - unsigned long const l = hextoul(s, 0); - - if (l <= 0x3F) { - if ((data[RTC_CTRL] & 0x3F) != l) { - printf("Setting RTC calibration to 0x%02lX\n", - l); - data[RTC_CTRL] &= 0xC0; - data[RTC_CTRL] |= (uchar) l; - } - } else - printf("environment parameter \"rtccal\" not valid: " - "ignoring\n"); - } - /* - * Turn off frequency test. - */ - data[RTC_CTRL] &= 0xBF; - if (i2c_write(CONFIG_SYS_I2C_RTC_ADDR, RTC_CTRL, 1, data + RTC_CTRL, 1)) { - printf("I2C write failed in rtc_reset()\n"); - return; - } - rtc_dump("end reset"); -} diff --git a/drivers/rtc/m41t94.c b/drivers/rtc/m41t94.c deleted file mode 100644 index 5b665bb..0000000 --- a/drivers/rtc/m41t94.c +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Driver for ST M41T94 SPI RTC - * - * Taken from the Linux kernel drivier: - * Copyright (C) 2008 Kim B. Heino - * - * Adaptation for U-Boot: - * Copyright (C) 2009 - * Albin Tonnerre, Free Electrons <albin.tonnerre@free-electrons.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - */ - -#include <common.h> -#include <rtc.h> -#include <spi.h> - -static struct spi_slave *slave; - -#define M41T94_REG_SECONDS 0x01 -#define M41T94_REG_MINUTES 0x02 -#define M41T94_REG_HOURS 0x03 -#define M41T94_REG_WDAY 0x04 -#define M41T94_REG_DAY 0x05 -#define M41T94_REG_MONTH 0x06 -#define M41T94_REG_YEAR 0x07 -#define M41T94_REG_HT 0x0c - -#define M41T94_BIT_HALT 0x40 -#define M41T94_BIT_STOP 0x80 -#define M41T94_BIT_CB 0x40 -#define M41T94_BIT_CEB 0x80 - -int rtc_set(struct rtc_time *tm) -{ - u8 buf[8]; /* write cmd + 7 registers */ - int ret; - - if (!slave) { - slave = spi_setup_slave(CONFIG_M41T94_SPI_BUS, - CONFIG_M41T94_SPI_CS, 1000000, - SPI_MODE_3); - if (!slave) - return -1; - } - spi_claim_bus(slave); - - buf[0] = 0x80 | M41T94_REG_SECONDS; /* write time + date */ - buf[M41T94_REG_SECONDS] = bin2bcd(tm->tm_sec); - buf[M41T94_REG_MINUTES] = bin2bcd(tm->tm_min); - buf[M41T94_REG_HOURS] = bin2bcd(tm->tm_hour); - buf[M41T94_REG_WDAY] = bin2bcd(tm->tm_wday + 1); - buf[M41T94_REG_DAY] = bin2bcd(tm->tm_mday); - buf[M41T94_REG_MONTH] = bin2bcd(tm->tm_mon + 1); - - buf[M41T94_REG_HOURS] |= M41T94_BIT_CEB; - if (tm->tm_year >= 100) - buf[M41T94_REG_HOURS] |= M41T94_BIT_CB; - buf[M41T94_REG_YEAR] = bin2bcd(tm->tm_year % 100); - - ret = spi_xfer(slave, 64, buf, NULL, SPI_XFER_BEGIN | SPI_XFER_END); - spi_release_bus(slave); - return ret; -} - -int rtc_get(struct rtc_time *tm) -{ - u8 buf[2]; - int ret, hour; - - if (!slave) { - slave = spi_setup_slave(CONFIG_M41T94_SPI_BUS, - CONFIG_M41T94_SPI_CS, 1000000, - SPI_MODE_3); - if (!slave) - return -1; - } - spi_claim_bus(slave); - - /* clear halt update bit */ - ret = spi_w8r8(slave, M41T94_REG_HT); - if (ret < 0) - return ret; - if (ret & M41T94_BIT_HALT) { - buf[0] = 0x80 | M41T94_REG_HT; - buf[1] = ret & ~M41T94_BIT_HALT; - spi_xfer(slave, 16, buf, NULL, SPI_XFER_BEGIN | SPI_XFER_END); - } - - /* clear stop bit */ - ret = spi_w8r8(slave, M41T94_REG_SECONDS); - if (ret < 0) - return ret; - if (ret & M41T94_BIT_STOP) { - buf[0] = 0x80 | M41T94_REG_SECONDS; - buf[1] = ret & ~M41T94_BIT_STOP; - spi_xfer(slave, 16, buf, NULL, SPI_XFER_BEGIN | SPI_XFER_END); - } - - tm->tm_sec = bcd2bin(spi_w8r8(slave, M41T94_REG_SECONDS)); - tm->tm_min = bcd2bin(spi_w8r8(slave, M41T94_REG_MINUTES)); - hour = spi_w8r8(slave, M41T94_REG_HOURS); - tm->tm_hour = bcd2bin(hour & 0x3f); - tm->tm_wday = bcd2bin(spi_w8r8(slave, M41T94_REG_WDAY)) - 1; - tm->tm_mday = bcd2bin(spi_w8r8(slave, M41T94_REG_DAY)); - tm->tm_mon = bcd2bin(spi_w8r8(slave, M41T94_REG_MONTH)) - 1; - tm->tm_year = bcd2bin(spi_w8r8(slave, M41T94_REG_YEAR)); - if ((hour & M41T94_BIT_CB) || !(hour & M41T94_BIT_CEB)) - tm->tm_year += 100; - - spi_release_bus(slave); - return 0; -} - -void rtc_reset(void) -{ - /* - * Could not be tested as the reset pin is not wired on - * the sbc35-ag20 board - */ -} diff --git a/drivers/rtc/m48t35ax.c b/drivers/rtc/m48t35ax.c deleted file mode 100644 index 1cc24cc..0000000 --- a/drivers/rtc/m48t35ax.c +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2001 - * Erik Theisen, Wave 7 Optics, etheisen@mindspring.com. - */ - -/* - * Date & Time support for ST Electronics M48T35Ax RTC - */ - -/*#define DEBUG */ - - -#include <common.h> -#include <command.h> -#include <rtc.h> -#include <config.h> - -static uchar rtc_read (uchar reg); -static void rtc_write (uchar reg, uchar val); - -/* ------------------------------------------------------------------------- */ - -int rtc_get (struct rtc_time *tmp) -{ - uchar sec, min, hour, cent_day, date, month, year; - uchar ccr; /* Clock control register */ - - /* Lock RTC for read using clock control register */ - ccr = rtc_read(0); - ccr = ccr | 0x40; - rtc_write(0, ccr); - - sec = rtc_read (0x1); - min = rtc_read (0x2); - hour = rtc_read (0x3); - cent_day= rtc_read (0x4); - date = rtc_read (0x5); - month = rtc_read (0x6); - year = rtc_read (0x7); - - /* UNLock RTC */ - ccr = rtc_read(0); - ccr = ccr & 0xBF; - rtc_write(0, ccr); - - debug ( "Get RTC year: %02x month: %02x date: %02x cent_day: %02x " - "hr: %02x min: %02x sec: %02x\n", - year, month, date, cent_day, - hour, min, sec ); - - tmp->tm_sec = bcd2bin (sec & 0x7F); - tmp->tm_min = bcd2bin (min & 0x7F); - tmp->tm_hour = bcd2bin (hour & 0x3F); - tmp->tm_mday = bcd2bin (date & 0x3F); - tmp->tm_mon = bcd2bin (month & 0x1F); - tmp->tm_year = bcd2bin (year) + ((cent_day & 0x10) ? 2000 : 1900); - tmp->tm_wday = bcd2bin (cent_day & 0x07); - tmp->tm_yday = 0; - tmp->tm_isdst= 0; - - debug ( "Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n", - tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday, - tmp->tm_hour, tmp->tm_min, tmp->tm_sec); - - return 0; -} - -int rtc_set (struct rtc_time *tmp) -{ - uchar ccr; /* Clock control register */ - uchar century; - - debug ( "Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n", - tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday, - tmp->tm_hour, tmp->tm_min, tmp->tm_sec); - - /* Lock RTC for write using clock control register */ - ccr = rtc_read(0); - ccr = ccr | 0x80; - rtc_write(0, ccr); - - rtc_write (0x07, bin2bcd(tmp->tm_year % 100)); - rtc_write (0x06, bin2bcd(tmp->tm_mon)); - rtc_write (0x05, bin2bcd(tmp->tm_mday)); - - century = ((tmp->tm_year >= 2000) ? 0x10 : 0) | 0x20; - rtc_write (0x04, bin2bcd(tmp->tm_wday) | century); - - rtc_write (0x03, bin2bcd(tmp->tm_hour)); - rtc_write (0x02, bin2bcd(tmp->tm_min )); - rtc_write (0x01, bin2bcd(tmp->tm_sec )); - - /* UNLock RTC */ - ccr = rtc_read(0); - ccr = ccr & 0x7F; - rtc_write(0, ccr); - - return 0; -} - -void rtc_reset (void) -{ - uchar val; - - /* Clear all clock control registers */ - rtc_write (0x0, 0x80); /* No Read Lock or calibration */ - - /* Clear stop bit */ - val = rtc_read (0x1); - val &= 0x7f; - rtc_write(0x1, val); - - /* Enable century / disable frequency test */ - val = rtc_read (0x4); - val = (val & 0xBF) | 0x20; - rtc_write(0x4, val); - - /* Clear write lock */ - rtc_write(0x0, 0); -} - -/* ------------------------------------------------------------------------- */ - -static uchar rtc_read (uchar reg) -{ - return *(unsigned char *) - ((CONFIG_SYS_NVRAM_BASE_ADDR + CONFIG_SYS_NVRAM_SIZE - 8) + reg); -} - -static void rtc_write (uchar reg, uchar val) -{ - *(unsigned char *) - ((CONFIG_SYS_NVRAM_BASE_ADDR + CONFIG_SYS_NVRAM_SIZE - 8) + reg) = val; -} diff --git a/drivers/rtc/mc146818.c b/drivers/rtc/mc146818.c index 71f96e2..122691b 100644 --- a/drivers/rtc/mc146818.c +++ b/drivers/rtc/mc146818.c @@ -22,7 +22,7 @@ /* Set this to 1 to clear the CMOS RAM */ #define CLEAR_CMOS 0 -#define RTC_PORT_MC146818 CONFIG_SYS_ISA_IO_BASE_ADDRESS + 0x70 +#define RTC_PORT_MC146818 0x70 #define RTC_SECONDS 0x00 #define RTC_SECONDS_ALARM 0x01 #define RTC_MINUTES 0x02 |