Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
U
u-boot-2015.04
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Container Registry
Model registry
Analyze
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
vesta
u-boot-2015.04
Commits
0587dd17
Commit
0587dd17
authored
22 years ago
by
Wolfgang Denk
Browse files
Options
Downloads
Patches
Plain Diff
Initial revision
parent
f682e425
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
rtc/date.c
+156
-0
156 additions, 0 deletions
rtc/date.c
with
156 additions
and
0 deletions
rtc/date.c
0 → 100644
+
156
−
0
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 */
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment