1 1.8 tsutsui /* $NetBSD: rtc.c,v 1.8 2023/02/12 08:25:09 tsutsui Exp $ */ 2 1.1 dbj /* 3 1.1 dbj * Copyright (c) 1997 Rolf Grossmann 4 1.1 dbj * All rights reserved. 5 1.1 dbj * 6 1.1 dbj * Redistribution and use in source and binary forms, with or without 7 1.1 dbj * modification, are permitted provided that the following conditions 8 1.1 dbj * are met: 9 1.1 dbj * 1. Redistributions of source code must retain the above copyright 10 1.1 dbj * notice, this list of conditions and the following disclaimer. 11 1.1 dbj * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 dbj * notice, this list of conditions and the following disclaimer in the 13 1.1 dbj * documentation and/or other materials provided with the distribution. 14 1.1 dbj * 3. All advertising materials mentioning features or use of this software 15 1.1 dbj * must display the following acknowledgement: 16 1.1 dbj * This product includes software developed by Rolf Grossmann. 17 1.1 dbj * 4. The name of the author may not be used to endorse or promote products 18 1.1 dbj * derived from this software without specific prior written permission 19 1.1 dbj * 20 1.1 dbj * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 21 1.1 dbj * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 22 1.1 dbj * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 23 1.1 dbj * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 24 1.1 dbj * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 25 1.1 dbj * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26 1.1 dbj * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27 1.1 dbj * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28 1.1 dbj * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 29 1.1 dbj * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 1.1 dbj */ 31 1.1 dbj 32 1.1 dbj #include <sys/param.h> 33 1.1 dbj #include <next68k/dev/clockreg.h> 34 1.1 dbj #include <machine/cpu.h> 35 1.6 tsutsui #include <lib/libsa/stand.h> 36 1.6 tsutsui #include <lib/libsa/net.h> 37 1.2 dbj 38 1.8 tsutsui #include "samachdep.h" 39 1.8 tsutsui 40 1.3 chs u_char rtc_read(u_char); 41 1.1 dbj 42 1.1 dbj static volatile u_int *scr2 = (u_int *)NEXT_P_SCR2_CON; 43 1.1 dbj static u_char new_clock; 44 1.1 dbj 45 1.1 dbj u_char 46 1.1 dbj rtc_read(u_char reg) 47 1.1 dbj { 48 1.1 dbj int i; 49 1.1 dbj u_int tmp; 50 1.1 dbj u_char val; 51 1.7 tsutsui 52 1.1 dbj *scr2 = (*scr2 & ~(SCR2_RTDATA | SCR2_RTCLK)) | SCR2_RTCE; 53 1.1 dbj DELAY(1); 54 1.1 dbj 55 1.1 dbj val = reg; 56 1.1 dbj for (i=0; i<8; i++) { 57 1.1 dbj tmp = *scr2 & ~(SCR2_RTDATA | SCR2_RTCLK); 58 1.1 dbj if (val & 0x80) 59 1.1 dbj tmp |= SCR2_RTDATA; 60 1.1 dbj 61 1.1 dbj *scr2 = tmp; 62 1.1 dbj DELAY(1); 63 1.1 dbj *scr2 = tmp | SCR2_RTCLK; 64 1.1 dbj DELAY(1); 65 1.1 dbj *scr2 = tmp; 66 1.1 dbj DELAY(1); 67 1.1 dbj 68 1.1 dbj val <<= 1; 69 1.1 dbj } 70 1.1 dbj 71 1.1 dbj val = 0; /* should be anyway */ 72 1.1 dbj for (i=0; i<8; i++) { 73 1.1 dbj val <<= 1; 74 1.7 tsutsui 75 1.1 dbj tmp = *scr2 & ~(SCR2_RTDATA | SCR2_RTCLK); 76 1.1 dbj 77 1.1 dbj *scr2 = tmp | SCR2_RTCLK; 78 1.1 dbj DELAY(1); 79 1.1 dbj *scr2 = tmp; 80 1.1 dbj DELAY(1); 81 1.1 dbj 82 1.1 dbj if (*scr2 & SCR2_RTDATA) 83 1.1 dbj val |= 1; 84 1.1 dbj } 85 1.1 dbj 86 1.1 dbj *scr2 &= ~(SCR2_RTDATA|SCR2_RTCLK|SCR2_RTCE); 87 1.1 dbj DELAY(1); 88 1.1 dbj 89 1.1 dbj return val; 90 1.1 dbj } 91 1.1 dbj 92 1.1 dbj void 93 1.1 dbj rtc_init(void) 94 1.1 dbj { 95 1.1 dbj u_char val; 96 1.7 tsutsui 97 1.1 dbj val = rtc_read(RTC_STATUS); 98 1.1 dbj new_clock = (val & RTC_NEW_CLOCK) ? 1 : 0; 99 1.1 dbj } 100 1.1 dbj 101 1.6 tsutsui satime_t 102 1.1 dbj getsecs(void) 103 1.1 dbj { 104 1.1 dbj u_int secs; 105 1.7 tsutsui 106 1.1 dbj if (new_clock) { 107 1.5 christos secs = rtc_read(RTC_CNTR0) << 24 | 108 1.5 christos rtc_read(RTC_CNTR1) << 16 | 109 1.5 christos rtc_read(RTC_CNTR2) << 8 | 110 1.5 christos rtc_read(RTC_CNTR3); 111 1.1 dbj } else { 112 1.1 dbj u_char d,h,m,s; 113 1.1 dbj #define BCD_DECODE(x) (((x) >> 4) * 10 + ((x) & 0xf)) 114 1.1 dbj 115 1.1 dbj d = rtc_read(RTC_DAY); 116 1.1 dbj h = rtc_read(RTC_HRS); 117 1.1 dbj m = rtc_read(RTC_MIN); 118 1.1 dbj s = rtc_read(RTC_SEC); 119 1.1 dbj secs = BCD_DECODE(d) * (60*60*24) + 120 1.1 dbj BCD_DECODE(h) * (60*60) + 121 1.1 dbj BCD_DECODE(m) * 60 + 122 1.1 dbj BCD_DECODE(s); 123 1.1 dbj } 124 1.7 tsutsui 125 1.1 dbj return secs; 126 1.1 dbj } 127