-
Notifications
You must be signed in to change notification settings - Fork 6.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add ilps22qs sensor support to lps2xdf driver #79850
base: main
Are you sure you want to change the base?
Changes from all commits
64de5db
dc03d32
475ef08
03ebb71
77ac94f
e7301d0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,175 @@ | ||
/* ST Microelectronics ILPS22QS pressure and temperature sensor | ||
* | ||
* Copyright (c) 2023-2024 STMicroelectronics | ||
* Copyright (c) 2023 PHYTEC Messtechnik GmbH | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#include "lps2xdf.h" | ||
#include "ilps22qs.h" | ||
#include <zephyr/logging/log.h> | ||
|
||
LOG_MODULE_DECLARE(LPS2XDF, CONFIG_SENSOR_LOG_LEVEL); | ||
|
||
static inline int ilps22qs_mode_set_odr_raw(const struct device *dev, uint8_t odr) | ||
{ | ||
const struct lps2xdf_config *const cfg = dev->config; | ||
stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx; | ||
ilps22qs_md_t md = { 0 }; | ||
|
||
Check notice on line 20 in drivers/sensor/st/lps2xdf/ilps22qs.c GitHub Actions / Run compliance checks on patch series (PR)You may want to run clang-format on this change
|
||
md.odr = odr; | ||
md.avg = cfg->avg; | ||
md.lpf = cfg->lpf; | ||
md.fs = cfg->fs; | ||
|
||
return ilps22qs_mode_set(ctx, &md); | ||
} | ||
|
||
static int ilps22qs_sample_fetch(const struct device *dev, enum sensor_channel chan) | ||
{ | ||
struct lps2xdf_data *data = dev->data; | ||
const struct lps2xdf_config *const cfg = dev->config; | ||
stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx; | ||
ilps22qs_data_t raw_data; | ||
ilps22qs_md_t md = { 0 }; | ||
|
||
Check notice on line 36 in drivers/sensor/st/lps2xdf/ilps22qs.c GitHub Actions / Run compliance checks on patch series (PR)You may want to run clang-format on this change
|
||
md.fs = cfg->fs; | ||
|
||
if (ilps22qs_data_get(ctx, &md, &raw_data) < 0) { | ||
LOG_DBG("Failed to read sample"); | ||
return -EIO; | ||
} | ||
|
||
data->sample_press = raw_data.pressure.raw; | ||
data->sample_temp = raw_data.heat.raw; | ||
|
||
return 0; | ||
} | ||
|
||
#ifdef CONFIG_LPS2XDF_TRIGGER | ||
/** | ||
* ilps22qs_config_interrupt - not supported | ||
*/ | ||
static int ilps22qs_config_interrupt(const struct device *dev) | ||
{ | ||
return -ENOTSUP; | ||
} | ||
|
||
/** | ||
* ilps22qs_handle_interrupt - not supported | ||
*/ | ||
static void ilps22qs_handle_interrupt(const struct device *dev) | ||
{ | ||
} | ||
|
||
/** | ||
* ilps22qs_trigger_set - not supported | ||
*/ | ||
static int ilps22qs_trigger_set(const struct device *dev, | ||
const struct sensor_trigger *trig, | ||
sensor_trigger_handler_t handler) | ||
{ | ||
Check notice on line 72 in drivers/sensor/st/lps2xdf/ilps22qs.c GitHub Actions / Run compliance checks on patch series (PR)You may want to run clang-format on this change
|
||
return -ENOTSUP; | ||
} | ||
#endif /* CONFIG_LPS2XDF_TRIGGER */ | ||
|
||
const struct lps2xdf_chip_api st_ilps22qs_chip_api = { | ||
.mode_set_odr_raw = ilps22qs_mode_set_odr_raw, | ||
.sample_fetch = ilps22qs_sample_fetch, | ||
#if CONFIG_LPS2XDF_TRIGGER | ||
.config_interrupt = ilps22qs_config_interrupt, | ||
.handle_interrupt = ilps22qs_handle_interrupt, | ||
.trigger_set = ilps22qs_trigger_set, | ||
#endif | ||
}; | ||
|
||
int st_ilps22qs_init(const struct device *dev) | ||
{ | ||
const struct lps2xdf_config *const cfg = dev->config; | ||
stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx; | ||
ilps22qs_id_t id; | ||
ilps22qs_stat_t status; | ||
uint8_t tries = 10; | ||
int ret; | ||
|
||
#if DT_HAS_COMPAT_ON_BUS_STATUS_OKAY(st_ilps22qs, i3c) | ||
if (cfg->i3c.bus != NULL) { | ||
struct lps2xdf_data *data = dev->data; | ||
/* | ||
* Need to grab the pointer to the I3C device descriptor | ||
* before we can talk to the sensor. | ||
*/ | ||
data->i3c_dev = i3c_device_find(cfg->i3c.bus, &cfg->i3c.dev_id); | ||
if (data->i3c_dev == NULL) { | ||
LOG_ERR("Cannot find I3C device descriptor"); | ||
return -ENODEV; | ||
} | ||
} | ||
#endif | ||
|
||
if (ilps22qs_id_get(ctx, &id) < 0) { | ||
LOG_ERR("%s: Not able to read dev id", dev->name); | ||
return -EIO; | ||
} | ||
|
||
if (id.whoami != ILPS22QS_ID) { | ||
LOG_ERR("%s: Invalid chip ID 0x%02x", dev->name, id.whoami); | ||
return -EIO; | ||
} | ||
|
||
LOG_DBG("%s: chip id 0x%x", dev->name, id.whoami); | ||
|
||
/* Restore default configuration */ | ||
if (ilps22qs_init_set(ctx, ILPS22QS_RESET) < 0) { | ||
LOG_ERR("%s: Not able to reset device", dev->name); | ||
return -EIO; | ||
} | ||
|
||
do { | ||
if (!--tries) { | ||
LOG_DBG("sw reset timed out"); | ||
return -ETIMEDOUT; | ||
} | ||
k_usleep(LPS2XDF_SWRESET_WAIT_TIME_US); | ||
|
||
if (ilps22qs_status_get(ctx, &status) < 0) { | ||
return -EIO; | ||
} | ||
} while (status.sw_reset); | ||
|
||
/* Set bdu and if_inc recommended for driver usage */ | ||
if (ilps22qs_init_set(ctx, ILPS22QS_DRV_RDY) < 0) { | ||
LOG_ERR("%s: Not able to set device to ready state", dev->name); | ||
return -EIO; | ||
} | ||
|
||
if (ON_I3C_BUS(cfg)) { | ||
ilps22qs_bus_mode_t bus_mode; | ||
|
||
/* Select bus interface */ | ||
ilps22qs_bus_mode_get(ctx, &bus_mode); | ||
bus_mode.filter = ILPS22QS_AUTO; | ||
bus_mode.interface = ILPS22QS_SEL_BY_HW; | ||
ilps22qs_bus_mode_set(ctx, &bus_mode); | ||
} | ||
|
||
/* set sensor default odr */ | ||
LOG_DBG("%s: odr: %d", dev->name, cfg->odr); | ||
ret = ilps22qs_mode_set_odr_raw(dev, cfg->odr); | ||
if (ret < 0) { | ||
LOG_ERR("%s: Failed to set odr %d", dev->name, cfg->odr); | ||
return ret; | ||
} | ||
|
||
#ifdef CONFIG_LPS2XDF_TRIGGER | ||
if (cfg->trig_enabled) { | ||
if (lps2xdf_init_interrupt(dev, DEVICE_VARIANT_ILPS22QS) < 0) { | ||
LOG_ERR("Failed to initialize interrupt."); | ||
return -EIO; | ||
} | ||
} | ||
#endif | ||
|
||
return 0; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
/* ST Microelectronics ILPS22QS pressure and temperature sensor | ||
* | ||
* Copyright (c) 2023-2024 STMicroelectronics | ||
* Copyright (c) 2023 PHYTEC Messtechnik GmbH | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#include <stdint.h> | ||
#include <stmemsc.h> | ||
|
||
#include "ilps22qs_reg.h" | ||
|
||
#include <zephyr/drivers/sensor.h> | ||
|
||
#ifndef ZEPHYR_DRIVERS_SENSOR_ILPS22QS_ILPS22QS_H_ | ||
#define ZEPHYR_DRIVERS_SENSOR_ILPS22QS_ILPS22QS_H_ | ||
|
||
extern const struct lps2xdf_chip_api st_ilps22qs_chip_api; | ||
|
||
int st_ilps22qs_init(const struct device *dev); | ||
|
||
#endif /* ZEPHYR_DRIVERS_SENSOR_ILPS22QS_H_ */ |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,6 +6,7 @@ | |
* SPDX-License-Identifier: Apache-2.0 | ||
* | ||
* Datasheet: | ||
* https://www.st.com/resource/en/datasheet/ilps22qs.pdf | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You are adding a link to the datasheet in What do you think of removing the set of links from one of the files? |
||
* https://www.st.com/resource/en/datasheet/lps22df.pdf | ||
* https://www.st.com/resource/en/datasheet/lps28df.pdf | ||
*/ | ||
|
@@ -20,6 +21,10 @@ | |
|
||
#include "lps2xdf.h" | ||
|
||
#if DT_HAS_COMPAT_STATUS_OKAY(st_ilps22qs) | ||
#include "ilps22qs.h" | ||
#endif | ||
|
||
#if DT_HAS_COMPAT_STATUS_OKAY(st_lps22df) | ||
#include "lps22df.h" | ||
#endif | ||
|
@@ -159,10 +164,10 @@ | |
.lpf = DT_INST_PROP(inst, lpf), \ | ||
.avg = DT_INST_PROP(inst, avg), \ | ||
.chip_api = &name##_chip_api, \ | ||
IF_ENABLED(DT_INST_NODE_HAS_COMPAT(inst, st_lps28dfw), \ | ||
IF_ENABLED(DT_INST_NODE_HAS_PROP(inst, fs), \ | ||
(.fs = DT_INST_PROP(inst, fs),)) \ | ||
IF_ENABLED(DT_INST_NODE_HAS_PROP(inst, drdy_gpios), \ | ||
(LPS2XDF_CFG_IRQ(inst))) | ||
Check notice on line 170 in drivers/sensor/st/lps2xdf/lps2xdf.c GitHub Actions / Run compliance checks on patch series (PR)You may want to run clang-format on this change
|
||
|
||
#define LPS2XDF_SPI_OPERATION (SPI_WORD_SET(8) | SPI_OP_MODE_MASTER | \ | ||
SPI_MODE_CPOL | SPI_MODE_CPHA) | ||
|
@@ -214,6 +219,10 @@ | |
&lps2xdf_config_##name##_##inst, POST_KERNEL, \ | ||
CONFIG_SENSOR_INIT_PRIORITY, &lps2xdf_driver_api); | ||
|
||
#define DT_DRV_COMPAT st_ilps22qs | ||
DT_INST_FOREACH_STATUS_OKAY_VARGS(LPS2XDF_DEFINE, DT_DRV_COMPAT) | ||
#undef DT_DRV_COMPAT | ||
|
||
#define DT_DRV_COMPAT st_lps22df | ||
DT_INST_FOREACH_STATUS_OKAY_VARGS(LPS2XDF_DEFINE, DT_DRV_COMPAT) | ||
#undef DT_DRV_COMPAT | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Indentation