Skip to content

Commit 21a090c

Browse files
committed
add isr
1 parent af4d9d9 commit 21a090c

File tree

1 file changed

+38
-2
lines changed

1 file changed

+38
-2
lines changed

drivers/entropy/entropy_sf32lb.c

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
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+
2531
struct 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+
3046
static 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

93129
DT_INST_FOREACH_STATUS_OKAY(ENTROPY_SF32LB_DEFINE)

0 commit comments

Comments
 (0)