Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Nest
Forks
U-Boot
Commits
0587dd17
Commit
0587dd17
authored
Oct 26, 2002
by
wdenk
Browse files
Initial revision
parent
f682e425
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
156 additions
and
0 deletions
+156
-0
rtc/date.c
rtc/date.c
+156
-0
No files found.
rtc/date.c
0 → 100644
View file @
0587dd17
/*
* (C) Copyright 2001
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/*
* Date & Time support for Philips PCF8563 RTC
*/
#include <common.h>
#include <command.h>
#include <rtc.h>
#if (CONFIG_COMMANDS & CFG_CMD_DATE) || defined(CONFIG_TIMESTAMP)
#define FEBRUARY 2
#define STARTOFTIME 1970
#define SECDAY 86400L
#define SECYR (SECDAY * 365)
#define leapyear(year) ((year) % 4 == 0)
#define days_in_year(a) (leapyear(a) ? 366 : 365)
#define days_in_month(a) (month_days[(a) - 1])
static
int
month_days
[
12
]
=
{
31
,
28
,
31
,
30
,
31
,
30
,
31
,
31
,
30
,
31
,
30
,
31
};
/*
* This only works for the Gregorian calendar - i.e. after 1752 (in the UK)
*/
void
GregorianDay
(
struct
rtc_time
*
tm
)
{
int
leapsToDate
;
int
lastYear
;
int
day
;
int
MonthOffset
[]
=
{
0
,
31
,
59
,
90
,
120
,
151
,
181
,
212
,
243
,
273
,
304
,
334
};
lastYear
=
tm
->
tm_year
-
1
;
/*
* Number of leap corrections to apply up to end of last year
*/
leapsToDate
=
lastYear
/
4
-
lastYear
/
100
+
lastYear
/
400
;
/*
* This year is a leap year if it is divisible by 4 except when it is
* divisible by 100 unless it is divisible by 400
*
* e.g. 1904 was a leap year, 1900 was not, 1996 is, and 2000 will be
*/
if
((
tm
->
tm_year
%
4
==
0
)
&&
((
tm
->
tm_year
%
100
!=
0
)
||
(
tm
->
tm_year
%
400
==
0
))
&&
(
tm
->
tm_mon
>
2
))
{
/*
* We are past Feb. 29 in a leap year
*/
day
=
1
;
}
else
{
day
=
0
;
}
day
+=
lastYear
*
365
+
leapsToDate
+
MonthOffset
[
tm
->
tm_mon
-
1
]
+
tm
->
tm_mday
;
tm
->
tm_wday
=
day
%
7
;
}
void
to_tm
(
int
tim
,
struct
rtc_time
*
tm
)
{
register
int
i
;
register
long
hms
,
day
;
day
=
tim
/
SECDAY
;
hms
=
tim
%
SECDAY
;
/* Hours, minutes, seconds are easy */
tm
->
tm_hour
=
hms
/
3600
;
tm
->
tm_min
=
(
hms
%
3600
)
/
60
;
tm
->
tm_sec
=
(
hms
%
3600
)
%
60
;
/* Number of years in days */
for
(
i
=
STARTOFTIME
;
day
>=
days_in_year
(
i
);
i
++
)
{
day
-=
days_in_year
(
i
);
}
tm
->
tm_year
=
i
;
/* Number of months in days left */
if
(
leapyear
(
tm
->
tm_year
))
{
days_in_month
(
FEBRUARY
)
=
29
;
}
for
(
i
=
1
;
day
>=
days_in_month
(
i
);
i
++
)
{
day
-=
days_in_month
(
i
);
}
days_in_month
(
FEBRUARY
)
=
28
;
tm
->
tm_mon
=
i
;
/* Days are what is left over (+1) from all that. */
tm
->
tm_mday
=
day
+
1
;
/*
* Determine the day of week
*/
GregorianDay
(
tm
);
}
/* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
* Assumes input in normal date format, i.e. 1980-12-31 23:59:59
* => year=1980, mon=12, day=31, hour=23, min=59, sec=59.
*
* [For the Julian calendar (which was used in Russia before 1917,
* Britain & colonies before 1752, anywhere else before 1582,
* and is still in use by some communities) leave out the
* -year/100+year/400 terms, and add 10.]
*
* This algorithm was first published by Gauss (I think).
*
* WARNING: this function will overflow on 2106-02-07 06:28:16 on
* machines were long is 32-bit! (However, as time_t is signed, we
* will already get problems at other places on 2038-01-19 03:14:08)
*/
unsigned
long
mktime
(
unsigned
int
year
,
unsigned
int
mon
,
unsigned
int
day
,
unsigned
int
hour
,
unsigned
int
min
,
unsigned
int
sec
)
{
if
(
0
>=
(
int
)
(
mon
-=
2
))
{
/* 1..12 -> 11,12,1..10 */
mon
+=
12
;
/* Puts Feb last since it has leap day */
year
-=
1
;
}
return
(((
(
unsigned
long
)
(
year
/
4
-
year
/
100
+
year
/
400
+
367
*
mon
/
12
+
day
)
+
year
*
365
-
719499
)
*
24
+
hour
/* now have hours */
)
*
60
+
min
/* now have minutes */
)
*
60
+
sec
;
/* finally seconds */
}
#endif
/* CFG_CMD_DATE */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment