123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #include <kernel.h>
- #include <device.h>
- #include <soc.h>
- #include <sys/printk.h>
- static void se_init(void)
- {
-
- sys_write32((0 << 8) | (0 << 0), CMU_SECCLK);
- acts_clock_peripheral_enable(CLOCK_ID_SE);
- acts_reset_peripheral(RESET_ID_SE);
- sys_write32((1 << 3), TRNG_CTRL);
- }
- static void se_deinit(void)
- {
- sys_write32(sys_read32(TRNG_CTRL) & ~(1 << 3), TRNG_CTRL);
- acts_clock_peripheral_disable(CLOCK_ID_SE);
- }
- int se_trng_init(void)
- {
- se_init();
- return 0;
- }
- int se_trng_deinit(void)
- {
- se_deinit();
- return 0;
- }
- uint32_t se_trng_process(uint32_t *trng_low, uint32_t *trng_high)
- {
- uint32_t trng_ctrl_value;
- trng_ctrl_value = sys_read32(TRNG_CTRL);
- trng_ctrl_value = (trng_ctrl_value & ~(0x03<<1)) | (0x0<<1);
- trng_ctrl_value |= (1<<8)|(1<<9)|(1<<10);
- trng_ctrl_value = (trng_ctrl_value & ~(0x03<<6)) | (0x02<<6);
- sys_write32(trng_ctrl_value, TRNG_CTRL);
- trng_ctrl_value |= (1<<0);
- sys_write32(trng_ctrl_value, TRNG_CTRL);
- while ((sys_read32(TRNG_CTRL) & (1<<31)) == 0);
- *trng_low = sys_read32(TRNG_LR);
- *trng_high = sys_read32(TRNG_MR);
- trng_ctrl_value = sys_read32(TRNG_CTRL);
- trng_ctrl_value &= ~(1<<0);
- sys_write32(trng_ctrl_value, TRNG_CTRL);
- return 0;
- }
|