1 // Copyright (C) 2022 Beken Corporation 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 #include <stdlib.h> 16 #include <common/bk_include.h> 17 #include <os/os.h> 18 #include <os/mem.h> 19 #include <driver/trng.h> 20 #include "trng_driver.h" 21 #include "trng_hal.h" 22 #include "sys_driver.h" 23 24 typedef struct { 25 trng_hal_t hal; 26 bool is_enabled; 27 } trng_driver_t; 28 29 #define TRNG_RETURN_ON_NOT_INIT() do {\ 30 if (!s_trng_driver_is_init) {\ 31 return BK_ERR_TRNG_DRIVER_NOT_INIT;\ 32 }\ 33 } while(0) 34 35 #define TRNG_READ_COUNT (16) 36 37 static trng_driver_t s_trng = {0}; 38 static bool s_trng_driver_is_init = false; 39 trng_init_common(void)40static void trng_init_common(void) 41 { 42 trng_hal_start_common(&s_trng.hal); 43 s_trng.is_enabled = true; 44 } 45 trng_deinit_common(void)46static void trng_deinit_common(void) 47 { 48 trng_hal_stop_common(&s_trng.hal); 49 s_trng.is_enabled = false; 50 } 51 trng_get_random_number(void)52static uint32_t trng_get_random_number(void) 53 { 54 uint32_t number = 0; 55 56 #if (CONFIG_SOC_BK7256XX) 57 sys_drv_trng_disckg_set(1); 58 extern void delay_us(UINT32 us); 59 delay_us(1); //wait disckg take effect 60 #endif 61 number = trng_hal_get_random_number(&s_trng.hal); 62 #if (CONFIG_SOC_BK7256XX) 63 sys_drv_trng_disckg_set(0); 64 #endif 65 66 return number; 67 } 68 bk_trng_driver_init(void)69bk_err_t bk_trng_driver_init(void) 70 { 71 if (s_trng_driver_is_init) { 72 return BK_OK; 73 } 74 75 os_memset(&s_trng, 0, sizeof(s_trng)); 76 trng_hal_init(&s_trng.hal); 77 s_trng_driver_is_init = true; 78 79 return BK_OK; 80 } 81 bk_trng_driver_deinit(void)82bk_err_t bk_trng_driver_deinit(void) 83 { 84 if (!s_trng_driver_is_init) { 85 return BK_OK; 86 } 87 trng_deinit_common(); 88 s_trng_driver_is_init = false; 89 90 return BK_OK; 91 } 92 bk_trng_start(void)93bk_err_t bk_trng_start(void) 94 { 95 TRNG_RETURN_ON_NOT_INIT(); 96 trng_init_common(); 97 return BK_OK; 98 } 99 bk_trng_stop(void)100bk_err_t bk_trng_stop(void) 101 { 102 TRNG_RETURN_ON_NOT_INIT(); 103 trng_deinit_common(); 104 return BK_OK; 105 } 106 bk_rand(void)107int bk_rand(void) 108 { 109 int i = 0, number = 0; 110 111 /*Different board , same time point, the trng generate random number maybe same*/ 112 for(i = 0; i < TRNG_READ_COUNT; i++) { 113 trng_get_random_number(); 114 } 115 116 number = (int)trng_get_random_number(); 117 return (number & RAND_MAX); 118 } 119 120