annotate TRNG erratum, address review comment

This commit is contained in:
Alex Maestas 2024-01-22 00:30:25 +00:00
parent de692e05e2
commit 83a0e4e992
5 changed files with 12 additions and 16 deletions

View file

@ -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 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); 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 return hri_trng_read_DATA_reg(TRNG); // Read a single 32-bit word from TRNG and return it
#endif #endif

View file

@ -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 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); 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 return hri_trng_read_DATA_reg(TRNG); // Read a single 32-bit word from TRNG and return it

View file

@ -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); hri_mclk_clear_APBCMASK_TRNG_bit(MCLK);
return 0; return 0;
} }
void watch_disable_TRNG(Trng *hw) { void watch_disable_TRNG() {
hri_trng_clear_CTRLA_ENABLE_bit(hw); // per Microchip datasheet clarification DS80000782,
// silicon erratum: the TRNG may leave internal components powered after disable. // silicon erratum 1.16.1 indicates that the TRNG may leave internal components powered after being disabled.
// the workaround is to clear the register twice. // the workaround is to disable the TRNG by clearing the control register, twice.
hri_trng_write_CTRLA_reg(hw, 0); hri_trng_write_CTRLA_reg(TRNG, 0);
hri_trng_write_CTRLA_reg(hw, 0); hri_trng_write_CTRLA_reg(TRNG, 0);
} }

View file

@ -96,12 +96,8 @@ void watch_reset_to_bootloader(void);
*/ */
int read(int file, char *ptr, int len); int read(int file, char *ptr, int len);
#ifdef __EMSCRIPTEN__ /** @brief Disables the TRNG twice in order to work around silicon erratum 1.16.1.
typedef void* Trng;
#endif
/** @brief Disables the TRNG, working around a silicon erratum.
*/ */
void watch_disable_TRNG(Trng* hw); void watch_disable_TRNG();
#endif /* WATCH_H_ */ #endif /* WATCH_H_ */

View file

@ -57,7 +57,7 @@ void _watch_disable_tcc(void) {}
void _watch_enable_usb(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. // this function ends up getting called by printf to log stuff to the USB console.
int _write(int file, char *ptr, int len) { int _write(int file, char *ptr, int len) {