Annotation of sys/arch/landisk/stand/boot/getsecs.c, Revision 1.1
1.1 ! nbrk 1: /* $NetBSD: getsecs.c,v 1.2 2006/09/11 13:48:57 nonaka Exp $ */
! 2:
! 3: #include <sys/param.h>
! 4:
! 5: #include <netinet/in.h>
! 6: #include <netinet/in_systm.h>
! 7:
! 8: #include <lib/libsa/stand.h>
! 9: #include <lib/libsa/net.h>
! 10: #include <lib/libsa/netif.h>
! 11:
! 12: #include <sh/devreg.h>
! 13: #include <arch/sh/dev/scireg.h>
! 14:
! 15: #include <arch/landisk/dev/rs5c313reg.h>
! 16:
! 17: /**
! 18: * RICOH RS5C313
! 19: *
! 20: * Web page: http://www.ricoh.co.jp/LSI/product_rtc/3wire/5c313/
! 21: *
! 22: * How to control RS5C313 on LANDISK
! 23: * see http://www.mizore.jp/wiki/index.php?LANDISK/rtc
! 24: */
! 25:
! 26: uint8_t rtc_read(uint32_t addr);
! 27: void rtc_write(uint32_t addr, uint8_t data);
! 28:
! 29: static void
! 30: rtc_init(void)
! 31: {
! 32:
! 33: SHREG_SCSPTR = SCSPTR_SPB1IO | SCSPTR_SPB1DT
! 34: | SCSPTR_SPB0IO | SCSPTR_SPB0DT;
! 35: delay(1);
! 36: }
! 37:
! 38: /* control RTC chip enable */
! 39: static void
! 40: rtc_ce(int onoff)
! 41: {
! 42:
! 43: if (onoff) {
! 44: _reg_write_1(0xb0000003, (1 << 1));
! 45: } else {
! 46: _reg_write_1(0xb0000003, (0 << 1));
! 47: }
! 48: delay(1);
! 49: }
! 50:
! 51: static inline void
! 52: rtc_clk(int onoff)
! 53: {
! 54:
! 55: if (onoff) {
! 56: SHREG_SCSPTR |= SCSPTR_SPB0DT;
! 57: } else {
! 58: SHREG_SCSPTR &= ~SCSPTR_SPB0DT;
! 59: }
! 60: delay(1);
! 61: }
! 62:
! 63: static void
! 64: rtc_dir(int output)
! 65: {
! 66:
! 67: if (output) {
! 68: SHREG_SCSPTR |= SCSPTR_SPB1IO;
! 69: } else {
! 70: SHREG_SCSPTR &= ~SCSPTR_SPB1IO;
! 71: }
! 72: delay(1);
! 73: }
! 74:
! 75: /* data-out */
! 76: static void
! 77: rtc_do(int onoff)
! 78: {
! 79:
! 80: if (onoff) {
! 81: SHREG_SCSPTR |= SCSPTR_SPB1DT;
! 82: } else {
! 83: SHREG_SCSPTR &= ~SCSPTR_SPB1DT;
! 84: }
! 85: delay(1);
! 86:
! 87: rtc_clk(0);
! 88: rtc_clk(1);
! 89: }
! 90:
! 91: /* data-in */
! 92: static int
! 93: rtc_di(void)
! 94: {
! 95: int d;
! 96:
! 97: d = (SHREG_SCSPTR & SCSPTR_SPB1DT) ? 1 : 0;
! 98:
! 99: rtc_clk(0);
! 100: rtc_clk(1);
! 101:
! 102: return d;
! 103: }
! 104:
! 105: uint8_t
! 106: rtc_read(uint32_t addr)
! 107: {
! 108: uint8_t data;
! 109:
! 110: rtc_init();
! 111: rtc_ce(1);
! 112:
! 113: rtc_dir(1);
! 114: rtc_do(1); /* Don't care */
! 115: rtc_do(1); /* R/#W = 1(READ) */
! 116: rtc_do(1); /* AD = 1 */
! 117: rtc_do(0); /* DT = 0 */
! 118: rtc_do(addr & 0x8); /* A3 */
! 119: rtc_do(addr & 0x4); /* A2 */
! 120: rtc_do(addr & 0x2); /* A1 */
! 121: rtc_do(addr & 0x1); /* A0 */
! 122:
! 123: rtc_dir(0);
! 124: (void)rtc_di();
! 125: (void)rtc_di();
! 126: (void)rtc_di();
! 127: (void)rtc_di();
! 128: data = rtc_di(); /* D3 */
! 129: data <<= 1;
! 130: data |= rtc_di(); /* D2 */
! 131: data <<= 1;
! 132: data |= rtc_di(); /* D1 */
! 133: data <<= 1;
! 134: data |= rtc_di(); /* D0 */
! 135:
! 136: rtc_ce(0);
! 137:
! 138: return data & 0xf;
! 139: }
! 140:
! 141: void
! 142: rtc_write(uint32_t addr, uint8_t data)
! 143: {
! 144:
! 145: rtc_init();
! 146: rtc_ce(1);
! 147:
! 148: rtc_dir(1);
! 149: rtc_do(1); /* Don't care */
! 150: rtc_do(0); /* R/#W = 0(WRITE) */
! 151: rtc_do(1); /* AD = 1 */
! 152: rtc_do(0); /* DT = 0 */
! 153: rtc_do(addr & 0x8); /* A3 */
! 154: rtc_do(addr & 0x4); /* A2 */
! 155: rtc_do(addr & 0x2); /* A1 */
! 156: rtc_do(addr & 0x1); /* A0 */
! 157:
! 158: rtc_do(1); /* Don't care */
! 159: rtc_do(0); /* R/#W = 0(WRITE) */
! 160: rtc_do(0); /* AD = 0 */
! 161: rtc_do(1); /* DT = 1 */
! 162: rtc_do(data & 0x8); /* D3 */
! 163: rtc_do(data & 0x4); /* D2 */
! 164: rtc_do(data & 0x2); /* D1 */
! 165: rtc_do(data & 0x1); /* D0 */
! 166:
! 167: rtc_ce(0);
! 168: }
! 169:
! 170: time_t
! 171: getsecs(void)
! 172: {
! 173: uint32_t sec, min, hour, day;
! 174: #if 0
! 175: uint32_t mon, year;
! 176: #endif
! 177: time_t secs;
! 178:
! 179: sec = rtc_read(RS5C313_SEC1);
! 180: sec += rtc_read(RS5C313_SEC10) * 10;
! 181: min = rtc_read(RS5C313_MIN1);
! 182: min += rtc_read(RS5C313_MIN10) * 10;
! 183: hour = rtc_read(RS5C313_HOUR1);
! 184: hour += rtc_read(RS5C313_HOUR10) * 10;
! 185: day = rtc_read(RS5C313_DAY1);
! 186: day += rtc_read(RS5C313_DAY10) * 10;
! 187: #if 0
! 188: mon = rtc_read(RS5C313_MON1);
! 189: mon += rtc_read(RS5C313_MON10) * 10;
! 190: year = rtc_read(RS5C313_YEAR1);
! 191: year += rtc_read(RS5C313_YEAR10) * 10;
! 192: #endif
! 193:
! 194: secs = sec;
! 195: secs += min * 60;
! 196: secs += hour * 60 * 60;
! 197: secs += day * 60 * 60 * 24;
! 198: #if 0
! 199: /* XXX mon, year */
! 200: #endif
! 201:
! 202: #if defined(DEBUG)
! 203: printf("getsecs: secs = %d\n", (uint32_t)secs);
! 204: #endif
! 205:
! 206: return secs;
! 207: }
CVSweb