From f0b3e4e8501bcb6f9564d5f4071e1eda9dd5cf84 Mon Sep 17 00:00:00 2001 From: Johan Lafon Date: Mon, 11 Sep 2023 12:09:52 +0200 Subject: [PATCH] drivers: rtc: stm32: check if year is supported by RTC RTC does not support year before 2000 while tm/rtc_time structure reference year is 1900 Signed-off-by: Johan Lafon --- drivers/rtc/rtc_ll_stm32.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/drivers/rtc/rtc_ll_stm32.c b/drivers/rtc/rtc_ll_stm32.c index d623dc8b776..f8af22d00c5 100644 --- a/drivers/rtc/rtc_ll_stm32.c +++ b/drivers/rtc/rtc_ll_stm32.c @@ -27,10 +27,12 @@ LOG_MODULE_REGISTER(rtc_stm32, CONFIG_RTC_LOG_LEVEL); -/* Convert calendar start time */ /* RTC start time: 1st, Jan, 2000 */ -/* struct tm start: 1st, Jan, 1900 */ -#define TM_TO_RTC_OFFSET 100 +#define RTC_YEAR_REF 2000 +/* struct tm start time: 1st, Jan, 1900 */ +#define TM_YEAR_REF 1900 +/* conversion offset between RTC and tm structure */ +#define TM_TO_RTC_OFFSET (RTC_YEAR_REF - TM_YEAR_REF) /* Convert part per billion calibration value to a number of clock pulses added or removed each * 2^20 clock cycles so it is suitable for the CALR register fields @@ -129,6 +131,13 @@ static const struct rtc_stm32_config rtc_config = { static int rtc_stm32_set_time(const struct device *dev, const struct rtc_time *timeptr) { + uint32_t real_year = timeptr->tm_year + TM_YEAR_REF; + + if (real_year < RTC_YEAR_REF) { + /* RTC does not support years before 2000 */ + return -EINVAL; + } + LOG_INF("Setting clock"); LL_RTC_DisableWriteProtection(RTC); @@ -137,7 +146,7 @@ static int rtc_stm32_set_time(const struct device *dev, const struct rtc_time *t while (!LL_RTC_IsActiveFlag_INIT(RTC)) { }; - LL_RTC_DATE_SetYear(RTC, __LL_RTC_CONVERT_BIN2BCD(timeptr->tm_year - TM_TO_RTC_OFFSET)); + LL_RTC_DATE_SetYear(RTC, __LL_RTC_CONVERT_BIN2BCD(real_year - RTC_YEAR_REF)); LL_RTC_DATE_SetMonth(RTC, __LL_RTC_CONVERT_BIN2BCD(timeptr->tm_mon + 1)); LL_RTC_DATE_SetDay(RTC, __LL_RTC_CONVERT_BIN2BCD(timeptr->tm_mday));