x1205.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*
  2. * (C) Copyright 2007
  3. * Stefan Roese, DENX Software Engineering, sr@denx.de.
  4. *
  5. * based on a the Linux rtc-x1207.c driver which is:
  6. * Copyright 2004 Karen Spearel
  7. * Copyright 2005 Alessandro Zummo
  8. *
  9. * Information and datasheet:
  10. * http://www.intersil.com/cda/deviceinfo/0,1477,X1205,00.html
  11. *
  12. * See file CREDITS for list of people who contributed to this
  13. * project.
  14. *
  15. * This program is free software; you can redistribute it and/or
  16. * modify it under the terms of the GNU General Public License as
  17. * published by the Free Software Foundation; either version 2 of
  18. * the License, or (at your option) any later version.
  19. *
  20. * This program is distributed in the hope that it will be useful,
  21. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  23. * GNU General Public License for more details.
  24. *
  25. * You should have received a copy of the GNU General Public License
  26. * along with this program; if not, write to the Free Software
  27. * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
  28. * MA 02111-1307 USA
  29. */
  30. /*
  31. * Date & Time support for Xicor/Intersil X1205 RTC
  32. */
  33. /* #define DEBUG */
  34. #include <common.h>
  35. #include <command.h>
  36. #include <rtc.h>
  37. #include <i2c.h>
  38. #include <bcd.h>
  39. #if defined(CONFIG_RTC_X1205) && defined(CONFIG_CMD_DATE)
  40. #define CCR_SEC 0
  41. #define CCR_MIN 1
  42. #define CCR_HOUR 2
  43. #define CCR_MDAY 3
  44. #define CCR_MONTH 4
  45. #define CCR_YEAR 5
  46. #define CCR_WDAY 6
  47. #define CCR_Y2K 7
  48. #define X1205_REG_SR 0x3F /* status register */
  49. #define X1205_REG_Y2K 0x37
  50. #define X1205_REG_DW 0x36
  51. #define X1205_REG_YR 0x35
  52. #define X1205_REG_MO 0x34
  53. #define X1205_REG_DT 0x33
  54. #define X1205_REG_HR 0x32
  55. #define X1205_REG_MN 0x31
  56. #define X1205_REG_SC 0x30
  57. #define X1205_REG_DTR 0x13
  58. #define X1205_REG_ATR 0x12
  59. #define X1205_REG_INT 0x11
  60. #define X1205_REG_0 0x10
  61. #define X1205_REG_Y2K1 0x0F
  62. #define X1205_REG_DWA1 0x0E
  63. #define X1205_REG_YRA1 0x0D
  64. #define X1205_REG_MOA1 0x0C
  65. #define X1205_REG_DTA1 0x0B
  66. #define X1205_REG_HRA1 0x0A
  67. #define X1205_REG_MNA1 0x09
  68. #define X1205_REG_SCA1 0x08
  69. #define X1205_REG_Y2K0 0x07
  70. #define X1205_REG_DWA0 0x06
  71. #define X1205_REG_YRA0 0x05
  72. #define X1205_REG_MOA0 0x04
  73. #define X1205_REG_DTA0 0x03
  74. #define X1205_REG_HRA0 0x02
  75. #define X1205_REG_MNA0 0x01
  76. #define X1205_REG_SCA0 0x00
  77. #define X1205_CCR_BASE 0x30 /* Base address of CCR */
  78. #define X1205_ALM0_BASE 0x00 /* Base address of ALARM0 */
  79. #define X1205_SR_RTCF 0x01 /* Clock failure */
  80. #define X1205_SR_WEL 0x02 /* Write Enable Latch */
  81. #define X1205_SR_RWEL 0x04 /* Register Write Enable */
  82. #define X1205_DTR_DTR0 0x01
  83. #define X1205_DTR_DTR1 0x02
  84. #define X1205_DTR_DTR2 0x04
  85. #define X1205_HR_MIL 0x80 /* Set in ccr.hour for 24 hr mode */
  86. static void rtc_write(int reg, u8 val)
  87. {
  88. i2c_write(CFG_I2C_RTC_ADDR, reg, 2, &val, 1);
  89. }
  90. /*
  91. * In the routines that deal directly with the x1205 hardware, we use
  92. * rtc_time -- month 0-11, hour 0-23, yr = calendar year-epoch
  93. * Epoch is initialized as 2000. Time is set to UTC.
  94. */
  95. void rtc_get(struct rtc_time *tm)
  96. {
  97. u8 buf[8];
  98. i2c_read(CFG_I2C_RTC_ADDR, X1205_CCR_BASE, 2, buf, 8);
  99. debug("%s: raw read data - sec=%02x, min=%02x, hr=%02x, "
  100. "mday=%02x, mon=%02x, year=%02x, wday=%02x, y2k=%02x\n",
  101. __FUNCTION__,
  102. buf[0], buf[1], buf[2], buf[3],
  103. buf[4], buf[5], buf[6], buf[7]);
  104. tm->tm_sec = BCD2BIN(buf[CCR_SEC]);
  105. tm->tm_min = BCD2BIN(buf[CCR_MIN]);
  106. tm->tm_hour = BCD2BIN(buf[CCR_HOUR] & 0x3F); /* hr is 0-23 */
  107. tm->tm_mday = BCD2BIN(buf[CCR_MDAY]);
  108. tm->tm_mon = BCD2BIN(buf[CCR_MONTH]); /* mon is 0-11 */
  109. tm->tm_year = BCD2BIN(buf[CCR_YEAR])
  110. + (BCD2BIN(buf[CCR_Y2K]) * 100);
  111. tm->tm_wday = buf[CCR_WDAY];
  112. debug("%s: tm is secs=%d, mins=%d, hours=%d, "
  113. "mday=%d, mon=%d, year=%d, wday=%d\n",
  114. __FUNCTION__,
  115. tm->tm_sec, tm->tm_min, tm->tm_hour,
  116. tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
  117. }
  118. void rtc_set(struct rtc_time *tm)
  119. {
  120. int i;
  121. u8 buf[8];
  122. debug("Set DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
  123. tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_wday,
  124. tm->tm_hour, tm->tm_min, tm->tm_sec);
  125. buf[CCR_SEC] = BIN2BCD(tm->tm_sec);
  126. buf[CCR_MIN] = BIN2BCD(tm->tm_min);
  127. /* set hour and 24hr bit */
  128. buf[CCR_HOUR] = BIN2BCD(tm->tm_hour) | X1205_HR_MIL;
  129. buf[CCR_MDAY] = BIN2BCD(tm->tm_mday);
  130. /* month, 1 - 12 */
  131. buf[CCR_MONTH] = BIN2BCD(tm->tm_mon);
  132. /* year, since the rtc epoch*/
  133. buf[CCR_YEAR] = BIN2BCD(tm->tm_year % 100);
  134. buf[CCR_WDAY] = tm->tm_wday & 0x07;
  135. buf[CCR_Y2K] = BIN2BCD(tm->tm_year / 100);
  136. /* this sequence is required to unlock the chip */
  137. rtc_write(X1205_REG_SR, X1205_SR_WEL);
  138. rtc_write(X1205_REG_SR, X1205_SR_WEL | X1205_SR_RWEL);
  139. /* write register's data */
  140. for (i = 0; i < 8; i++)
  141. rtc_write(X1205_CCR_BASE + i, buf[i]);
  142. rtc_write(X1205_REG_SR, 0);
  143. }
  144. void rtc_reset(void)
  145. {
  146. /*
  147. * Nothing to do
  148. */
  149. }
  150. #endif