Skip to content

Commit fc5565b

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 bf07b8b commit fc5565b

File tree

7 files changed

+141
-0
lines changed

7 files changed

+141
-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: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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+
#define SYS_CFG_ANAU_CR offsetof(HPSYS_CFG_TypeDef, ANAU_CR)
21+
22+
LOG_MODULE_REGISTER(sf32lb_tsen, CONFIG_SENSOR_LOG_LEVEL);
23+
24+
struct sf32lb_tsen_config {
25+
uintptr_t base;
26+
uintptr_t cfg_base;
27+
struct sf32lb_clock_dt_spec clock;
28+
};
29+
30+
struct sf32lb_tsen_data {
31+
struct k_mutex mutex;
32+
uint32_t last_temp;
33+
};
34+
35+
static int sf32lb_tsen_sample_fetch(const struct device *dev, enum sensor_channel chan)
36+
{
37+
const struct sf32lb_tsen_config *config = dev->config;
38+
struct sf32lb_tsen_data *data = dev->data;
39+
40+
k_mutex_lock(&data->mutex, K_FOREVER);
41+
42+
while (!sys_test_bit(config->base + TSEN_IRQ, TSEN_TSEN_IRQ_TSEN_IRSR_Pos)) {
43+
}
44+
45+
data->last_temp = sys_read32(config->base + TSEN_RDATA);
46+
47+
sys_set_bit(config->base + TSEN_IRQ, TSEN_TSEN_IRQ_TSEN_ICR_Pos);
48+
49+
k_mutex_unlock(&data->mutex);
50+
51+
return 0;
52+
}
53+
54+
static int sf32lb_tsen_channel_get(const struct device *dev, enum sensor_channel chan,
55+
struct sensor_value *val)
56+
{
57+
struct sf32lb_tsen_data *data = dev->data;
58+
float temp;
59+
60+
if (chan != SENSOR_CHAN_DIE_TEMP) {
61+
return -ENOTSUP;
62+
}
63+
64+
temp = ((int32_t)data->last_temp + 3000) * 749.2916 / 10100 - 277; /* see manual 8.2.3.2 */
65+
66+
return sensor_value_from_float(val, temp);
67+
}
68+
69+
static const struct sensor_driver_api sf32lb_tsen_driver_api = {
70+
.sample_fetch = sf32lb_tsen_sample_fetch,
71+
.channel_get = sf32lb_tsen_channel_get,
72+
};
73+
74+
static int sf32lb_tsen_init(const struct device *dev)
75+
{
76+
const struct sf32lb_tsen_config *config = dev->config;
77+
struct sf32lb_tsen_data *data = dev->data;
78+
int ret;
79+
80+
if (!sf32lb_clock_is_ready_dt(&config->clock)) {
81+
return -ENODEV;
82+
}
83+
84+
ret = sf32lb_clock_control_on_dt(&config->clock);
85+
if (ret < 0) {
86+
return ret;
87+
}
88+
89+
if (!sys_test_bit(config->cfg_base + SYS_CFG_ANAU_CR, HPSYS_CFG_ANAU_CR_EN_BG_Pos)) {
90+
sys_set_bit(config->cfg_base + SYS_CFG_ANAU_CR, HPSYS_CFG_ANAU_CR_EN_BG_Pos);
91+
}
92+
93+
sys_clear_bit(config->base + TSEN_CTRL_REG, TSEN_TSEN_CTRL_REG_ANAU_TSEN_RSTB_Pos);
94+
sys_set_bit(config->base + TSEN_CTRL_REG, TSEN_TSEN_CTRL_REG_ANAU_TSEN_EN_Pos);
95+
sys_set_bit(config->base + TSEN_CTRL_REG, TSEN_TSEN_CTRL_REG_ANAU_TSEN_PU_Pos);
96+
sys_set_bit(config->base + TSEN_CTRL_REG, TSEN_TSEN_CTRL_REG_ANAU_TSEN_RSTB_Pos);
97+
k_busy_wait(20);
98+
sys_set_bit(config->base + TSEN_CTRL_REG, TSEN_TSEN_CTRL_REG_ANAU_TSEN_RUN_Pos);
99+
100+
k_mutex_init(&data->mutex);
101+
102+
return ret;
103+
}
104+
105+
#define SF32LB_TSEN_DEFINE(inst) \
106+
static struct sf32lb_tsen_data sf32lb_tsen_data_##inst; \
107+
static const struct sf32lb_tsen_config sf32lb_tsen_config_##inst = { \
108+
.base = DT_INST_REG_ADDR(inst), \
109+
.cfg_base = DT_REG_ADDR(DT_INST_PHANDLE(inst, sifli_cfg)), \
110+
.clock = SF32LB_CLOCK_DT_INST_SPEC_GET(inst), \
111+
}; \
112+
SENSOR_DEVICE_DT_INST_DEFINE(inst, sf32lb_tsen_init, NULL, &sf32lb_tsen_data_##inst, \
113+
&sf32lb_tsen_config_##inst, POST_KERNEL, \
114+
CONFIG_SENSOR_INIT_PRIORITY, &sf32lb_tsen_driver_api);
115+
116+
DT_INST_FOREACH_STATUS_OKAY(SF32LB_TSEN_DEFINE)

0 commit comments

Comments
 (0)