summaryrefslogtreecommitdiff
path: root/chip
diff options
context:
space:
mode:
authorJack Rosenthal <jrosenth@chromium.org>2019-02-27 13:09:54 -0700
committerchrome-bot <chrome-bot@chromium.org>2019-03-20 19:51:21 -0700
commit8fb1c6c52510438f77378f08d2b6d881da48dd3f (patch)
tree177592678efb8a24046fdbb4dffd62f3e2f00a7e /chip
parent06933b4cb6dbb2a36b2d4d6139325575a558836d (diff)
downloadchrome-ec-8fb1c6c52510438f77378f08d2b6d881da48dd3f.tar.gz
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 <jrosenth@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/1493035 Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'chip')
-rw-r--r--chip/stm32/clock-f.c33
-rw-r--r--chip/stm32/clock-f.h4
-rw-r--r--chip/stm32/clock-stm32f0.c3
3 files changed, 25 insertions, 15 deletions
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) {