From 8fb1c6c52510438f77378f08d2b6d881da48dd3f Mon Sep 17 00:00:00 2001 From: Jack Rosenthal Date: Wed, 27 Feb 2019 13:09:54 -0700 Subject: ec: Refactor get_rtc_diff to return unsigned values get_rtc_diff in stm32 previously returned a signed value, but the result could never be negative. This changes the function to return an unsigned value in a safe manner, and updates its corresponding usage. The original patch set for this CL included a test for the get_rtc_diff functionality. This was removed since there was no easy way to make a host-side test of board-specific functionality. If this is going to be solved, I will write a separate CL. BUG=chromium:769407 BRANCH=none TEST=make buildall -j TEST=made unit test for get_rtc_diff; test passed (see note above) Change-Id: Iec1b274294d8f78eaa0ee66d3bd63ce69536e747 Signed-off-by: Jack Rosenthal Reviewed-on: https://chromium-review.googlesource.com/1493035 Reviewed-by: Jett Rink --- chip/stm32/clock-f.c | 33 +++++++++++++++++++++------------ chip/stm32/clock-f.h | 4 ++-- chip/stm32/clock-stm32f0.c | 3 ++- 3 files changed, 25 insertions(+), 15 deletions(-) (limited to 'chip') diff --git a/chip/stm32/clock-f.c b/chip/stm32/clock-f.c index 99a23ee138..9c73e2b41f 100644 --- a/chip/stm32/clock-f.c +++ b/chip/stm32/clock-f.c @@ -168,19 +168,28 @@ void sec_to_rtc(uint32_t sec, struct rtc_time_reg *rtc) rtc->rtc_ssr = 0; } -/* Return sub-10-sec time diff between two rtc readings */ -int32_t get_rtc_diff(const struct rtc_time_reg *rtc0, - const struct rtc_time_reg *rtc1) +/* Return sub-10-sec time diff between two rtc readings + * + * Note: this function assumes rtc0 was sampled before rtc1. + * Additionally, this function only looks at the difference mod 10 + * seconds. + */ +uint32_t get_rtc_diff(const struct rtc_time_reg *rtc0, + const struct rtc_time_reg *rtc1) { - int32_t diff; - - /* Note: This only looks at the diff mod 10 seconds */ - diff = ((rtc1->rtc_tr & 0xf) * SECOND + - rtcss_to_us(rtc1->rtc_ssr)) - - ((rtc0->rtc_tr & 0xf) * SECOND + - rtcss_to_us(rtc0->rtc_ssr)); - - return (diff < 0) ? (diff + 10 * SECOND) : diff; + uint32_t rtc0_val, rtc1_val, diff; + + rtc0_val = (rtc0->rtc_tr & 0xF) * SECOND + rtcss_to_us(rtc0->rtc_ssr); + rtc1_val = (rtc1->rtc_tr & 0xF) * SECOND + rtcss_to_us(rtc1->rtc_ssr); + diff = rtc1_val; + if (rtc1_val < rtc0_val) { + /* rtc_ssr has wrapped, since we assume rtc0 < rtc1, add + * 10 seconds to get the correct value + */ + diff += 10 * SECOND; + } + diff -= rtc0_val; + return diff; } void rtc_read(struct rtc_time_reg *rtc) diff --git a/chip/stm32/clock-f.h b/chip/stm32/clock-f.h index 5e9acc748d..942567ec51 100644 --- a/chip/stm32/clock-f.h +++ b/chip/stm32/clock-f.h @@ -57,8 +57,8 @@ int32_t rtcss_to_us(uint32_t rtcss); uint32_t us_to_rtcss(int32_t us); /* Return sub-10-sec time diff between two rtc readings */ -int32_t get_rtc_diff(const struct rtc_time_reg *rtc0, - const struct rtc_time_reg *rtc1); +uint32_t get_rtc_diff(const struct rtc_time_reg *rtc0, + const struct rtc_time_reg *rtc1); /* Read RTC values */ void rtc_read(struct rtc_time_reg *rtc); diff --git a/chip/stm32/clock-stm32f0.c b/chip/stm32/clock-stm32f0.c index 3509468056..26188d97fd 100644 --- a/chip/stm32/clock-stm32f0.c +++ b/chip/stm32/clock-stm32f0.c @@ -311,7 +311,8 @@ void clock_refresh_console_in_use(void) void __idle(void) { timestamp_t t0; - int next_delay, margin_us, rtc_diff; + uint32_t rtc_diff; + int next_delay, margin_us; struct rtc_time_reg rtc0, rtc1; while (1) { -- cgit v1.2.1