API GUIDE / DTRNG / HAL

G32S10 DTRNG HAL 接口

HAL 层接口:默认配置由 hal_dtrng_init_config_default() 填写:

1. 资源与时钟

1.1 实例与构建开关

项目值
实例宏DTRNG
基地址宏DTRNG_IOBASE
基地址0x134D0000
驱动开关CONFIG_DRIVER_DTRNG
时钟门控HAL_CPM_ID_GATE_DTRNG
调试开关CONFIG_DTRNG_ENABLE_DEBUG_HELPERS
#define DTRNG ((dtrng_regs_t *)(uintptr_t)DTRNG_IOBASE)

2. HAL 类型与默认配置

2.1 初始化配置

typedef struct {
    uint32_t line_enable;
    uint32_t div_num;
    uint8_t interrupt_mask;
} hal_dtrng_init_t;
字段范围说明
line_enable0 到 0xFF8 条 entropy line(line0-line7)使能掩码
div_num0 到 0x3FFDTRNG_CFG.DIV_NUM divider
interrupt_mask0 或 11 屏蔽 DTRNG 中断输出

2.2 默认值

宏值
HAL_DTRNG_DEFAULT_LINE_ENABLEDTRNG_LINE_ENABLE_ALL,即 0xFF
HAL_DTRNG_DEFAULT_DIV_NUM0
HAL_DTRNG_TIMEOUT_US10

默认配置由 hal_dtrng_init_config_default() 填写:

  • line_enable = 0xFF

  • div_num = 0

  • interrupt_mask = 1

2.3 entropy line 约束

  • DTRNG_LINE_ENABLE_ALL 选择全部 8 条 entropy line(line0-line7)。

  • 正式随机数应用应使用全部 lines。

  • 现有实板测试中,line0/line1 单独使能时没有 RANDOM_RDY;line2 到 line7 可单独生成。

  • 单线模式的手册随机性指标不如全使能模式明确,不应作为安全随机数主路径。

3. HAL 接口

3.1 hal_dtrng_init_config_default

error_code_t hal_dtrng_init_config_default(hal_dtrng_init_t *init);

填充默认配置。init == NULL 返回 IM_ERR_INVALID_PARAM。

3.2 hal_dtrng_init

error_code_t hal_dtrng_init(
    dtrng_regs_t *dtrngx,
    const hal_dtrng_init_t *init);

初始化动作:

  1. 校验实例和配置范围。

  2. 关闭 generator。

  3. 释放 active-low reset。

  4. 写 line-enable 和 divider。

  5. 设置 interrupt mask/unmask。

  6. 发送 ready-clear 脉冲。

返回:

返回值说明
IM_OK配置成功
IM_ERR_INVALID_PARAM实例、配置指针或字段范围非法

本接口不打开 CPM clock gate。

3.3 hal_dtrng_line_enable_set

error_code_t hal_dtrng_line_enable_set(
    dtrng_regs_t *dtrngx,
    uint32_t line_enable);

写入 DTRNG_CFG.LINE_EN,范围 0 到 HAL_DTRNG_LINE_ENABLE_MAX。

3.4 hal_dtrng_line_enable_get

error_code_t hal_dtrng_line_enable_get(
    const dtrng_regs_t *dtrngx,
    uint32_t *line_enable_out);

读取当前 line-enable 字段。输出指针不能为 NULL。

3.5 hal_dtrng_div_num_set

error_code_t hal_dtrng_div_num_set(
    dtrng_regs_t *dtrngx,
    uint32_t div_num);

写入 DTRNG_CFG.DIV_NUM,范围 0 到 HAL_DTRNG_DIV_NUM_MAX。

3.6 hal_dtrng_div_num_get

error_code_t hal_dtrng_div_num_get(
    const dtrng_regs_t *dtrngx,
    uint32_t *div_num_out);

读取当前 divider 字段。

3.7 hal_dtrng_random_get

error_code_t hal_dtrng_random_get(
    dtrng_regs_t *dtrngx,
    uint32_t *random_out);

Polling 模式读取一个 32-bit random word:

  1. 要求 systick 已初始化。

  2. 要求 reset 已释放。

  3. 打开 generator。

  4. 清除旧 ready。

  5. 最多轮询 HAL_DTRNG_TIMEOUT_US。

  6. ready 后读取 RANDOMNUM。

  7. 关闭 generator并发送 ready-clear 脉冲。

返回:

返回值说明
IM_OK成功生成并读取一个 word
IM_ERR_INVALID_PARAM实例或输出指针非法
IM_ERR_NOT_READYsystick 未初始化或 reset 未释放
IM_ERR_TIMEOUT10 us 内未置位 RANDOM_RDY

HAL 不提供 IRQ API。需要中断模式时应使用 LL 接口并自行申请 IRQ。

3.8 hal_dtrng_deinit

error_code_t hal_dtrng_deinit(dtrng_regs_t *dtrngx);

执行:

  • 关闭 generator

  • mask interrupt

  • 清除 ready

  • assert active-low reset

本接口不关闭 CPM clock gate。

3.9 hal_dtrng_regs_dump

error_code_t hal_dtrng_regs_dump(dtrng_regs_t *dtrngx);

仅当以下条件同时成立时提供 dump:

CONFIG_SDK_ENABLE_DEBUG_HELPERS=y
CONFIG_DTRNG_ENABLE_DEBUG_HELPERS=y

否则返回 IM_ERR_UNSUPPORTED。

4. 使用流程

4.1 HAL polling

hal_cpm_clk_enable(HAL_CPM_ID_GATE_DTRNG)
hal_dtrng_init_config_default()
hal_dtrng_init()
hal_dtrng_random_get() -> 每次一个 word
hal_dtrng_deinit()
hal_cpm_clk_disable(HAL_CPM_ID_GATE_DTRNG)