diff --git a/chip/g/trng.c b/chip/g/trng.c index a7dbcf4455..02472f46ef 100644 --- a/chip/g/trng.c +++ b/chip/g/trng.c @@ -7,22 +7,25 @@ void init_trng(void) { + GWRITE(TRNG, POST_PROCESSING_CTRL, + GC_TRNG_POST_PROCESSING_CTRL_SHUFFLE_BITS_MASK | + GC_TRNG_POST_PROCESSING_CTRL_CHURN_MODE_MASK); + GWRITE(TRNG, SLICE_MAX_UPPER_LIMIT, 1); + GWRITE(TRNG, SLICE_MIN_LOWER_LIMIT, 0); + GWRITE(TRNG, TIMEOUT_COUNTER, 0x7ff); + GWRITE(TRNG, TIMEOUT_MAX_TRY_NUM, 4); GWRITE(TRNG, POWER_DOWN_B, 1); GWRITE(TRNG, GO_EVENT, 1); - while (GREAD(TRNG, EMPTY)) - ; - GREAD(TRNG, READ_DATA); } uint32_t rand(void) { while (GREAD(TRNG, EMPTY)) { - if (!GREAD_FIELD(TRNG, FSM_STATE, FSM_IDLE)) - continue; - - /* TRNG must have stopped, needs to be restarted. */ - GWRITE(TRNG, STOP_WORK, 1); - init_trng(); + if (GREAD_FIELD(TRNG, FSM_STATE, FSM_TIMEOUT)) { + /* TRNG timed out, restart */ + GWRITE(TRNG, STOP_WORK, 1); + GWRITE(TRNG, GO_EVENT, 1); + } } return GREAD(TRNG, READ_DATA); }