88#include <zephyr/device.h>
99#include <zephyr/drivers/clock_control/sf32lb.h>
1010#include <zephyr/drivers/entropy.h>
11+ #include <zephyr/irq.h>
12+ #include <zephyr/kernel.h>
1113#include <zephyr/logging/log.h>
1214
1315#include <register.h>
@@ -16,17 +18,31 @@ LOG_MODULE_REGISTER(entropy_sf32lb, CONFIG_ENTROPY_LOG_LEVEL);
1618
1719#define TRNG_CTRL offsetof(TRNG_TypeDef, CTRL)
1820#define TRNG_STAT offsetof(TRNG_TypeDef, STAT)
21+ #define TRNG_IRQ offsetof(TRNG_TypeDef, IRQ)
1922#define TRNG_RAND offsetof(TRNG_TypeDef, RAND_NUM0)
2023
2124#define TRNG_RAND_NUM_MAX (8U)
2225
2326#define TRNG_RAND_MASK (TRNG_RAND_NUM_MAX - 1U)
2427
28+ struct entropy_sf32lb_data {
29+ };
30+
2531struct entropy_sf32lb_config {
2632 uintptr_t base ;
2733 struct sf32lb_clock_dt_spec clock ;
34+ void (* irq_config_func )(void );
2835};
2936
37+ static void entropy_sf32lb_isr (const struct device * dev )
38+ {
39+ const struct entropy_sf32lb_config * config = dev -> config ;
40+ struct entropy_sf32lb_data * data = dev -> data ;
41+ uint32_t buf [TRNG_RAND_NUM_MAX ];
42+ uint32_t cnt ;
43+ printk ("stat:0x%x\n" , sys_read32 (config -> base + TRNG_IRQ ));
44+ }
45+
3046static int entropy_sf32lb_get_entropy (const struct device * dev , uint8_t * buffer , uint16_t length )
3147{
3248 const struct entropy_sf32lb_config * config = dev -> config ;
@@ -77,17 +93,37 @@ static int entropy_sf32lb_init(const struct device *dev)
7793 return ret ;
7894 }
7995
96+ sys_set_bits (config -> base + TRNG_IRQ , TRNG_IRQ_PRNG_LOCKUP_MSK |
97+ TRNG_IRQ_RAND_NUM_AVAIL_MSK |
98+ TRNG_IRQ_SEED_GEN_DONE_MSK );
99+
100+ config -> irq_config_func ();
101+
102+ sys_set_bit (config -> base + TRNG_CTRL , TRNG_CTRL_GEN_SEED_START_Pos );
103+ sys_set_bit (config -> base + TRNG_CTRL , TRNG_CTRL_GEN_RAND_NUM_START_Pos );
104+
80105 return ret ;
81106}
82107
83108#define ENTROPY_SF32LB_DEFINE (n ) \
109+ static void entropy_sf32lb_irq_config_##n(void); \
110+ \
111+ static struct entropy_sf32lb_data entropy_sf32lb_data_##n; \
84112 static const struct entropy_sf32lb_config entropy_sf32lb_config_##n = { \
85113 .base = DT_INST_REG_ADDR(n), \
86114 .clock = SF32LB_CLOCK_DT_INST_SPEC_GET(n), \
115+ .irq_config_func = entropy_sf32lb_irq_config_##n, \
87116 }; \
88117 \
89- DEVICE_DT_INST_DEFINE(n, entropy_sf32lb_init, NULL, NULL, \
118+ DEVICE_DT_INST_DEFINE(n, entropy_sf32lb_init, NULL, &entropy_sf32lb_data_##n, \
90119 &entropy_sf32lb_config_##n, PRE_KERNEL_1, \
91- CONFIG_ENTROPY_INIT_PRIORITY, &entropy_sf32lb_api);
120+ CONFIG_ENTROPY_INIT_PRIORITY, &entropy_sf32lb_api); \
121+ \
122+ static void entropy_sf32lb_irq_config_##n(void) \
123+ { \
124+ IRQ_CONNECT(DT_INST_IRQN(n), DT_INST_IRQ(n, priority), entropy_sf32lb_isr, \
125+ DEVICE_DT_INST_GET(n), 0); \
126+ irq_enable(DT_INST_IRQN(n)); \
127+ }
92128
93129DT_INST_FOREACH_STATUS_OKAY (ENTROPY_SF32LB_DEFINE )
0 commit comments