1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2018-05-06     sundm75       first version
9  */
10 #include "ls1c.h"
11 #include "ls1c_public.h"
12 #include "ls1c_rtc.h"
13 
14 #define LS1C_SEC_OFFSET		(4)
15 #define LS1C_MIN_OFFSET		(10)
16 #define LS1C_HOUR_OFFSET	(16)
17 #define LS1C_DAY_OFFSET		(21)
18 #define LS1C_MONTH_OFFSET	(26)
19 
20 #define LS1C_SEC_MASK		(0x3f)
21 #define LS1C_MIN_MASK		(0x3f)
22 #define LS1C_HOUR_MASK		(0x1f)
23 #define LS1C_DAY_MASK		(0x1f)
24 #define LS1C_MONTH_MASK		(0x3f)
25 #define LS1C_YEAR_MASK		(0xff)
26 
27 #define ls1c_get_sec(t)		(((t) >> LS1C_SEC_OFFSET) & LS1C_SEC_MASK)
28 #define ls1c_get_min(t)		(((t) >> LS1C_MIN_OFFSET) & LS1C_MIN_MASK)
29 #define ls1c_get_hour(t)	(((t) >> LS1C_HOUR_OFFSET) & LS1C_HOUR_MASK)
30 #define ls1c_get_day(t)		(((t) >> LS1C_DAY_OFFSET) & LS1C_DAY_MASK)
31 #define ls1c_get_month(t)	(((t) >> LS1C_MONTH_OFFSET) & LS1C_MONTH_MASK)
32 
RTC_SetTime(RTC_TypeDef * hrtc,RTC_TimeTypeDef * sTime)33 int RTC_SetTime(RTC_TypeDef *hrtc, RTC_TimeTypeDef *sTime)
34 {
35 
36 	hrtc->SYS_TOYWRITE0
37 		= (sTime->Month  << LS1C_MONTH_OFFSET)
38 		| (sTime->Date << LS1C_DAY_OFFSET)
39 		| (sTime->Hours << LS1C_HOUR_OFFSET)
40 		| (sTime->Minutes  << LS1C_MIN_OFFSET)
41 		| (sTime->Seconds  << LS1C_SEC_OFFSET);
42 	hrtc->SYS_TOYWRITE1 =  sTime->Year % 100;
43 	printf("\r\ntoy_read0 = 0x%x, toy_read1 = 0x%x.\r\n", hrtc->SYS_TOYREAD0, hrtc->SYS_TOYREAD1);
44 
45    return 0;
46 }
47 
RTC_GetTime(RTC_TypeDef * hrtc,RTC_TimeTypeDef * sTime)48 int RTC_GetTime(RTC_TypeDef *hrtc, RTC_TimeTypeDef *sTime)
49 {
50   unsigned long toy_read0, toy_read1;
51   toy_read0 = hrtc->SYS_TOYREAD0;
52   toy_read1 = hrtc->SYS_TOYREAD1;
53   sTime->Seconds = ls1c_get_sec(toy_read0);
54   sTime->Minutes = ls1c_get_min(toy_read0);
55   sTime->Hours = ls1c_get_hour(toy_read0);
56   sTime->Date = ls1c_get_day(toy_read0);
57   sTime->Month = ls1c_get_month(toy_read0);
58   sTime->Year = toy_read1 & LS1C_YEAR_MASK;
59   return 0 ;
60 }
61 
RTC_IsLeapYear(unsigned int nYear)62 unsigned char RTC_IsLeapYear(unsigned int nYear)
63 {
64   if((nYear % 4U) != 0U)
65   {
66     return 0U;
67   }
68 
69   if((nYear % 100U) != 0U)
70   {
71     return 1U;
72   }
73 
74   if((nYear % 400U) == 0U)
75   {
76     return 1U;
77   }
78   else
79   {
80     return 0U;
81   }
82 }
83 
RTC_WeekDayNum(unsigned long nYear,unsigned char nMonth,unsigned char nDay)84 unsigned char RTC_WeekDayNum(unsigned long nYear, unsigned char nMonth, unsigned char nDay)
85 {
86   unsigned long year = 0U, weekday = 0U;
87 
88   year = 2000U + nYear;
89 
90   if(nMonth < 3U)
91   {
92     /*D = { [(23 x month)/9] + day + 4 + year + [(year-1)/4] - [(year-1)/100] + [(year-1)/400] } mod 7*/
93     weekday = (((23U * nMonth)/9U) + nDay + 4U + year + ((year-1U)/4U) - ((year-1U)/100U) + ((year-1U)/400U)) % 7U;
94   }
95   else
96   {
97     /*D = { [(23 x month)/9] + day + 4 + year + [year/4] - [year/100] + [year/400] - 2 } mod 7*/
98     weekday = (((23U * nMonth)/9U) + nDay + 4U + year + (year/4U) - (year/100U) + (year/400U) - 2U ) % 7U;
99   }
100 
101   return (unsigned char)weekday;
102 }
103