API GUIDE / DTRNG / LL

G32S10 DTRNG LL 接口

LL 层接口:仅 dtrngx == DTRNG 返回 true。

1. LL 接口

1.1 实例检查

bool ll_dtrng_is_instance(const dtrng_regs_t *dtrngx);

仅 dtrngx == DTRNG 返回 true。

1.2 generator

void ll_dtrng_enable(dtrng_regs_t *dtrngx);
void ll_dtrng_disable(dtrng_regs_t *dtrngx);

分别置位和清除 DTRNG_CFG.GEN_EN。

1.3 entropy line

void ll_dtrng_line_enable_set(dtrng_regs_t *dtrngx,
                              uint32_t line_mask);
uint32_t ll_dtrng_line_enable_get(const dtrng_regs_t *dtrngx);

设置或读取 DTRNG_CFG.LINE_EN。LL 不校验 line_mask。

1.4 divider

void ll_dtrng_div_num_set(dtrng_regs_t *dtrngx, uint32_t div_num);
uint32_t ll_dtrng_div_num_get(const dtrng_regs_t *dtrngx);

设置或读取 DTRNG_CFG.DIV_NUM。LL 不校验范围。

1.5 interrupt mask

void ll_dtrng_interrupt_mask(dtrng_regs_t *dtrngx);
void ll_dtrng_interrupt_unmask(dtrng_regs_t *dtrngx);
bool ll_dtrng_interrupt_is_masked(const dtrng_regs_t *dtrngx);

控制 DTRNG_CFG.INT_MASK。该 helper 只控制 DTRNG 中断输出,不负责 PLIC 配置。

1.6 ready clear

void ll_dtrng_ready_clear(dtrng_regs_t *dtrngx);

通过 RDY_CLR 形成脉冲,清除 DTRNG_STAT.RANDOM_RDY。

1.7 reset

void ll_dtrng_reset_assert(dtrng_regs_t *dtrngx);
void ll_dtrng_reset_release(dtrng_regs_t *dtrngx);
bool ll_dtrng_reset_is_released(const dtrng_regs_t *dtrngx);

RSTN 为 active-low,并由硬件自动恢复。读取时 bit 为 1 表示 reset 已释放。

1.8 random 与 status

uint32_t ll_dtrng_random_get(const dtrng_regs_t *dtrngx);
uint32_t ll_dtrng_status_get(const dtrng_regs_t *dtrngx);
bool ll_dtrng_random_ready(const dtrng_regs_t *dtrngx);
  • RANDOMNUM:32-bit random word

  • STAT:状态寄存器

  • STAT.RANDOM_RDY:随机数可读

2. 寄存器

Offset寄存器访问用途
0x000CFGRWline enable、reset、ready clear、interrupt mask、divider、gen enable
0x004RANDOMNUMRO随机数输出
0x008STATRO随机数 ready 状态

2.1 CFG 字段

字段bit说明
LINE_EN[25:16]10 条 entropy line 使能
RSTN15active-low reset,硬件自动恢复
RDY_CLR12ready-clear 脉冲
INT_MASK111 屏蔽中断输出
DIV_NUM[10:1]divider
GEN_EN0generator enable

2.2 STAT 字段

字段bit说明
RANDOM_RDY0新随机 word 可读

3. 使用流程

3.1 LL interrupt

中断路径由调用方申请 SoC IRQ:

  1. 配置 lines、divider 和 IRQ 路由。

  2. mask DTRNG,清除旧 ready。

  3. ll_dtrng_interrupt_unmask()。

  4. enable generator。

  5. IRQ 中读取 RANDOMNUM,清除 ready,并建议 mask + disable 防止 level interrupt 重复进入。

  6. 任务上下文决定是否重新 enable 下一轮。

DTRNG HAL 不管理 SoC IRQ。