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_enable | 0 到 0xFF | 8 条 entropy line(line0-line7)使能掩码 |
div_num | 0 到 0x3FF | DTRNG_CFG.DIV_NUM divider |
interrupt_mask | 0 或 1 | 1 屏蔽 DTRNG 中断输出 |
2.2 默认值
| 宏 | 值 |
|---|---|
HAL_DTRNG_DEFAULT_LINE_ENABLE | DTRNG_LINE_ENABLE_ALL,即 0xFF |
HAL_DTRNG_DEFAULT_DIV_NUM | 0 |
HAL_DTRNG_TIMEOUT_US | 10 |
默认配置由 hal_dtrng_init_config_default() 填写:
line_enable = 0xFFdiv_num = 0interrupt_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);
初始化动作:
校验实例和配置范围。
关闭 generator。
释放 active-low reset。
写 line-enable 和 divider。
设置 interrupt mask/unmask。
发送 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:
要求 systick 已初始化。
要求 reset 已释放。
打开 generator。
清除旧 ready。
最多轮询
HAL_DTRNG_TIMEOUT_US。ready 后读取
RANDOMNUM。关闭 generator并发送 ready-clear 脉冲。
返回:
| 返回值 | 说明 |
|---|---|
IM_OK | 成功生成并读取一个 word |
IM_ERR_INVALID_PARAM | 实例或输出指针非法 |
IM_ERR_NOT_READY | systick 未初始化或 reset 未释放 |
IM_ERR_TIMEOUT | 10 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)