Skip to content

Commit de38ef2

Browse files
committed
drivers: sensor: sifli: add sf32lb temp sensor
Add temp sensor driver for sf32lb platform Signed-off-by: Qingsong Gou <gouqs@hotmail.com>
1 parent c6f0575 commit de38ef2

File tree

7 files changed

+133
-0
lines changed

7 files changed

+133
-0
lines changed

drivers/sensor/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ add_subdirectory(renesas)
3030
add_subdirectory(rohm)
3131
add_subdirectory(seeed)
3232
add_subdirectory(sensirion)
33+
add_subdirectory(sifli)
3334
add_subdirectory(silabs)
3435
add_subdirectory(st)
3536
add_subdirectory(tdk)

drivers/sensor/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ source "drivers/sensor/renesas/Kconfig"
117117
source "drivers/sensor/rohm/Kconfig"
118118
source "drivers/sensor/seeed/Kconfig"
119119
source "drivers/sensor/sensirion/Kconfig"
120+
source "drivers/sensor/sifli/Kconfig"
120121
source "drivers/sensor/silabs/Kconfig"
121122
source "drivers/sensor/st/Kconfig"
122123
source "drivers/sensor/tdk/Kconfig"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Copyright (c) 2025, Qingsong Gou <gouqs@hotmail.com>
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
add_subdirectory_ifdef(CONFIG_SF32LB_TSEN sf32lb_tsen)

drivers/sensor/sifli/Kconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Copyright (c) 2025, Qingsong Gou <gouqs@hotmail.com>
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
source "drivers/sensor/sifli/sf32lb_tsen/Kconfig"
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Copyright (c) 2025, Qingsong Gou <gouqs@hotmail.com>
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
zephyr_library()
5+
6+
zephyr_library_sources(sf32lb_tsen.c)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Copyright (c) 2025, Qingsong Gou <gouqs@hotmail.com>
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
config SF32LB_TSEN
5+
bool "SIFLI SF32LB TSEN temperature sensor driver"
6+
default y
7+
depends on DT_HAS_SIFLI_SF32LB_TSEN_ENABLED
8+
help
9+
Enable driver for the SIFLI SF32LB on-chip temperature sensor (TSEN).
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/*
2+
* Copyright (c) 2025, Qingsong Gou <gouqs@hotmail.com>
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#define DT_DRV_COMPAT sifli_sf32lb_tsen
7+
8+
#include <zephyr/kernel.h>
9+
#include <zephyr/device.h>
10+
#include <zephyr/drivers/clock_control/sf32lb.h>
11+
#include <zephyr/drivers/sensor.h>
12+
#include <zephyr/logging/log.h>
13+
14+
#include <register.h>
15+
16+
#define TSEN_CTRL_REG offsetof(TSEN_TypeDef, TSEN_CTRL_REG)
17+
#define TSEN_RDATA offsetof(TSEN_TypeDef, TSEN_RDATA)
18+
#define TSEN_IRQ offsetof(TSEN_TypeDef, TSEN_IRQ)
19+
20+
LOG_MODULE_REGISTER(sf32lb_tsen, CONFIG_SENSOR_LOG_LEVEL);
21+
22+
struct sf32lb_tsen_config {
23+
uintptr_t base;
24+
struct sf32lb_clock_dt_spec clock;
25+
};
26+
27+
struct sf32lb_tsen_data {
28+
struct k_mutex mutex;
29+
uint32_t last_temp;
30+
};
31+
32+
static int sf32lb_tsen_sample_fetch(const struct device *dev, enum sensor_channel chan)
33+
{
34+
const struct sf32lb_tsen_config *config = dev->config;
35+
struct sf32lb_tsen_data *data = dev->data;
36+
37+
k_mutex_lock(&data->mutex, K_FOREVER);
38+
39+
while (!sys_test_bit(config->base + TSEN_IRQ, TSEN_TSEN_IRQ_TSEN_IRSR_Pos)) {
40+
}
41+
42+
data->last_temp = sys_read32(config->base + TSEN_RDATA);
43+
44+
sys_set_bit(config->base + TSEN_IRQ, TSEN_TSEN_IRQ_TSEN_ICR_Pos);
45+
46+
k_mutex_unlock(&data->mutex);
47+
48+
return 0;
49+
}
50+
51+
static int sf32lb_tsen_channel_get(const struct device *dev, enum sensor_channel chan,
52+
struct sensor_value *val)
53+
{
54+
struct sf32lb_tsen_data *data = dev->data;
55+
float temp;
56+
57+
if (chan != SENSOR_CHAN_DIE_TEMP) {
58+
return -ENOTSUP;
59+
}
60+
61+
temp = ((int32_t)data->last_temp + 3000) * 749 / 10100 - 277;
62+
63+
return sensor_value_from_float(val, temp);
64+
}
65+
66+
static const struct sensor_driver_api sf32lb_tsen_driver_api = {
67+
.sample_fetch = sf32lb_tsen_sample_fetch,
68+
.channel_get = sf32lb_tsen_channel_get,
69+
};
70+
71+
static int sf32lb_tsen_init(const struct device *dev)
72+
{
73+
const struct sf32lb_tsen_config *config = dev->config;
74+
struct sf32lb_tsen_data *data = dev->data;
75+
int ret;
76+
77+
if (!sf32lb_clock_is_ready_dt(&config->clock)) {
78+
return -ENODEV;
79+
}
80+
81+
ret = sf32lb_clock_control_on_dt(&config->clock);
82+
if (ret < 0) {
83+
return ret;
84+
}
85+
86+
sys_clear_bit(config->base + TSEN_CTRL_REG, TSEN_TSEN_CTRL_REG_ANAU_TSEN_RSTB_Pos);
87+
sys_set_bit(config->base + TSEN_CTRL_REG, TSEN_TSEN_CTRL_REG_ANAU_TSEN_EN_Pos);
88+
sys_set_bit(config->base + TSEN_CTRL_REG, TSEN_TSEN_CTRL_REG_ANAU_TSEN_PU_Pos);
89+
sys_set_bit(config->base + TSEN_CTRL_REG, TSEN_TSEN_CTRL_REG_ANAU_TSEN_RSTB_Pos);
90+
k_busy_wait(20);
91+
sys_set_bit(config->base + TSEN_CTRL_REG, TSEN_TSEN_CTRL_REG_ANAU_TSEN_RUN_Pos);
92+
93+
k_mutex_init(&data->mutex);
94+
95+
return ret;
96+
}
97+
98+
#define SF32LB_TSEN_DEFINE(inst) \
99+
static struct sf32lb_tsen_data sf32lb_tsen_data_##inst; \
100+
static const struct sf32lb_tsen_config sf32lb_tsen_config_##inst = { \
101+
.base = DT_INST_REG_ADDR(inst), \
102+
.clock = SF32LB_CLOCK_DT_INST_SPEC_GET(inst), \
103+
}; \
104+
SENSOR_DEVICE_DT_INST_DEFINE(inst, sf32lb_tsen_init, NULL, &sf32lb_tsen_data_##inst, \
105+
&sf32lb_tsen_config_##inst, POST_KERNEL, \
106+
CONFIG_SENSOR_INIT_PRIORITY, &sf32lb_tsen_driver_api);
107+
108+
DT_INST_FOREACH_STATUS_OKAY(SF32LB_TSEN_DEFINE)

0 commit comments

Comments
 (0)