TRNG
函数列表
简要说明
TRNG(True Random Number Generator)真随机数生成器是一种通过物理过程而不是计算机程序来生成随机数字的设备。
接口描述
csi_trng_initialize
trng_handle_t csi_trng_initialize(int32_t idx, trng_event_cb_t cb_event)
功能描述:
- 通过传入设备数初始化对应的trng实例,返回trng实例的句柄。
参数:
handle
: 实例句柄。cb_event
: trng实例的事件回调函数。回调函数原型定义见trng_event_cb_t。回调函数类型trng_event_cb_t定义如下:
typedef void (*trng_event_cb_t)(int32_t idx, trng_event_e event);
其中idx为设备号,event 为传给回调函数的事件类型,trng回调事件枚举类型见 trng_event_e 定义。
返回值:
NULL: 初始化失败。
其它: 实例句柄。
trng_event_e:
名字 | 定义 | 备注 |
---|---|---|
TRNG_EVENT_DATA_GENERATECOMPLETE | 随机数生成完事件 |
csi_trng_uninitialize
int32_t csi_trng_uninitialize(trng_handle_t handle)
功能描述:
- trng实例反初始化。该接口会停止trng实例正在进行的工作(如果有),并且释放相关的软硬件资源。
参数:
handle
: 实例句柄。
返回值:
- 错误码。
csi_trng_power_control
int32_t csi_trng_power_control(trng_handle_t handle, csi_power_stat_e state)
功能描述:
- 配置设备实例的功耗模式。
参数:
handle
: 实例句柄。state
: 设备实例的功耗模式,参看 csi_power_stat_e的定义。
返回值:
- 错误码。
csi_trng_get_capabilities
trng_capabilities_t csi_trng_get_capabilities(int32_t idx)
功能描述:
- 获取trng实例支持的能力。
参数:
idx
: 设备号。
返回值:
- 描述trng能力的结构体,trng的能力定义见 trng_capabilities_t。
trng_capabilities_t:
名字 | 定义 | 备注 |
---|---|---|
uint32_t lowper_mode :1 | 支持低功耗模式 |
csi_trng_get_data
int32_t csi_trng_get_data(trng_handle_t handle, void *data, uint32_t num)
功能描述:
- 获取trng随机数。
参数:
handle
: 实例句柄。data
: 待生成数据的缓冲区地址。num
: 待生成的数据的长度。
返回值:
- 错误码。
csi_trng_get_status
trng_status_t csi_trng_get_status(trng_handle_t handle)
功能描述:
参数:
handle
: 实例句柄。
返回值:
- trng状态的结构体,trng的状态定义见 trng_status_t。
trng_status_t:
名字 | 定义 | 备注 |
---|---|---|
uint32_t busy :1 | 计算忙 | |
uint32_t data_valid :1 | 数据有效 |
示例
TRNG示例1
static trng_handle_t trng= NULL;
define NUM 10
void example_main(void)
{
trng_capabilities_t cap;
//get trng capabilities
cap = csi_trng_get_capabilities(0);
printf("trng %s lowper mode \n",cap.lowper_mode==1 ? "support":"not support");
uint8_t data[NUM] = {0x0};
trng_status_t status;
//initialize trng by idx
trng= csi_trng_initialize(0, NULL);
if (trng== NULL) {
//fail
return;
}
//get the data
int32_t ret = csi_trng_get_data(trng, data, NUM);
if (ret <0) {
//fail
return;
}
while (1) {
status = csi_trng_get_status(trng);
if (status.busy == 0 && status.data_valid == 1) {
break;
}
}
ret = csi_trng_uninitialize(trng);
if (ret < 0) {
//fail
return;
}
}