From 9fac970523a1de70ef8bbcfb6c4160ffba80ea78 Mon Sep 17 00:00:00 2001 From: ccli8 Date: Mon, 28 May 2018 16:24:36 +0800 Subject: [PATCH] Meet new RTC HAL spec (Mbed OS 5.9) 1. Power down RTC access from CPU domain in rtc_free. After rtc_free, RTC gets inaccessible from CPU domain but keeps counting. 2. Fix RTC cannot cross reset cycle. --- targets/TARGET_NUVOTON/TARGET_M2351/rtc_api.c | 18 +++++++++++++++++- targets/targets.json | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M2351/rtc_api.c b/targets/TARGET_NUVOTON/TARGET_M2351/rtc_api.c index e6b607e7bf..0373129193 100644 --- a/targets/TARGET_NUVOTON/TARGET_M2351/rtc_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M2351/rtc_api.c @@ -127,7 +127,7 @@ void rtc_init(void) __NONSECURE_ENTRY void rtc_free(void) { - // N/A + CLK_DisableModuleClock_S(rtc_modinit.clkidx); } __NONSECURE_ENTRY @@ -169,9 +169,17 @@ time_t rtc_read(void) if (! _rtc_maketime(&datetime_tm, &t_hwrtc_origin, RTC_FULL_LEAP_YEAR_SUPPORT)) { return 0; } + + /* Load t_write from RTC spare register to cross reset cycle */ + RTC_T *rtc_base = (RTC_T *) NU_MODBASE(rtc_modinit.modname); + RTC_WaitAccessEnable(); + RTC_EnableSpareAccess(); + RTC_WaitAccessEnable(); + t_write = RTC_READ_SPARE_REGISTER(rtc_base, 0); } S_RTC_TIME_DATA_T hwrtc_datetime_2K_present; + RTC_WaitAccessEnable(); RTC_GetDateAndTime(&hwrtc_datetime_2K_present); /* Convert date time from H/W RTC to struct TM */ rtc_convert_datetime_hwrtc_to_tm(&datetime_tm, &hwrtc_datetime_2K_present); @@ -195,6 +203,14 @@ void rtc_write(time_t t) t_write = t; + /* Store t_write to RTC spare register to cross reset cycle */ + RTC_T *rtc_base = (RTC_T *) NU_MODBASE(rtc_modinit.modname); + RTC_WaitAccessEnable(); + RTC_EnableSpareAccess(); + RTC_WaitAccessEnable(); + RTC_WRITE_SPARE_REGISTER(rtc_base, 0, t_write); + + RTC_WaitAccessEnable(); RTC_SetDateAndTime((S_RTC_TIME_DATA_T *) &DATETIME_HWRTC_ORIGIN); /* NOTE: When engine is clocked by low power clock source (LXT/LIRC), we need to wait for 3 engine clocks. */ wait_us((NU_US_PER_SEC / NU_RTCCLK_PER_SEC) * 3); diff --git a/targets/targets.json b/targets/targets.json index c2af74c339..d430a223a0 100755 --- a/targets/targets.json +++ b/targets/targets.json @@ -4316,7 +4316,7 @@ } }, "inherits": ["Target"], - "device_has": ["USTICKER", "LPTICKER", "ANALOGIN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "RTC", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "STDIO_MESSAGES", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "TRNG", "FLASH"], + "device_has": ["USTICKER", "LPTICKER", "RTC", "ANALOGIN", "I2C", "I2CSLAVE", "I2C_ASYNCH", "INTERRUPTIN", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "STDIO_MESSAGES", "SLEEP", "SPI", "SPISLAVE", "SPI_ASYNCH", "TRNG", "FLASH"], "detect_code": ["1305"], "release_versions": ["5"], "device_name": "M2351KIAAEES",