diff --git a/boards/adi/apard32690/apard32690_max32690_m4.dts b/boards/adi/apard32690/apard32690_max32690_m4.dts index e1361f467e022..f291e50a80689 100644 --- a/boards/adi/apard32690/apard32690_max32690_m4.dts +++ b/boards/adi/apard32690/apard32690_max32690_m4.dts @@ -84,6 +84,21 @@ <21 0 &gpio2 18 0>; /* D15 */ }; + pmod_header: pmod-header { + compatible = "digilent,pmod"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <0 0 &gpio1 0 0>, /* IO1/CS */ + <1 0 &gpio1 1 0>, /* IO2/MOSI */ + <2 0 &gpio1 2 0>, /* IO3/MISO */ + <3 0 &gpio1 3 0>, /* IO4/SCK */ + <4 0 &gpio2 21 0>, /* IO5/INT */ + <5 0 &gpio1 6 0>, /* IO6/RESET */ + <6 0 &gpio1 4 0>, /* IO7/CS2 */ + <7 0 &gpio1 5 0>; /* IO8/CS3 */ + }; + sdram1: sdram1@60000000 { compatible = "zephyr,memory-region", "mmio-sram"; status = "disabled"; diff --git a/boards/adi/apard32690/apard32690_max32690_m4.yaml b/boards/adi/apard32690/apard32690_max32690_m4.yaml index dd0e03f0537a6..ba9f690d05494 100644 --- a/boards/adi/apard32690/apard32690_max32690_m4.yaml +++ b/boards/adi/apard32690/apard32690_max32690_m4.yaml @@ -11,6 +11,7 @@ supported: - arduino_serial - arduino_spi - pmod_spi + - pmod_gpio - gpio - serial - spi diff --git a/boards/shields/pmod_acl/pmod_acl.overlay b/boards/shields/pmod_acl/pmod_acl.overlay index 3cc0a947ef33d..9f290496dcd87 100644 --- a/boards/shields/pmod_acl/pmod_acl.overlay +++ b/boards/shields/pmod_acl/pmod_acl.overlay @@ -4,6 +4,8 @@ * SPDX-License-Identifier: Apache-2.0 */ +#include + &pmod_spi { status = "okay"; @@ -11,8 +13,9 @@ compatible = "adi,adxl345"; reg = <0x0>; spi-max-frequency = ; + int2-gpios = <&pmod_header 4 GPIO_ACTIVE_HIGH>; status = "okay"; - odr = <25>; + odr = ; fifo-watermark = <31>; }; }; diff --git a/drivers/sensor/adi/adxl345/adxl345.c b/drivers/sensor/adi/adxl345/adxl345.c index 289fb1aa6fe72..4d51c9b12941b 100644 --- a/drivers/sensor/adi/adxl345/adxl345.c +++ b/drivers/sensor/adi/adxl345/adxl345.c @@ -325,28 +325,16 @@ static int adxl345_sample_fetch(const struct device *dev, { struct adxl345_dev_data *data = dev->data; struct adxl345_sample sample; - uint8_t samples_count; int rc; - data->sample_number = 0; - rc = adxl345_reg_read_byte(dev, ADXL345_FIFO_STATUS_REG, &samples_count); + rc = adxl345_read_sample(dev, &sample); if (rc < 0) { - LOG_ERR("Failed to read FIFO status rc = %d\n", rc); + LOG_ERR("Failed to fetch sample rc=%d\n", rc); return rc; } - - __ASSERT_NO_MSG(samples_count <= ARRAY_SIZE(data->bufx)); - - for (uint8_t s = 0; s < samples_count; s++) { - rc = adxl345_read_sample(dev, &sample); - if (rc < 0) { - LOG_ERR("Failed to fetch sample rc=%d\n", rc); - return rc; - } - data->bufx[s] = sample.x; - data->bufy[s] = sample.y; - data->bufz[s] = sample.z; - } + data->samples.x = sample.x; + data->samples.y = sample.y; + data->samples.z = sample.z; return 0; } @@ -357,28 +345,20 @@ static int adxl345_channel_get(const struct device *dev, { struct adxl345_dev_data *data = dev->data; - if (data->sample_number >= ARRAY_SIZE(data->bufx)) { - data->sample_number = 0; - } - switch (chan) { case SENSOR_CHAN_ACCEL_X: - adxl345_accel_convert(val, data->bufx[data->sample_number]); - data->sample_number++; + adxl345_accel_convert(val, data->samples.x); break; case SENSOR_CHAN_ACCEL_Y: - adxl345_accel_convert(val, data->bufy[data->sample_number]); - data->sample_number++; + adxl345_accel_convert(val, data->samples.y); break; case SENSOR_CHAN_ACCEL_Z: - adxl345_accel_convert(val, data->bufz[data->sample_number]); - data->sample_number++; + adxl345_accel_convert(val, data->samples.z); break; case SENSOR_CHAN_ACCEL_XYZ: - adxl345_accel_convert(val++, data->bufx[data->sample_number]); - adxl345_accel_convert(val++, data->bufy[data->sample_number]); - adxl345_accel_convert(val, data->bufz[data->sample_number]); - data->sample_number++; + adxl345_accel_convert(val++, data->samples.x); + adxl345_accel_convert(val++, data->samples.y); + adxl345_accel_convert(val, data->samples.z); break; default: return -ENOTSUP; @@ -439,13 +419,9 @@ static int adxl345_init(const struct device *dev) { int rc; struct adxl345_dev_data *data = dev->data; -#ifdef CONFIG_ADXL345_TRIGGER const struct adxl345_dev_config *cfg = dev->config; -#endif uint8_t dev_id, full_res; - data->sample_number = 0; - if (!adxl345_bus_is_ready(dev)) { LOG_ERR("bus not ready"); return -ENODEV; @@ -479,14 +455,14 @@ static int adxl345_init(const struct device *dev) return -EIO; } -#ifdef CONFIG_ADXL345_TRIGGER - rc = adxl345_configure_fifo(dev, ADXL345_FIFO_STREAMED, - ADXL345_INT2, - cfg->fifo_config.fifo_samples); + rc = adxl345_configure_fifo(dev, + IS_ENABLED(CONFIG_ADXL345_STREAM) ? ADXL345_FIFO_STREAMED : + ADXL345_FIFO_BYPASSED, + ADXL345_INT2, + cfg->fifo_config.fifo_samples); if (rc) { return rc; } -#endif rc = adxl345_reg_write_byte(dev, ADXL345_POWER_CTL_REG, ADXL345_ENABLE_MEASURE_BIT); if (rc < 0) { diff --git a/drivers/sensor/adi/adxl345/adxl345.h b/drivers/sensor/adi/adxl345/adxl345.h index d6935645c8ef6..92351624a9002 100644 --- a/drivers/sensor/adi/adxl345/adxl345.h +++ b/drivers/sensor/adi/adxl345/adxl345.h @@ -151,10 +151,11 @@ enum adxl345_op_mode { }; struct adxl345_dev_data { - unsigned int sample_number; - int16_t bufx[ADXL345_MAX_FIFO_SIZE]; - int16_t bufy[ADXL345_MAX_FIFO_SIZE]; - int16_t bufz[ADXL345_MAX_FIFO_SIZE]; + struct { + int16_t x; + int16_t y; + int16_t z; + } samples; struct adxl345_fifo_config fifo_config; uint8_t is_full_res; uint8_t selected_range; @@ -273,8 +274,8 @@ int adxl345_reg_write_byte(const struct device *dev, uint8_t addr, uint8_t val); int adxl345_reg_read_byte(const struct device *dev, uint8_t addr, uint8_t *buf); int adxl345_set_op_mode(const struct device *dev, enum adxl345_op_mode op_mode); -#ifdef CONFIG_SENSOR_ASYNC_API int adxl345_read_sample(const struct device *dev, struct adxl345_sample *sample); +#ifdef CONFIG_SENSOR_ASYNC_API void adxl345_submit(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe); int adxl345_get_decoder(const struct device *dev, const struct sensor_decoder_api **decoder); void adxl345_accel_convert(struct sensor_value *val, int16_t sample); diff --git a/drivers/sensor/adi/adxl345/adxl345_trigger.c b/drivers/sensor/adi/adxl345/adxl345_trigger.c index 7c29523436b74..209a6bc7101b6 100644 --- a/drivers/sensor/adi/adxl345/adxl345_trigger.c +++ b/drivers/sensor/adi/adxl345/adxl345_trigger.c @@ -90,7 +90,9 @@ int adxl345_trigger_set(const struct device *dev, { const struct adxl345_dev_config *cfg = dev->config; struct adxl345_dev_data *drv_data = dev->data; - uint8_t int_mask, int_en, status1; + struct adxl345_sample sample; + uint8_t int_mask, int_en; + uint8_t samples_count; int ret; ret = gpio_pin_interrupt_configure_dt(&cfg->interrupt, @@ -103,7 +105,13 @@ int adxl345_trigger_set(const struct device *dev, case SENSOR_TRIG_DATA_READY: drv_data->drdy_handler = handler; drv_data->drdy_trigger = trig; - int_mask = ADXL345_INT_MAP_DATA_RDY_MSK; + /** Enabling DRDY means not using Watermark interrupt as both + * are served by reading data-register: two clients can't be + * served simultaneously. + */ + int_mask = ADXL345_INT_MAP_DATA_RDY_MSK | + ADXL345_INT_MAP_OVERRUN_MSK | + ADXL345_INT_MAP_WATERMARK_MSK; break; default: LOG_ERR("Unsupported sensor trigger"); @@ -111,18 +119,31 @@ int adxl345_trigger_set(const struct device *dev, } if (handler) { - int_en = int_mask; + int_en = ADXL345_INT_MAP_DATA_RDY_MSK; } else { int_en = 0U; } +#ifdef CONFIG_ADXL345_STREAM + (void)adxl345_configure_fifo(dev, ADXL345_FIFO_BYPASSED, ADXL345_INT2, 0); +#endif + + ret = adxl345_reg_write_mask(dev, ADXL345_INT_ENABLE, int_mask, 0); + if (ret < 0) { + return ret; + } + ret = adxl345_reg_write_mask(dev, ADXL345_INT_MAP, int_mask, int_en); if (ret < 0) { return ret; } - /* Clear status */ - ret = adxl345_get_status(dev, &status1, NULL); + + /* Clear status and read sample-set to clear interrupt flag */ + (void)adxl345_read_sample(dev, &sample); + + ret = adxl345_reg_read_byte(dev, ADXL345_FIFO_STATUS_REG, &samples_count); if (ret < 0) { + LOG_ERR("Failed to read FIFO status rc = %d\n", ret); return ret; } @@ -132,6 +153,11 @@ int adxl345_trigger_set(const struct device *dev, return ret; } + ret = adxl345_reg_write_mask(dev, ADXL345_INT_ENABLE, int_mask, int_en); + if (ret < 0) { + return ret; + } + return 0; } @@ -171,6 +197,8 @@ int adxl345_init_interrupt(const struct device *dev) adxl345_thread, drv_data, NULL, NULL, K_PRIO_COOP(CONFIG_ADXL345_THREAD_PRIORITY), 0, K_NO_WAIT); + + k_thread_name_set(&drv_data->thread, dev->name); #elif defined(CONFIG_ADXL345_TRIGGER_GLOBAL_THREAD) drv_data->work.handler = adxl345_work_cb; #endif diff --git a/samples/sensor/accel_polling/adxl345-stream.conf b/samples/sensor/accel_polling/adxl345-stream.conf new file mode 100644 index 0000000000000..cc4262ba6a317 --- /dev/null +++ b/samples/sensor/accel_polling/adxl345-stream.conf @@ -0,0 +1,6 @@ +# Copyright (c) 2024 Analog Devices, Inc. +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_SPI_RTIO=y +CONFIG_SENSOR_ASYNC_API=y +CONFIG_ADXL345_STREAM=y diff --git a/samples/sensor/accel_polling/sample.yaml b/samples/sensor/accel_polling/sample.yaml index a070d52150343..a57b910bef1ec 100644 --- a/samples/sensor/accel_polling/sample.yaml +++ b/samples/sensor/accel_polling/sample.yaml @@ -27,11 +27,22 @@ tests: - b_l4s5i_iot01a # lsm6dsl - sensortile_box # lis2dw12, lsm6dso, iisdhhc - thingy53/nrf5340/cpuapp # adxl362, bmi270 + sample.sensor.accel_polling.adxl345-stream: + extra_args: + - SHIELD=pmod_acl + - EXTRA_CONF_FILE=adxl345-stream.conf + - SNIPPET=rtt-tracing;rtt-console + extra_configs: + - CONFIG_UART_CONSOLE=n + platform_allow: + - apard32690/max32690/m4 sample.sensor.accel_polling.adxl362-stream: extra_args: - SHIELD=eval_adxl362_ardz - EXTRA_CONF_FILE=adxl362-stream.conf - SNIPPET=rtt-tracing;rtt-console + extra_configs: + - CONFIG_UART_CONSOLE=n platform_allow: - apard32690/max32690/m4 sample.sensor.accel_polling.adxl367-stream: diff --git a/samples/sensor/accel_polling/src/main.c b/samples/sensor/accel_polling/src/main.c index ec6e1cee91012..cdcc9bc55613b 100644 --- a/samples/sensor/accel_polling/src/main.c +++ b/samples/sensor/accel_polling/src/main.c @@ -29,7 +29,7 @@ static const struct device *const sensors[] = {LISTIFY(10, ACCELEROMETER_DEVICE, #define ACCEL_TRIGGERS \ {SENSOR_TRIG_FIFO_FULL, SENSOR_STREAM_DATA_INCLUDE}, \ - {SENSOR_TRIG_FIFO_WATERMARK, SENSOR_STREAM_DATA_DROP} + {SENSOR_TRIG_FIFO_WATERMARK, SENSOR_STREAM_DATA_INCLUDE} #define ACCEL_DEFINE_IODEV(id, _) \ SENSOR_DT_STREAM_IODEV( \ diff --git a/samples/sensor/accel_trig/adxl345-trigger.conf b/samples/sensor/accel_trig/adxl345-trigger.conf new file mode 100644 index 0000000000000..92571f0c99186 --- /dev/null +++ b/samples/sensor/accel_trig/adxl345-trigger.conf @@ -0,0 +1,4 @@ +# Copyright (c) 2024 Analog Devices, Inc. +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_ADXL345_TRIGGER_OWN_THREAD=y diff --git a/samples/sensor/accel_trig/sample.yaml b/samples/sensor/accel_trig/sample.yaml index 31b7ddfbb72e2..c17604911dbb4 100644 --- a/samples/sensor/accel_trig/sample.yaml +++ b/samples/sensor/accel_trig/sample.yaml @@ -23,11 +23,22 @@ tests: - disco_l475_iot1 - stm32l562e_dk - stm32wb5mm_dk + sample.sensor.accel_trig.adxl345-trigger: + extra_args: + - SHIELD=pmod_acl + - EXTRA_CONF_FILE=adxl345-trigger.conf + - SNIPPET=rtt-tracing;rtt-console + extra_configs: + - CONFIG_UART_CONSOLE=n + platform_allow: + - apard32690/max32690/m4 sample.sensor.accel_trig.adxl362-trigger: extra_args: - SHIELD=eval_adxl362_ardz - EXTRA_CONF_FILE=adxl362-trigger.conf - SNIPPET=rtt-tracing;rtt-console + extra_configs: + - CONFIG_UART_CONSOLE=n platform_allow: - apard32690/max32690/m4 sample.sensor.accel_trig.shield-tap: