drivers: rtc: stm32: avoid infinite blocking loop
Use the less CPU intensive and timeout capable WAIT_FOR zephyr provided macro Signed-off-by: Johan Lafon <johan.lafon@syslinbit.com>
This commit is contained in:
parent
cdab80eece
commit
a4f5f87e29
1 changed files with 29 additions and 6 deletions
|
@ -57,6 +57,9 @@ LOG_MODULE_REGISTER(rtc_stm32, CONFIG_RTC_LOG_LEVEL);
|
||||||
#define MAX_PPB NB_PULSES_TO_PPB(MAX_CALP)
|
#define MAX_PPB NB_PULSES_TO_PPB(MAX_CALP)
|
||||||
#define MIN_PPB -NB_PULSES_TO_PPB(MAX_CALM)
|
#define MIN_PPB -NB_PULSES_TO_PPB(MAX_CALM)
|
||||||
|
|
||||||
|
/* Timeout in microseconds used to wait for flags */
|
||||||
|
#define RTC_TIMEOUT 1000000
|
||||||
|
|
||||||
struct rtc_stm32_config {
|
struct rtc_stm32_config {
|
||||||
LL_RTC_InitTypeDef ll_rtc_config;
|
LL_RTC_InitTypeDef ll_rtc_config;
|
||||||
const struct stm32_pclken *pclken;
|
const struct stm32_pclken *pclken;
|
||||||
|
@ -66,6 +69,24 @@ struct rtc_stm32_data {
|
||||||
/* Currently empty */
|
/* Currently empty */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int rtc_stm32_enter_initialization_mode(void)
|
||||||
|
{
|
||||||
|
LL_RTC_EnableInitMode(RTC);
|
||||||
|
|
||||||
|
bool success = WAIT_FOR(LL_RTC_IsActiveFlag_INIT(RTC), RTC_TIMEOUT, k_msleep(1));
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void rtc_stm32_leave_initialization_mode(void)
|
||||||
|
{
|
||||||
|
LL_RTC_DisableInitMode(RTC);
|
||||||
|
}
|
||||||
|
|
||||||
static int rtc_stm32_configure(const struct device *dev)
|
static int rtc_stm32_configure(const struct device *dev)
|
||||||
{
|
{
|
||||||
const struct rtc_stm32_config *cfg = dev->config;
|
const struct rtc_stm32_config *cfg = dev->config;
|
||||||
|
@ -158,6 +179,8 @@ static int rtc_stm32_set_time(const struct device *dev, const struct rtc_time *t
|
||||||
{
|
{
|
||||||
uint32_t real_year = timeptr->tm_year + TM_YEAR_REF;
|
uint32_t real_year = timeptr->tm_year + TM_YEAR_REF;
|
||||||
|
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
if (real_year < RTC_YEAR_REF) {
|
if (real_year < RTC_YEAR_REF) {
|
||||||
/* RTC does not support years before 2000 */
|
/* RTC does not support years before 2000 */
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -171,10 +194,10 @@ static int rtc_stm32_set_time(const struct device *dev, const struct rtc_time *t
|
||||||
LOG_INF("Setting clock");
|
LOG_INF("Setting clock");
|
||||||
LL_RTC_DisableWriteProtection(RTC);
|
LL_RTC_DisableWriteProtection(RTC);
|
||||||
|
|
||||||
LL_RTC_EnableInitMode(RTC);
|
err = rtc_stm32_enter_initialization_mode();
|
||||||
|
if (err) {
|
||||||
while (!LL_RTC_IsActiveFlag_INIT(RTC)) {
|
return err;
|
||||||
};
|
}
|
||||||
|
|
||||||
LL_RTC_DATE_SetYear(RTC, __LL_RTC_CONVERT_BIN2BCD(real_year - RTC_YEAR_REF));
|
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_SetMonth(RTC, __LL_RTC_CONVERT_BIN2BCD(timeptr->tm_mon + 1));
|
||||||
|
@ -193,11 +216,11 @@ static int rtc_stm32_set_time(const struct device *dev, const struct rtc_time *t
|
||||||
LL_RTC_TIME_SetMinute(RTC, __LL_RTC_CONVERT_BIN2BCD(timeptr->tm_min));
|
LL_RTC_TIME_SetMinute(RTC, __LL_RTC_CONVERT_BIN2BCD(timeptr->tm_min));
|
||||||
LL_RTC_TIME_SetSecond(RTC, __LL_RTC_CONVERT_BIN2BCD(timeptr->tm_sec));
|
LL_RTC_TIME_SetSecond(RTC, __LL_RTC_CONVERT_BIN2BCD(timeptr->tm_sec));
|
||||||
|
|
||||||
LL_RTC_DisableInitMode(RTC);
|
rtc_stm32_leave_initialization_mode();
|
||||||
|
|
||||||
LL_RTC_EnableWriteProtection(RTC);
|
LL_RTC_EnableWriteProtection(RTC);
|
||||||
|
|
||||||
return 0;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rtc_stm32_get_time(const struct device *dev, struct rtc_time *timeptr)
|
static int rtc_stm32_get_time(const struct device *dev, struct rtc_time *timeptr)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue