Skip to content
Merged
15 changes: 15 additions & 0 deletions boards/adi/apard32690/apard32690_max32690_m4.dts
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down
1 change: 1 addition & 0 deletions boards/adi/apard32690/apard32690_max32690_m4.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ supported:
- arduino_serial
- arduino_spi
- pmod_spi
- pmod_gpio
- gpio
- serial
- spi
Expand Down
5 changes: 4 additions & 1 deletion boards/shields/pmod_acl/pmod_acl.overlay
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,18 @@
* SPDX-License-Identifier: Apache-2.0
*/

#include <zephyr/dt-bindings/sensor/adxl345.h>

&pmod_spi {
status = "okay";

adxl345_pmod_acl: adxl345@0 {
compatible = "adi,adxl345";
reg = <0x0>;
spi-max-frequency = <DT_FREQ_M(1)>;
int2-gpios = <&pmod_header 4 GPIO_ACTIVE_HIGH>;
status = "okay";
odr = <25>;
odr = <ADXL345_DT_ODR_25>;
fifo-watermark = <31>;
};
};
56 changes: 16 additions & 40 deletions drivers/sensor/adi/adxl345/adxl345.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down
11 changes: 6 additions & 5 deletions drivers/sensor/adi/adxl345/adxl345.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
38 changes: 33 additions & 5 deletions drivers/sensor/adi/adxl345/adxl345_trigger.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -103,26 +105,45 @@ 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");
return -ENOTSUP;
}

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;
}

Expand All @@ -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;
}

Expand Down Expand Up @@ -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
Expand Down
6 changes: 6 additions & 0 deletions samples/sensor/accel_polling/adxl345-stream.conf
Original file line number Diff line number Diff line change
@@ -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
11 changes: 11 additions & 0 deletions samples/sensor/accel_polling/sample.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion samples/sensor/accel_polling/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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( \
Expand Down
4 changes: 4 additions & 0 deletions samples/sensor/accel_trig/adxl345-trigger.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Copyright (c) 2024 Analog Devices, Inc.
# SPDX-License-Identifier: Apache-2.0

CONFIG_ADXL345_TRIGGER_OWN_THREAD=y
11 changes: 11 additions & 0 deletions samples/sensor/accel_trig/sample.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down