CN / EN
文档反馈
感谢关注汇顶文档,期待您的宝贵建议!
感谢您的反馈,祝您愉快!

APP RNG驱动

结构体

app_rng_params_t

结构体定义如下:

表 354 app_rng_params_t结构体成员
成员 描述 取值

app_rng_type_t use_type

设置RNG运行模式

该参数的取值可以是下列值中的任意一个:

  • APP_RNG_TYPE_INTERRUPT(中断模式)

  • APP_RNG_TYPE_POLLING(轮询模式)

  • APP_RNG_TYPE_MAX(参数检查时使用)

rng_init_t init

设置RNG初始化参数

参考rng_init_t结构体

rng_env_t rng_env

仅用于记录初始化设备的句柄、相关参数和信号量等,不需要配置

详细信息请参考文件:SDK_Folder\drivers\inc\app_rng.h

app_rng_evt_t

结构体定义如下:

表 355 app_rng_evt_t结构体成员
成员 描述 取值

app_rng_evt_type_t type

事件的类型

该参数的取值可以是下列值中的任意一个:

  • APP_RNG_EVT_DONE(随机数生成成功)

  • APP_RNG_EVT_ERROR(随机数生成出错)

uint32_t random_data

生成的随机数

该参数为中断运行模式下生成的随机数

详细信息请参考文件:SDK_Folder\drivers\inc\app_rng.h

rng_init_t

结构体定义如下:

表 356 rng_init_t结构体成员
成员 描述 取值

uint32_t seed_mode

产生随机数提供种子的方式

该参数的取值可以是下列值中的任意一个:

  • RNG_SEED_USER(采用用户提供的种子)

  • RNG_SEED_FR0_S0(环形振荡器S0提供的种子)

uint32_t lfsr_mode

LFSR模式

该参数的取值可以是下列值中的任意一个:

  • RNG_LFSR_MODE_59BIT(LFSR-59bit)

  • RNG_LFSR_MODE_128BIT(LFSR-128bit)

uint32_t out_mode

输出方式

该参数的取值可以是下列值中的任意一个:

  • RNG_OUTPUT_FR0_S0(环形振荡器输出)

  • RNG_OUTPUT_CYCLIC_PARITY(RNG、LFSR循环采样加奇偶校验输出)

  • RNG_OUTPUT_CYCLIC(RNG、LFSR循环采样输出)

  • RNG_OUTPUT_LFSR_RNG(LFSR、RNG异或输出)

  • RNG_OUTPUT_LFSR(LFSR输出)

uint32_t post_mode

后处理模式

该参数的取值可以是下列值中的任意一个:

  • RNG_POST_PRO_NOT(无处理)
  • RNG_POST_PRO_SKIPPING(跳位处理)
  • RNG_POST_PRO_COUNTING(位计数处理)
  • RNG_POST_PRO_NEUMANN(冯诺依曼处理)
详细信息请参考文件:
  • GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_hal_rng.h
  • GR533x:SDK_Folder\drivers\inc\hal\gr533x_hal_rng.h
  • GR5405:SDK_Folder\hal_drv\include\hal_rng.h

枚举

app_rng_type_t

枚举定义如下:

表 357 app_rng_type_t枚举成员
成员 描述

APP_RNG_TYPE_INTERRUPT

中断运行模式

APP_RNG_TYPE_POLLING

轮询运行模式

APP_RNG_TYPE_MAX

参数检查使用,不能作为入参

详细信息请参考文件:SDK_Folder\drivers\inc\app_rng.h

app_rng_evt_type_t

枚举定义如下:

表 358 app_rng_evt_type_t枚举成员
成员 描述

APP_RNG_EVT_DONE

随机数生成完成事件标志

APP_RNG_EVT_ERROR

随机数生成出错事件标志

详细信息请参考文件:SDK_Folder\drivers\inc\app_rng.h

app_rng_state_t

枚举定义如下:

表 359 app_rng_state_t枚举成员
成员 描述
APP_RNG_INVALID = 0 RNG不可用
APP_RNG_ACTIVITY = 1 RNG激活
APP_RNG_SLEEP = 2 RNG睡眠

详细信息请参考文件:SDK_Folder\drivers\inc\app_rng.h

接口函数

表 360 RNG驱动接口函数
API 芯片
GR551x GR5526 GR5x25 GR533x GR5405

app_rng_init

Y

Y

Y

Y

Y

app_rng_deinit

Y

Y

Y

Y

Y

app_rng_gen_sync

Y

Y

Y

Y

Y

app_rng_gen_async

Y

Y

Y

Y

Y

app_rng_get_handle

Y

Y

Y

Y

Y

app_rng_init

表 361 app_rng_init接口
函数原型

uint16_t app_rng_init(app_rng_params_t *p_params, app_rng_evt_handler_t evt_handler);

功能说明

根据初始化参数初始化RNG模块

输入参数
  • p_params:初始化参数的结构体指针
  • evt_handler:用户自己实现的中断回调函数
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

回调函数形式参照typedef void (*app_rng_evt_handler_t)(app_rng_evt_t *p_evt);

HAL层已经实现中断标志位的清理,用户不用关心中断标志的清理。

app_rng_deinit

表 362 app_rng_deinit接口
函数原型

uint16_t app_rng_deinit(void);

功能说明

反初始化RNG模块

输入参数
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

app_rng_gen_sync

表 363 app_rng_gen_sync接口
函数原型

uint16_t app_rng_gen_sync(uint16_t *p_seed, uint32_t *p_random32bit);

功能说明

同步(轮询)模式产生随机数

输入参数
  • p_seed:用户指定种子
  • p_random32bit:生成的32-bit随机数指针
返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

p_seed仅在配置为RNG_SEED_USER才生效,若采用59-bit模式则需要提供64-bit种子,若采用128-bit模式则需要提供128-bit种子;当配置为RNG_SEED_FR0_S0时,p_seed可传入NULL

app_rng_gen_async

表 364 app_rng_gen_async接口
函数原型

uint16_t app_rng_gen_async(uint16_t *p_seed);

功能说明

异步(中断)模式产生随机数

输入参数

p_seed:用户指定种子

返回值

APP_DRV_xxx:详见SDK_Folder\drivers\inc\app_drv_error.h宏定义

备注

p_seed仅在配置为RNG_SEED_USER才生效,若采用59-bit模式则需要提供64-bit种子,若采用128-bit模式则需要提供128-bit种子;当配置为RNG_SEED_FR0_S0时,p_seed可传入NULL

app_rng_get_handle

表 365 app_rng_get_handle接口
函数原型

rng_handle_t *app_rng_get_handle(void);

功能说明

获取RNG句柄

输入参数
返回值
RNG句柄,详见:
  • GR551x/GR5526/GR5x25:SDK_Folder\drivers\inc\hal\gr55xx_hal_rng.h
  • GR533x:SDK_Folder\drivers\inc\hal\gr533x_hal_rng.h
  • GR5405:SDK_Folder\hal_drv\include\hal_rng.h
备注

示例工程

RNG

采用用户提供的种子和环形振荡器产生的种子生成随机数,工程路径:SDK_Folder\projects\peripheral\rng\app_rng

流程图

示例工程采用了两种种子,且通过中断和轮询两种方式生成随机数。下面只以轮询方式进行说明,中断方式查看示例工程。

图 28 RNG生成随机数流程

使用用户提供的种子生成随机数

app_rng_params_t rng_polling_params = {
   .use_type = APP_RNG_TYPE_POLLING,
   .init = {
       .seed_mode = RNG_SEED_USER,
       .lfsr_mode = RNG_LFSR_MODE_59BIT,
       .out_mode  = RNG_OUTPUT_LFSR,
       .post_mode = RNG_POST_PRO_NOT,
   },
};
  • use_type:传输方式选择APP_RNG_TYPE_POLLING(轮询)
  • init.seed_mode:种子源选择RNG_SEED_USER(用户提供)
  • init.lfsr_mode:LFSR模式选择RNG_LFSR_MODE_59BIT
  • init.out_mode:输出模式选择RNG_OUTPUT_LFSR(LFSR直接输出)
  • init.post_mode:后处理选择RNG_POST_PRO_NOT(不进行后处理)

使用环形振荡器产生的种子生成随机数

rng_polling_params.init.seed_mode = RNG_SEED_FR0_S0;
rng_polling_params.init.out_mode = RNG_OUTPUT_FR0_S0;
  • init.seed_mode:种子源选择RNG_SEED_FR0_S0(环形振荡器S0提供的种子)
  • init.out_mode:输出模式选择RNG_OUTPUT_FR0_S0(环形振荡器直接输出)

重要函数

  • 初始化RNG
    app_rng_init (&rng_polling_params, NULL)
  • 同步生成随机数
    app_rng_gen_sync(g_random_seed, &random_number)
    • g_random_seed:随机种子(使用环形振荡器产生的种子,此参数可传入NULL)。
    • random_number:生成的随机数。
  • 异步生成随机数
    app_rng_gen_async(g_random_seed)

    g_random_seed:随机种子(使用环形振荡器产生的种子,此参数可传入NULL)。

测试验证

连接开发板到PC端,打开串口,串口将打印生成的随机数。

扫描关注

打开微信,使用“扫一扫”即可关注。