• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)40 static 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)46 static 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)52 static 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)69 bk_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)82 bk_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)93 bk_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)100 bk_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)107 int 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