From 83a0e4e992388e6aaba9390cc1212649ae44d239 Mon Sep 17 00:00:00 2001 From: Alex Maestas Date: Mon, 22 Jan 2024 00:30:25 +0000 Subject: [PATCH] annotate TRNG erratum, address review comment --- movement/watch_faces/complication/randonaut_face.c | 2 +- movement/watch_faces/complication/toss_up_face.c | 2 +- watch-library/hardware/watch/watch_private.c | 14 +++++++------- watch-library/shared/watch/watch.h | 8 ++------ watch-library/simulator/watch/watch_private.c | 2 +- 5 files changed, 12 insertions(+), 16 deletions(-) diff --git a/movement/watch_faces/complication/randonaut_face.c b/movement/watch_faces/complication/randonaut_face.c index 886aabb..3bbc147 100644 --- a/movement/watch_faces/complication/randonaut_face.c +++ b/movement/watch_faces/complication/randonaut_face.c @@ -357,7 +357,7 @@ static uint32_t _get_true_entropy(void) { while (!hri_trng_get_INTFLAG_reg(TRNG, TRNG_INTFLAG_DATARDY)); // Wait for TRNG data to be ready - watch_disable_TRNG(TRNG); + watch_disable_TRNG(); hri_mclk_clear_APBCMASK_TRNG_bit(MCLK); return hri_trng_read_DATA_reg(TRNG); // Read a single 32-bit word from TRNG and return it #endif diff --git a/movement/watch_faces/complication/toss_up_face.c b/movement/watch_faces/complication/toss_up_face.c index dedc904..cf6ca68 100644 --- a/movement/watch_faces/complication/toss_up_face.c +++ b/movement/watch_faces/complication/toss_up_face.c @@ -255,7 +255,7 @@ uint32_t get_true_entropy(void) { while (!hri_trng_get_INTFLAG_reg(TRNG, TRNG_INTFLAG_DATARDY)); // Wait for TRNG data to be ready - watch_disable_TRNG(TRNG); + watch_disable_TRNG(); hri_mclk_clear_APBCMASK_TRNG_bit(MCLK); return hri_trng_read_DATA_reg(TRNG); // Read a single 32-bit word from TRNG and return it diff --git a/watch-library/hardware/watch/watch_private.c b/watch-library/hardware/watch/watch_private.c index 20f4ee5..1a33e5c 100644 --- a/watch-library/hardware/watch/watch_private.c +++ b/watch-library/hardware/watch/watch_private.c @@ -110,18 +110,18 @@ int getentropy(void *buf, size_t buflen) { } } - watch_disable_TRNG(TRNG); + watch_disable_TRNG(); hri_mclk_clear_APBCMASK_TRNG_bit(MCLK); return 0; } -void watch_disable_TRNG(Trng *hw) { - hri_trng_clear_CTRLA_ENABLE_bit(hw); - // silicon erratum: the TRNG may leave internal components powered after disable. - // the workaround is to clear the register twice. - hri_trng_write_CTRLA_reg(hw, 0); - hri_trng_write_CTRLA_reg(hw, 0); +void watch_disable_TRNG() { + // per Microchip datasheet clarification DS80000782, + // silicon erratum 1.16.1 indicates that the TRNG may leave internal components powered after being disabled. + // the workaround is to disable the TRNG by clearing the control register, twice. + hri_trng_write_CTRLA_reg(TRNG, 0); + hri_trng_write_CTRLA_reg(TRNG, 0); } diff --git a/watch-library/shared/watch/watch.h b/watch-library/shared/watch/watch.h index 8ede1f6..d23954e 100644 --- a/watch-library/shared/watch/watch.h +++ b/watch-library/shared/watch/watch.h @@ -96,12 +96,8 @@ void watch_reset_to_bootloader(void); */ int read(int file, char *ptr, int len); -#ifdef __EMSCRIPTEN__ -typedef void* Trng; -#endif - -/** @brief Disables the TRNG, working around a silicon erratum. +/** @brief Disables the TRNG twice in order to work around silicon erratum 1.16.1. */ -void watch_disable_TRNG(Trng* hw); +void watch_disable_TRNG(); #endif /* WATCH_H_ */ diff --git a/watch-library/simulator/watch/watch_private.c b/watch-library/simulator/watch/watch_private.c index 509a30b..03e1f08 100644 --- a/watch-library/simulator/watch/watch_private.c +++ b/watch-library/simulator/watch/watch_private.c @@ -57,7 +57,7 @@ void _watch_disable_tcc(void) {} void _watch_enable_usb(void) {} -void watch_disable_TRNG(Trng* hw) {} +void watch_disable_TRNG() {} // this function ends up getting called by printf to log stuff to the USB console. int _write(int file, char *ptr, int len) {