From f47151f8a7003bf6bb3563a73f8f19c634a771de Mon Sep 17 00:00:00 2001 From: RB <60086336+RB-tel@users.noreply.github.com> Date: Thu, 28 May 2020 16:16:25 -0600 Subject: [PATCH] Updated Rx65n rtc for non CONFIG_RTC_HIRES Added support for non CONFIG_RTC_HIRES --- arch/renesas/src/rx65n/rx65n_rtc.c | 138 ++++++++++++++++++- arch/renesas/src/rx65n/rx65n_rtc_lowerhalf.c | 12 +- boards/renesas/rx65n/rx65n-grrose/README.txt | 6 +- boards/renesas/rx65n/rx65n-rsk2mb/README.txt | 2 + 4 files changed, 150 insertions(+), 8 deletions(-) diff --git a/arch/renesas/src/rx65n/rx65n_rtc.c b/arch/renesas/src/rx65n/rx65n_rtc.c index 46a4a4fd57f..fa7b16da545 100644 --- a/arch/renesas/src/rx65n/rx65n_rtc.c +++ b/arch/renesas/src/rx65n/rx65n_rtc.c @@ -539,6 +539,142 @@ int up_rtc_gettime(FAR struct timespec *tp) } #endif +int rx65n_rtc_setdatetime(FAR const struct tm *tp) +{ + int i; + volatile uint8_t dummy_byte; + volatile uint16_t dummy_word; + + /* Break out the time values (note that the time is set only to units of + * seconds) + */ + + /* (void)gmtime_r(&tp->tv_sec, &tp); */ + + rtc_dumptime(&tp, "Setting time"); + + /* Then write the broken out values to the RTC */ + + /* Convert the struct tm format to RTC time register fields. + * + * struct tm TIMR register + * tm_sec 0-61* SEC (0-59) + * tm_min 0-59 MIN (0-59) + * tm_hour 0-23 HOUR (0-23) + * + * *To allow for leap seconds. But these never actuall happen. + */ + + /* Stop all counters */ + + RTC.RCR2.BIT.START = 0U; + while (0U != RTC.RCR2.BIT.START) + { + /* Ensure the clock is stopped while configuring it. */ + } + + /* Execute RTC software reset */ + + RTC.RCR2.BIT.RESET = 1U; + while (1U != RTC.RCR2.BIT.RESET) + { + /* Wait for the reset to complete */ + } + + RTC.RCR2.BIT.HR24 = 1; + + /* Set time */ + + /* Set seconds. (0-59) */ + + RTC.RSECCNT.BYTE = rtc_dec2bcd((uint8_t)tp->tm_sec); + + /* WAIT_LOOP */ + + for (i = 0; i < RTC_DUMMY_READ; i++) + { + dummy_byte = RTC.RSECCNT.BYTE; + } + + /* Set minutes (0-59) */ + + RTC.RMINCNT.BYTE = rtc_dec2bcd((uint8_t) tp->tm_min); + + /* WAIT_LOOP */ + + for (i = 0; i < RTC_DUMMY_READ; i++) + { + dummy_byte = RTC.RMINCNT.BYTE; + } + + /* Set hours. (0-23) */ + + RTC.RHRCNT.BYTE = rtc_dec2bcd((uint8_t) tp->tm_hour); + + /* WAIT_LOOP */ + + for (i = 0; i < RTC_DUMMY_READ; i++) + { + dummy_byte = RTC.RHRCNT.BYTE; + } + + /* Set the date */ + + /* Day of the week (0-6, 0=Sunday) */ + +#if defined(CONFIG_LIBC_LOCALTIME) || defined(CONFIG_TIME_EXTENDED) + RTC.RWKCNT.BYTE = rtc_dec2bcd((uint8_t) tp->tm_wday); + + /* WAIT_LOOP */ + + for (i = 0; i < RTC_DUMMY_READ; i++) + { + dummy_byte = RTC.RWKCNT.BYTE; + } +#endif + + /* Day of the month (1-31) */ + + RTC.RDAYCNT.BYTE = rtc_dec2bcd((uint8_t) tp->tm_mday); + + /* WAIT_LOOP */ + + for (i = 0; i < RTC_DUMMY_READ; i++) + { + dummy_byte = RTC.RDAYCNT.BYTE; + } + + /* Month. (1-12, 1=January) */ + + RTC.RMONCNT.BYTE = rtc_dec2bcd((uint8_t) (tp->tm_mon + 1)); + + /* WAIT_LOOP */ + + for (i = 0; i < RTC_DUMMY_READ; i++) + { + dummy_byte = RTC.RMONCNT.BYTE; + } + + /* Year. (00-99) */ + + RTC.RYRCNT.WORD = (uint16_t) (rtc_dec2bcd((uint8_t) + ((tp->tm_year + 1900) % 100))); + + /* WAIT_LOOP */ + + for (i = 0; i < RTC_DUMMY_READ; i++) + { + dummy_word = RTC.RYRCNT.WORD; + } + + RTC.RCR2.BIT.START = 1U; + + rtc_dumpregs("New time setting"); + UNUSED(dummy_word); + UNUSED(dummy_byte); + return OK; +} + /**************************************************************************** * Name: up_rtc_settime * @@ -710,7 +846,7 @@ int up_rtc_settime(FAR const struct timespec *tp) static int rx65n_rtc_getalarmdatetime(FAR struct tm *tp) { uint8_t bcd_years; - DEBUGASSERT(tp != NULL) + DEBUGASSERT(tp != NULL); tp->tm_sec = rtc_bcd2dec((uint8_t) (RTC.RSECAR.BYTE & 0x7fu)); tp->tm_min = rtc_bcd2dec((uint8_t) (RTC.RMINAR.BYTE & 0x7fu)); diff --git a/arch/renesas/src/rx65n/rx65n_rtc_lowerhalf.c b/arch/renesas/src/rx65n/rx65n_rtc_lowerhalf.c index fc137f03c07..d878fd3e260 100644 --- a/arch/renesas/src/rx65n/rx65n_rtc_lowerhalf.c +++ b/arch/renesas/src/rx65n/rx65n_rtc_lowerhalf.c @@ -57,7 +57,7 @@ struct rx65n_cbinfo_s { volatile rtc_alarm_callback_t cb; /* Callback when the alarm expires */ - volatile FAR void *priv; /* Private argument to accompany callback */ + volatile FAR void *priv; /* Private argument to accompany callback */ uint8_t id; /* Identifies the alarm */ }; #endif @@ -235,6 +235,7 @@ static int rx65n_rdtime(FAR struct rtc_lowerhalf_s *lower, * compatible with struct tm. */ + int ret; return up_rtc_getdatetime((FAR struct tm *)rtctime); #elif defined(CONFIG_RTC_HIRES) @@ -258,6 +259,7 @@ static int rx65n_rdtime(FAR struct rtc_lowerhalf_s *lower, { goto errout_with_errno; } +#endif return OK; @@ -435,6 +437,7 @@ static int rx65n_setrelative(FAR struct rtc_lowerhalf_s *lower, #if defined(CONFIG_RTC_DATETIME) /* Get the broken out time and convert to seconds */ + struct timespec ts; ret = up_rtc_getdatetime(&time); if (ret < 0) { @@ -576,8 +579,9 @@ static int rx65n_rdalarm(FAR struct rtc_lowerhalf_s *lower, * Name: rx65n_periodic_callback * * Description: - * This is the function that is called from the RTC driver when the periodic - * wakeup goes off. It just invokes the upper half drivers callback. + * This is the function that is called from the RTC driver when the + * periodic wakeup goes off. It just invokes the upper half drivers + * callback. * * Input Parameters: * None @@ -733,4 +737,4 @@ FAR struct rtc_lowerhalf_s *rx65n_rtc_lowerhalf(void) } #endif /* CONFIG_RTC_DRIVER */ -#endif + diff --git a/boards/renesas/rx65n/rx65n-grrose/README.txt b/boards/renesas/rx65n/rx65n-grrose/README.txt index 7d1b51405a4..447a8c7219c 100644 --- a/boards/renesas/rx65n/rx65n-grrose/README.txt +++ b/boards/renesas/rx65n/rx65n-grrose/README.txt @@ -38,6 +38,8 @@ Contents - DNS Name Resolution Integration for IPv4 - LINK MONITOR Integration - RTC + - File Systems + - Standby RAM - Debugging Board Features @@ -63,9 +65,7 @@ Status/Open Issues ================== Ethernet --------- -1.Observed instability in Link Management, due to difference in hardware design.(No Separate Interrupt line for PHY) -2.Currently tested only ping and udpblaster application. -3. Executed long run ping and udpblaster stress test for 12 hrs. Code is able to execute for 12hrs without any breakage. + Serial Console ============== diff --git a/boards/renesas/rx65n/rx65n-rsk2mb/README.txt b/boards/renesas/rx65n/rx65n-rsk2mb/README.txt index 070c26c28f0..8a181a78ee0 100644 --- a/boards/renesas/rx65n/rx65n-rsk2mb/README.txt +++ b/boards/renesas/rx65n/rx65n-rsk2mb/README.txt @@ -38,6 +38,8 @@ Contents - DNS Name Resolution Integration for IPv4 - LINK MONITOR Integration - RTC + - Standby RAM + - File Systems - Debugging Board Features