From 4a5e3c0bed4daade7ed0d0ed71b7147aa17642e9 Mon Sep 17 00:00:00 2001 From: Armando Visconti Date: Fri, 18 Jul 2025 15:15:50 +0200 Subject: [PATCH 1/4] west: update hal_st to get embedded_cores support update hal_st to get embedded_cores support. Signed-off-by: Armando Visconti --- modules/hal_st/Kconfig | 3 +++ west.yml | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/hal_st/Kconfig b/modules/hal_st/Kconfig index 43a8320e13bb4..17af49c13b2b1 100644 --- a/modules/hal_st/Kconfig +++ b/modules/hal_st/Kconfig @@ -202,3 +202,6 @@ config USE_STDC_STTS751 bool endif # HAS_STMEMSC + +config USE_ST_MEMS_ISPU + bool diff --git a/west.yml b/west.yml index 1482b3b3e42ca..35f74619811b5 100644 --- a/west.yml +++ b/west.yml @@ -240,8 +240,9 @@ manifest: groups: - hal - name: hal_st - revision: 9f81b4427e955885398805b7bca0da3a8cd9109c + revision: pull/26/head path: modules/hal/st + submodules: true groups: - hal - name: hal_stm32 From 4507e3ab4ee7908bedb6fb232dac4a4c0b2c3870 Mon Sep 17 00:00:00 2001 From: Armando Visconti Date: Fri, 18 Jul 2025 17:32:00 +0200 Subject: [PATCH 2/4] sensor: add upoload f/w API Add Firmware upload API Signed-off-by: Armando Visconti --- drivers/sensor/sensor_handlers.c | 9 +++++++++ include/zephyr/drivers/sensor.h | 30 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/drivers/sensor/sensor_handlers.c b/drivers/sensor/sensor_handlers.c index 63c5359e0cd9b..04ba901780f80 100644 --- a/drivers/sensor/sensor_handlers.c +++ b/drivers/sensor/sensor_handlers.c @@ -68,6 +68,15 @@ static inline int z_vrfy_sensor_get_decoder(const struct device *dev, } #include +static inline int z_vrfy_sensor_upload_fw(const struct device *dev, + const void *fw_buf, size_t fw_len) +{ + K_OOPS(K_SYSCALL_OBJ(dev, K_OBJ_DRIVER_SENSOR)); + K_OOPS(K_SYSCALL_MEMORY_READ(fw_buf, fw_len)); + return z_impl_sensor_upload_fw(dev, fw_buf, fw_len); +} +#include + static inline int z_vrfy_sensor_reconfigure_read_iodev(struct rtio_iodev *iodev, const struct device *sensor, const struct sensor_chan_spec *channels, diff --git a/include/zephyr/drivers/sensor.h b/include/zephyr/drivers/sensor.h index ba2b79d285865..371be6048daea 100644 --- a/include/zephyr/drivers/sensor.h +++ b/include/zephyr/drivers/sensor.h @@ -705,6 +705,9 @@ struct sensor_read_config { /* Used to submit an RTIO sqe to the sensor's iodev */ typedef void (*sensor_submit_t)(const struct device *sensor, struct rtio_iodev_sqe *sqe); +/* Used to provide a driver specific callback to upload a f/w in the sensor */ +typedef int (*sensor_upload_fw_t)(const struct device *dev, const void *fw_buf, size_t fw_len); + /* The default decoder API */ extern const struct sensor_decoder_api __sensor_default_decoder; @@ -719,6 +722,7 @@ __subsystem struct sensor_driver_api { sensor_channel_get_t channel_get; sensor_get_decoder_t get_decoder; sensor_submit_t submit; + sensor_upload_fw_t upload_fw; }; /** @@ -1004,6 +1008,32 @@ static inline int z_impl_sensor_get_decoder(const struct device *dev, return api->get_decoder(dev, decoder); } +/** + * @brief Upload a Firmware to the sensor + * + * @param[in] dev The sensor device + * @param[in] fw_buf Pointer to the Firmware buffer + * @param[in] fw_len Length of Firmware + * @return 0 on success + * @return < 0 on error + */ +__syscall int sensor_upload_fw(const struct device *dev, + const void *fw_buf, size_t fw_len); + +static inline int z_impl_sensor_upload_fw(const struct device *dev, + const void *fw_buf, size_t fw_len) +{ + const struct sensor_driver_api *api = (const struct sensor_driver_api *)dev->api; + + __ASSERT_NO_MSG(api != NULL); + + if (api->upload_fw == NULL) { + return -ENOSYS; + } + + return api->upload_fw(dev, fw_buf, fw_len); +} + /** * @brief Reconfigure a reading iodev * From d7fa1edd148f80e1a71b23c6c1ee4295b8442921 Mon Sep 17 00:00:00 2001 From: Armando Visconti Date: Fri, 18 Jul 2025 17:33:54 +0200 Subject: [PATCH 3/4] sensor/lsm6dso16is: add upload_fw API support Add support to upload_fw API in order to be able to upload a ISPU configuration. Signed-off-by: Armando Visconti --- drivers/sensor/st/lsm6dso16is/Kconfig | 4 ++++ drivers/sensor/st/lsm6dso16is/lsm6dso16is.c | 26 +++++++++++++++++++++ drivers/sensor/st/lsm6dso16is/lsm6dso16is.h | 1 + 3 files changed, 31 insertions(+) diff --git a/drivers/sensor/st/lsm6dso16is/Kconfig b/drivers/sensor/st/lsm6dso16is/Kconfig index 74d90671e6adb..e5ea7fdaaea51 100644 --- a/drivers/sensor/st/lsm6dso16is/Kconfig +++ b/drivers/sensor/st/lsm6dso16is/Kconfig @@ -18,6 +18,10 @@ menuconfig LSM6DSO16IS if LSM6DSO16IS +config LSM6DSO16IS_ISPU_ENABLE + bool "ISPU Enable" + select USE_ST_MEMS_ISPU + choice LSM6DSO16IS_TRIGGER_MODE prompt "Trigger mode" help diff --git a/drivers/sensor/st/lsm6dso16is/lsm6dso16is.c b/drivers/sensor/st/lsm6dso16is/lsm6dso16is.c index 1171d7fa380e3..55595ff832ff1 100644 --- a/drivers/sensor/st/lsm6dso16is/lsm6dso16is.c +++ b/drivers/sensor/st/lsm6dso16is/lsm6dso16is.c @@ -710,6 +710,31 @@ static int lsm6dso16is_channel_get(const struct device *dev, return 0; } +static int lsm6dso16is_upload_ispu(const struct device *dev, + const void *fw_buf, + size_t fw_len) +{ + const struct lsm6dso16is_config *cfg = dev->config; + stmdev_ctx_t *ctx = (stmdev_ctx_t *)&cfg->ctx; + const struct mems_conf_op *bufp = (const struct mems_conf_op *)fw_buf; + int i; + + /* Load ISPU configuration */ + for ( i = 0; i < fw_len; i++ ) { + switch(bufp[i].type) { + case MEMS_CONF_OP_TYPE_DELAY: + k_msleep(bufp[i].data); + break; + + case MEMS_CONF_OP_TYPE_WRITE: + ctx->write_reg(ctx->handle, bufp[i].address, (uint8_t *)&bufp[i].data, 1); + break; + } + } + + return 0; +} + static DEVICE_API(sensor, lsm6dso16is_driver_api) = { .attr_set = lsm6dso16is_attr_set, #if CONFIG_LSM6DSO16IS_TRIGGER @@ -717,6 +742,7 @@ static DEVICE_API(sensor, lsm6dso16is_driver_api) = { #endif .sample_fetch = lsm6dso16is_sample_fetch, .channel_get = lsm6dso16is_channel_get, + .upload_fw = lsm6dso16is_upload_ispu, }; static int lsm6dso16is_init_chip(const struct device *dev) diff --git a/drivers/sensor/st/lsm6dso16is/lsm6dso16is.h b/drivers/sensor/st/lsm6dso16is/lsm6dso16is.h index 62f13586cd632..ad7ed560f7a69 100644 --- a/drivers/sensor/st/lsm6dso16is/lsm6dso16is.h +++ b/drivers/sensor/st/lsm6dso16is/lsm6dso16is.h @@ -17,6 +17,7 @@ #include #include #include "lsm6dso16is_reg.h" +#include "mems_conf_shared_types.h" #if DT_ANY_INST_ON_BUS_STATUS_OKAY(spi) #include From 504006c07706c8b467b7e53ceac5288f563b55f3 Mon Sep 17 00:00:00 2001 From: Armando Visconti Date: Fri, 18 Jul 2025 17:38:10 +0200 Subject: [PATCH 4/4] samples/x_nucleo_iks4a1: add lsm6dso16is ISPU example Add lsm6dso16is ISPU example. Signed-off-by: Armando Visconti --- samples/shields/x_nucleo_iks4a1/standard/prj.conf | 1 + samples/shields/x_nucleo_iks4a1/standard/src/main.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/samples/shields/x_nucleo_iks4a1/standard/prj.conf b/samples/shields/x_nucleo_iks4a1/standard/prj.conf index 0aa79db759f79..8090d38b4b04f 100644 --- a/samples/shields/x_nucleo_iks4a1/standard/prj.conf +++ b/samples/shields/x_nucleo_iks4a1/standard/prj.conf @@ -7,6 +7,7 @@ CONFIG_LIS2MDL_TRIGGER_OWN_THREAD=y CONFIG_LPS2XDF_TRIGGER_OWN_THREAD=y CONFIG_LSM6DSO16IS_TRIGGER_NONE=y CONFIG_LSM6DSO16IS_ENABLE_TEMP=y +CONFIG_LSM6DSO16IS_ISPU_ENABLE=y CONFIG_LSM6DSV16X_TRIGGER_OWN_THREAD=y CONFIG_LSM6DSV16X_ENABLE_TEMP=y CONFIG_LIS2DUX12_TRIGGER_OWN_THREAD=y diff --git a/samples/shields/x_nucleo_iks4a1/standard/src/main.c b/samples/shields/x_nucleo_iks4a1/standard/src/main.c index c4aef34c943a0..d64cdc57d0158 100644 --- a/samples/shields/x_nucleo_iks4a1/standard/src/main.c +++ b/samples/shields/x_nucleo_iks4a1/standard/src/main.c @@ -88,10 +88,19 @@ static void lis2mdl_config(const struct device *lis2mdl) #endif } +#include "norm.h" + static void lsm6dso16is_config(const struct device *lsm6dso16is) { struct sensor_value odr_attr, fs_attr, mode_attr; + /* upload norm ISPU example */ + if (sensor_upload_fw(lsm6dso16is, ispu_conf_conf_0, + (sizeof(ispu_conf_conf_0) / sizeof(struct mems_conf_op))) < 0) { + printk("Cannot upload ISPU\n"); + return; + } + mode_attr.val1 = 0; /* HP */ if (sensor_attr_set(lsm6dso16is, SENSOR_CHAN_ACCEL_XYZ,