Subject: RTC fix
To: NetBSD/next68k developers list <port-next68k@netbsd.org>
From: Timm Wetzel <twetzel@gwdg.de>
List: port-next68k
Date: 06/22/2001 12:16:33
I've noticed that getsecs() gave a bit strange results on my turbo.

Rearranging the RTC subbytes in the secs value made things consistent for
me.

Could anyone check whether this is different on non-turbo hardware?
An easy way to check is to break into DDB and just call getsecs()
repeatedly. If the result doesn't get get incremented secondly, the
following patch should help.

(The diff is against (around) 1.5U, with support for RTC_OFFSET thrown
in.)
<CUT>
Index: /space/netbsd-current-src/netbsd/src/sys/arch/next68k/next68k/rtc.c
===================================================================
RCS file: /clients/cvsroot/netbsd/src/sys/arch/next68k/next68k/rtc.c,v
retrieving revision 1.1.1.3
retrieving revision 1.2
diff -u -r1.1.1.3 -r1.2
--- rtc.c	2000/06/10 09:57:39	1.1.1.3
+++ rtc.c	2001/01/09 01:14:19	1.2
@@ -41,6 +41,7 @@
 #include <sys/param.h>
 #include <sys/cdefs.h>          /* for __P */
 #include <sys/systm.h>          /* for panic */
+#include <sys/kernel.h>         /* for rtc_offset */

 #include <machine/cpu.h>

@@ -250,10 +251,13 @@
 	u_int secs = 0;

 	if (new_clock) {
-		secs = rtc_read(RTC_CNTR3) << 24 |
-				rtc_read(RTC_CNTR2) << 16 |
-				rtc_read(RTC_CNTR1) << 8	 |
-				rtc_read(RTC_CNTR0);
+		secs = rtc_read(RTC_CNTR0) << 24 |
+				rtc_read(RTC_CNTR1) << 16 |
+				rtc_read(RTC_CNTR2) << 8	 |
+				rtc_read(RTC_CNTR3);
+		/* if hw-clock is 1968-based (vs. 1970), correct 	*/
+		/* secs -= 2*60*60*24*356;							*/
+		secs += rtc_offset;
 	} else {
 		struct clock_ymdhms val;
 		{
@@ -304,10 +308,13 @@
 #endif

 	if (new_clock) {
-		rtc_write(RTC_CNTR3, (secs << 24) & 0xff);
-		rtc_write(RTC_CNTR2, (secs << 16) & 0xff);
-		rtc_write(RTC_CNTR1, (secs <<	 8) & 0xff);
-		rtc_write(RTC_CNTR0, (secs) & 0xff);
+		/* if hw-clock is 1968-based (vs. 1970), correct 	*/
+		/* secs += 2*60*60*24*356;							*/
+		secs -= rtc_offset;
+		rtc_write(RTC_CNTR0, (secs >> 24) & 0xff);
+		rtc_write(RTC_CNTR1, (secs >> 16) & 0xff);
+		rtc_write(RTC_CNTR2, (secs >>  8) & 0xff);
+		rtc_write(RTC_CNTR3, (secs) & 0xff);

 	} else {
 		struct clock_ymdhms val;
Index: /space/netbsd-current-src/netbsd/src/sys/arch/next68k/stand/boot/rtc.c
===================================================================
RCS file: /clients/cvsroot/netbsd/src/sys/arch/next68k/stand/boot/rtc.c,v
retrieving revision 1.1.1.2
retrieving revision 1.2
diff -u -r1.1.1.2 -r1.2
--- rtc.c	1999/08/09 07:19:30	1.1.1.2
+++ rtc.c	2001/01/09 01:14:22	1.2
@@ -107,10 +107,10 @@
 	u_int secs;

 	if (new_clock) {
-		secs = rtc_read(RTC_CNTR3) << 24 |
-		       rtc_read(RTC_CNTR2) << 16 |
-		       rtc_read(RTC_CNTR1) << 8  |
-		       rtc_read(RTC_CNTR0);
+		secs = rtc_read(RTC_CNTR0) << 24 |
+		       rtc_read(RTC_CNTR1) << 16 |
+		       rtc_read(RTC_CNTR2) << 8  |
+		       rtc_read(RTC_CNTR3);
 	} else {
 		u_char d,h,m,s;
 #define BCD_DECODE(x) (((x) >> 4) * 10 + ((x) & 0xf))
<CUT>

Timm
-- 
Timm Wetzel     	<twetzel@gwdg.de>
Biomed. NMR GmbH        Tel +49 551 201-1091    FAX +49 551 201-1307
Am Fassberg 11, D-37077 Goettingen, Germany