summaryrefslogtreecommitdiffstats
path: root/watch-library/hardware/watch/watch_private.c
diff options
context:
space:
mode:
authorAlex Maestas <git@se30.xyz>2023-12-17 17:39:59 +0000
committerAlex Maestas <git@se30.xyz>2023-12-17 17:39:59 +0000
commit89e86fe6294948df0ca8aade93e9893f317dd5fc (patch)
tree0e9b3456e9421faaf7bccf7243f2ec06603943eb /watch-library/hardware/watch/watch_private.c
parent63d6bc6aa0ddf4cc1ce1918ef7650852a25e581b (diff)
downloadSensor-Watch-89e86fe6294948df0ca8aade93e9893f317dd5fc.tar.gz
Sensor-Watch-89e86fe6294948df0ca8aade93e9893f317dd5fc.tar.bz2
Sensor-Watch-89e86fe6294948df0ca8aade93e9893f317dd5fc.zip
work around silicon erratum in TRNG
Diffstat (limited to 'watch-library/hardware/watch/watch_private.c')
-rw-r--r--watch-library/hardware/watch/watch_private.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/watch-library/hardware/watch/watch_private.c b/watch-library/hardware/watch/watch_private.c
index cd607b8e..4cae3ccb 100644
--- a/watch-library/hardware/watch/watch_private.c
+++ b/watch-library/hardware/watch/watch_private.c
@@ -106,12 +106,21 @@ int getentropy(void *buf, size_t buflen) {
}
}
- hri_trng_clear_CTRLA_ENABLE_bit(TRNG);
+ watch_disable_TRNG(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_enable_tcc(void) {
// clock TCC0 with the main clock (8 MHz) and enable the peripheral clock.
hri_gclk_write_PCHCTRL_reg(GCLK, TCC0_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK0_Val | GCLK_PCHCTRL_CHEN);