From 707dd54c54c9956c9ba5336f0570a79332eee0f2 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Fri, 7 Aug 2009 13:53:20 +0000 Subject: [PATCH] new sa.timer! --- .../cmd/standalone/sa.timer/common/gmtime.c | 96 +++++++++ .../cmd/standalone/sa.timer/common/rtc72421.c | 113 ++++++++++ .../cmd/standalone/sa.timer/common/rtc72421.h | 69 ++++++ .../cmd/standalone/sa.timer/common/timegm.c | 58 ++++++ .../src/cmd/standalone/sa.timer/common/u130.c | 196 ++++++++++++++++++ .../src/cmd/standalone/sa.timer/common/u130.h | 53 +++++ .../standalone/sa.timer/standalone/sa.timer.c | 123 +++++++++++ 7 files changed, 708 insertions(+) create mode 100644 WEGA/src/cmd/standalone/sa.timer/common/gmtime.c create mode 100644 WEGA/src/cmd/standalone/sa.timer/common/rtc72421.c create mode 100644 WEGA/src/cmd/standalone/sa.timer/common/rtc72421.h create mode 100644 WEGA/src/cmd/standalone/sa.timer/common/timegm.c create mode 100644 WEGA/src/cmd/standalone/sa.timer/common/u130.c create mode 100644 WEGA/src/cmd/standalone/sa.timer/common/u130.h create mode 100644 WEGA/src/cmd/standalone/sa.timer/standalone/sa.timer.c diff --git a/WEGA/src/cmd/standalone/sa.timer/common/gmtime.c b/WEGA/src/cmd/standalone/sa.timer/common/gmtime.c new file mode 100644 index 0000000..ad6c2eb --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.timer/common/gmtime.c @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2009 Oliver Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: gmtime.c,v 1.1 2009/08/07 13:53:20 olivleh1 Exp $ + */ + +#define dysize(A) (((A)%4)? 365: 366) +#include + +struct tm *gmtime(); + +static char cbuf[26]; +static int dmsize[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + +struct tm * +gmtime(tim) +const long *tim; +{ + register int d0, d1; + long hms, day; + static struct tm xtime; + + /* + * break initial number into days + */ + hms = *tim % 86400L; + day = *tim / 86400L; + if(hms < 0) { + hms += 86400L; + day -= 1; + } + /* + * generate hours:minutes:seconds + */ + xtime.tm_sec = hms % 60; + d1 = hms / 60; + xtime.tm_min = d1 % 60; + d1 /= 60; + xtime.tm_hour = d1; + + /* + * day is the day number. + * generate day of the week. + * The addend is 4 mod 7 (1/1/1970 was Thursday) + */ + + xtime.tm_wday = (day + 7340036L) % 7; + + /* + * year number + */ + if(day >= 0) + for(d1=70; day >= dysize(d1); d1++) + day -= dysize(d1); + else + for(d1=70; day < 0; d1--) + day += dysize(d1-1); + xtime.tm_year = d1; + xtime.tm_yday = d0 = day; + + /* + * generate month + */ + + if(dysize(d1) == 366) + dmsize[1] = 29; + for(d1=0; d0 >= dmsize[d1]; d1++) + d0 -= dmsize[d1]; + dmsize[1] = 28; + xtime.tm_mday = d0+1; + xtime.tm_mon = d1; + xtime.tm_isdst = 0; + return(&xtime); +} diff --git a/WEGA/src/cmd/standalone/sa.timer/common/rtc72421.c b/WEGA/src/cmd/standalone/sa.timer/common/rtc72421.c new file mode 100644 index 0000000..a78ed68 --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.timer/common/rtc72421.c @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2009 Oliver Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: rtc72421.c,v 1.1 2009/08/07 13:53:20 olivleh1 Exp $ + */ + +#include +#include "rtc72421.h" + +void wrnibble(); +void wrbyte(); +int rdnibble(); +int rdbyte(); +extern long timegm(); +extern struct tm *gmtime(); + + +int +rtc72421_init() +{ + return(0); +} + + +int +rtc72421_set(time) +long time; +{ + struct tm *clktime; + + clktime = gmtime(&time); + if(clktime->tm_year > 100) + clktime->tm_year -= 100; + clktime->tm_mon++; + + return(0); +} + +void +rtc72421_start() +{ +} + +long +rtc72421_get() +{ + long time; + struct tm *clktime; + clktime->tm_year = 0; + clktime->tm_mday = 0; + clktime->tm_mon = 0; + while ((clktime->tm_sec = 0) == 59); + clktime->tm_min = 0; + clktime->tm_hour = 0; + + time = timegm(clktime); + + return(time); +} + + +void +wrnibble(addr,nibble) +unsigned addr; +int nibble; +{ +} + +void +wrbyte(addr1,addr2,byte) +unsigned addr1; +unsigned addr2; +int byte; +{ + wrnibble(addr1,byte/10); + wrnibble(addr2,byte%10); +} + +int +rdnibble(addr) +unsigned addr; +{ + return (0); +} +int +rdbyte(addr1,addr2) +unsigned addr1; +unsigned addr2; +{ + return(rdnibble(addr1) + rdnibble(addr2)*10); +} diff --git a/WEGA/src/cmd/standalone/sa.timer/common/rtc72421.h b/WEGA/src/cmd/standalone/sa.timer/common/rtc72421.h new file mode 100644 index 0000000..fdb29cb --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.timer/common/rtc72421.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2009 Oliver Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: rtc72421.h,v 1.1 2009/08/07 13:53:20 olivleh1 Exp $ + */ + +#ifndef R421_H +#define R421_H 1 + +#define STR_R421 0xc0 + +#define R421BASE 0xfde1 /* base address */ +#define R421YYx1 0xfdf5 /* 1-year digit register */ +#define R421YY1x 0xfdf7 /* 10-year digit register */ +#define R421DDx1 0xfded /* 1-day digit register */ +#define R421DD1x 0xfdef /* 10-day digit register */ +#define R421MMx1 0xfdf1 /* 1-month digit register */ +#define R421MM1x 0xfdf3 /* 10-month digit register */ +#define R421SSx1 0xfde1 /* 1-second digit register */ +#define R421SS1x 0xfde3 /* 10-second digit register */ +#define R421HHx1 0xfde9 /* 1-hour digit register */ +#define R421HH1x 0xfdeb /* 10-hour digit register */ +#define R421MIx1 0xfde5 /* 1-minute digit register */ +#define R421MI1x 0xfde7 /* 10-minute digit register */ +#define R421DOW 0xfdfa /* not used */ +#define R421REGD 0xfdfb /* 30-s ADJ, IRQ Flag, BUSY, HOLD */ +#define R421REGE 0xfdfd /* t1, t0, ITRPT/STND, MASK */ +#define R421REGF 0xfdff /* TEST, 24/12, STOP, RESET */ + +/* register F */ +#define R421RST 0x01 +#define R421STOP 0x02 +#define R4212412 0x04 +#define R421TEST 0x08 + +/* register D */ +#define R421HOLD 0x01 +#define R421BUSY 0x02 +#define R421IRQF 0x04 +#define R421ADJ 0x08 + +int rtc72421_init(); +long rtc72421_get(); +int rtc72421_set(); +void rtc72421_start(); + +#endif diff --git a/WEGA/src/cmd/standalone/sa.timer/common/timegm.c b/WEGA/src/cmd/standalone/sa.timer/common/timegm.c new file mode 100644 index 0000000..c09828f --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.timer/common/timegm.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2009 Oliver Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: timegm.c,v 1.1 2009/08/07 13:53:20 olivleh1 Exp $ + */ + +#include + +extern struct tm *gmtime(); + +long +timegm(clktime) +struct tm *clktime; +{ + register long time; + register i; + static int dmsize[] = /* Tage/Monat (kumulierend) */ + { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; + + time = 0; + if (clktime->tm_mday > 31 || clktime->tm_mon > 12) + return(time); + i = dmsize[clktime->tm_mon]; + if (clktime->tm_year%4 == 0 && clktime->tm_mon > 2) i++; + if (clktime->tm_year > 137) return(time); + time = (clktime->tm_year-69)/4; + time += 365*(clktime->tm_year-70)+i; + time += clktime->tm_mday - 1; + + if (clktime->tm_sec > 59 || clktime->tm_min > 59 || clktime->tm_hour > 23) + return(time); + time = 24*time + clktime->tm_hour; + time = 60*time + clktime->tm_min; + time = 60*time + clktime->tm_sec; + return(time); +} diff --git a/WEGA/src/cmd/standalone/sa.timer/common/u130.c b/WEGA/src/cmd/standalone/sa.timer/common/u130.c new file mode 100644 index 0000000..a868b1e --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.timer/common/u130.c @@ -0,0 +1,196 @@ +/* + * Copyright (c) 2009 Oliver Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: u130.c,v 1.1 2009/08/07 13:53:20 olivleh1 Exp $ + */ + +#include +#include "u130.h" + +int rdvalue(); +int invalue(); +void outvalue(); +extern long timegm(); +extern struct tm *gmtime(); + + +int +u130_init() +{ + return(0); +} + + +int +u130_set(time) +long time; +{ + struct tm *clktime; + + clktime = gmtime(&time); + if(clktime->tm_year > 100) + clktime->tm_year -= 100; + clktime->tm_mon++; + + outvalue(0x02); /* Datum einstellen */ + outvalue(0x03); /* Korrektur Monat */ + outvalue(0x00); + while ((invalue(U130MMx1,1) + invalue(U130MM1x,1)*10) != clktime->tm_mon) + ; + outvalue(0x01); /* Korrektur Zehnerstelle Tag */ + outvalue(0x00); + while (invalue(U130DD1x,1) != clktime->tm_mday/10) + ; + outvalue(0x01); /* Korrektur Einerstelle Tag */ + outvalue(0x00); + while (invalue(U130DDx1,1) != clktime->tm_mday%10) + ; + outvalue(0x01); /* Korrektur Zehnerstelle Jahr */ + outvalue(0x00); + while (invalue(U130YY1x,1) != clktime->tm_year/10) + ; + outvalue(0x01); /* Korrektur Einerstelle Jahr */ + outvalue(0x00); + while (invalue(U130YYx1,1) != clktime->tm_year%10) + ; + outvalue(0x02); /* Korrektur Ende */ + outvalue(0x00); + + outvalue(0x01); /* Zeit stellen */ + outvalue(0x00); + outvalue(0x02); /* Sekunden auf Null */ + outvalue(0x00); + outvalue(0x01); + outvalue(0x00); + outvalue(0x01); /* Korrektur Stunden */ + outvalue(0x00); + while ((invalue(U130HHx1,1) + invalue(U130HH1x,1)*10) != clktime->tm_hour) + ; + outvalue(0x01); /* Korrektur Zehner-Minuten */ + outvalue(0x00); + while (invalue(U130MI1x,1) != clktime->tm_min/10) + ; + outvalue(0x01); /* Korrektur Einer-Minuten */ + outvalue(0x00); + while (invalue(U130MIx1,1) != clktime->tm_min%10) + ; + outvalue(0x01); /* Korrektur Stop */ + outvalue(0x00); + return(0); +} + +void +u130_start() +{ + outvalue(0x01); /* Start der Zeit */ + outvalue(0x00); +} + +long +u130_get() +{ + long time; + struct tm *clktime; + outvalue(0x02); /* Umschalten auf Datum */ + clktime->tm_year = rdvalue(U130YYx1); + clktime->tm_mday = rdvalue(U130DDx1); + clktime->tm_mon = rdvalue(U130MMx1); + outvalue(0x00); + clktime->tm_sec = inb(U130MM1x) & 0x28; /* Umschalten auf Zeit */ + if (clktime->tm_sec == 0x08 || clktime->tm_sec == 0x20) { + outvalue(0x02); + outvalue(0x00); + } + while ((clktime->tm_sec = rdvalue(U130SSx1)) == 59); + clktime->tm_min = rdvalue(U130MIx1); + clktime->tm_hour = rdvalue(U130HHx1); + + time = timegm(clktime); + + return(time); +} + + +void +outvalue(t) +register t; +{ + outb(U130BASE, t); + t = 10000; + while (t--) + ; +} + +int +invalue(addr, flag) +register addr; +register flag; +{ + register seg7, takt; + + seg7 = inb(addr); + if (seg7 != inb(addr)) + seg7 = inb(addr); + takt = seg7 & 0x80; /* nur gueltig bei 6. Stelle */ + if (seg7 & 0x20) + seg7 = ~seg7; + if (addr == 0xfeff) /* 6.Stelle */ + seg7 &= 0x07; + seg7 &= 0x1f; + if (seg7 == 0x0f) + return(0); + if (seg7 == 0x00) { + if (flag == 0) + return(0); + if (addr == 0xfeff && takt) + return(0); + } + if (seg7 == 0x02) + return(1); + if (seg7 == 0x17 || seg7 == 0x05) + return(2); + if (seg7 == 0x13) + return(3); + if (seg7 == 0x1a) + return(4); + if (seg7 == 0x19) + return(5); + if (seg7 == 0x1d) + return(6); + if (seg7 == 0x03) + return(7); + if (seg7 == 0x1f) + return(8); + if (seg7 == 0x1b) + return(9); + return(0xff); +} + +int +rdvalue(addr) +unsigned addr; +{ + return(invalue(addr,0) + invalue(addr+2,0)*10); +} diff --git a/WEGA/src/cmd/standalone/sa.timer/common/u130.h b/WEGA/src/cmd/standalone/sa.timer/common/u130.h new file mode 100644 index 0000000..e8e1c67 --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.timer/common/u130.h @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2009 Oliver Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: u130.h,v 1.1 2009/08/07 13:53:20 olivleh1 Exp $ + */ + +#ifndef U130_H +#define U130_H 1 + +#define STR_U130 0xbf + +#define U130BASE 0xfef1 /* base address */ +#define U130YYx1 0xfef5 /* 1-year digit register */ +#define U130YY1x 0xfef7 /* 10-year digit register */ +#define U130DDx1 0xfef9 /* 1-day digit register */ +#define U130DD1x 0xfefb /* 10-day digit register */ +#define U130MMx1 0xfefd /* 1-month digit register */ +#define U130MM1x 0xfeff /* 10-month digit register */ +#define U130SSx1 0xfef5 /* 1-second digit register */ +#define U130SS1x 0xfef7 /* 10-second digit register */ +#define U130HHx1 0xfefd /* 1-hour digit register */ +#define U130HH1x 0xfeff /* 10-hour digit register */ +#define U130MIx1 0xfef9 /* 1-minute digit register */ +#define U130MI1x 0xfefb /* 10-minute digit register */ + +int u130_init(); +long u130_get(); +int u130_set(); +void u130_start(); + +#endif diff --git a/WEGA/src/cmd/standalone/sa.timer/standalone/sa.timer.c b/WEGA/src/cmd/standalone/sa.timer/standalone/sa.timer.c new file mode 100644 index 0000000..d2d97b8 --- /dev/null +++ b/WEGA/src/cmd/standalone/sa.timer/standalone/sa.timer.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2009 Oliver Lehmann + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: sa.timer.c,v 1.1 2009/08/07 13:53:20 olivleh1 Exp $ + */ + +#include +#include +#include +#include "u130.h" +#include "rtc72421.h" + +extern long timegm(); +extern struct tm *gmtime(); + +char estring[20]; + +main() +{ + register long time; + + if (inb(U130BASE) != STR_U130) { /* Uhrmodul vorhanden ? */ + printf("Timer not available\n"); + exit(1); + } + time = u130_get(); /* Uhrenmodul lesen */ + outtime(time); /* Datum/Zeit ausgeben */ + settimer(); /* Uhrenmodul neu programmieren */ + time = u130_get(); /* Uhrenmodul lesen */ + outtime(time); /* Datum/Zeit ausgeben */ + exit(0); +} + +getdat(k) +register k; +{ + register i, c, n; + + n = 0; + for (i = 0; c = estring[i]; i++) { + if (k-1 == 0) { + if (c == '/' || c== ':') return(n); + if (c < '0' || c > '9') return(-1); + n = n*10 + (c-'0'); + } else + if (c == '/' || c == ':') k--; + } + return(n); +} + +outtime(time) +long time; +{ + struct tm *clktime; + + clktime = gmtime(&time); + + clktime->tm_year += 1900; + clktime->tm_mon++; + + printf("Date is: %d/%d/%d\n", clktime->tm_mon, clktime->tm_mday, clktime->tm_year); + printf("Time is: %d:%d:%d GMT\n", clktime->tm_hour, clktime->tm_min, clktime->tm_sec); +} + +settimer() +{ + struct tm *clktime; + long time; + int i; +loop1: + printf("Enter new Date (MM/DD/YY) : "); + gets(estring, sizeof estring); + if (estring[0] == 0) + goto loop2; + clktime->tm_mon = getdat(1)-1; + clktime->tm_mday = getdat(2); + clktime->tm_year = getdat(3); + if (clktime->tm_year < 70 ) + clktime->tm_year += 100; + + if (clktime->tm_mon<1 || clktime->tm_mon>12 || clktime->tm_mday<1 || clktime->tm_mday>31) + goto loop1; + +loop2: + printf("Enter new Time in GMT (HH:MM) : "); + gets(estring, sizeof estring); + if (estring[0] == 0) + return; + clktime->tm_hour = getdat(1); + clktime->tm_min = getdat(2); + clktime->tm_sec = 0; + if (clktime->tm_min<0 || clktime->tm_min>59 || clktime->tm_hour<0 || clktime->tm_hour>23) + goto loop2; + + time = timegm(clktime); + u130_set(time); + printf("Enter Return to start time : "); + gets(estring, 1); + u130_start(); + +}