Annotation of sys/arch/landisk/stand/boot/getsecs.c, Revision 1.1.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