Skip to content

Commit cc6cd16

Browse files
ubiedaMaureenHelm
authored andcommitted
sensor: adxl345: Set FIFO to bypass mode when DRDY is enabled
In order to prevent not serving all events that would clear the interrupt line. This patch also removes FIFO servicing through fetch/get APIs, as this is only exposed through streaming mode. Signed-off-by: Luis Ubieda <[email protected]>
1 parent 585384c commit cc6cd16

File tree

3 files changed

+53
-50
lines changed

3 files changed

+53
-50
lines changed

drivers/sensor/adi/adxl345/adxl345.c

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -325,28 +325,16 @@ static int adxl345_sample_fetch(const struct device *dev,
325325
{
326326
struct adxl345_dev_data *data = dev->data;
327327
struct adxl345_sample sample;
328-
uint8_t samples_count;
329328
int rc;
330329

331-
data->sample_number = 0;
332-
rc = adxl345_reg_read_byte(dev, ADXL345_FIFO_STATUS_REG, &samples_count);
330+
rc = adxl345_read_sample(dev, &sample);
333331
if (rc < 0) {
334-
LOG_ERR("Failed to read FIFO status rc = %d\n", rc);
332+
LOG_ERR("Failed to fetch sample rc=%d\n", rc);
335333
return rc;
336334
}
337-
338-
__ASSERT_NO_MSG(samples_count <= ARRAY_SIZE(data->bufx));
339-
340-
for (uint8_t s = 0; s < samples_count; s++) {
341-
rc = adxl345_read_sample(dev, &sample);
342-
if (rc < 0) {
343-
LOG_ERR("Failed to fetch sample rc=%d\n", rc);
344-
return rc;
345-
}
346-
data->bufx[s] = sample.x;
347-
data->bufy[s] = sample.y;
348-
data->bufz[s] = sample.z;
349-
}
335+
data->samples.x = sample.x;
336+
data->samples.y = sample.y;
337+
data->samples.z = sample.z;
350338

351339
return 0;
352340
}
@@ -357,28 +345,20 @@ static int adxl345_channel_get(const struct device *dev,
357345
{
358346
struct adxl345_dev_data *data = dev->data;
359347

360-
if (data->sample_number >= ARRAY_SIZE(data->bufx)) {
361-
data->sample_number = 0;
362-
}
363-
364348
switch (chan) {
365349
case SENSOR_CHAN_ACCEL_X:
366-
adxl345_accel_convert(val, data->bufx[data->sample_number]);
367-
data->sample_number++;
350+
adxl345_accel_convert(val, data->samples.x);
368351
break;
369352
case SENSOR_CHAN_ACCEL_Y:
370-
adxl345_accel_convert(val, data->bufy[data->sample_number]);
371-
data->sample_number++;
353+
adxl345_accel_convert(val, data->samples.y);
372354
break;
373355
case SENSOR_CHAN_ACCEL_Z:
374-
adxl345_accel_convert(val, data->bufz[data->sample_number]);
375-
data->sample_number++;
356+
adxl345_accel_convert(val, data->samples.z);
376357
break;
377358
case SENSOR_CHAN_ACCEL_XYZ:
378-
adxl345_accel_convert(val++, data->bufx[data->sample_number]);
379-
adxl345_accel_convert(val++, data->bufy[data->sample_number]);
380-
adxl345_accel_convert(val, data->bufz[data->sample_number]);
381-
data->sample_number++;
359+
adxl345_accel_convert(val++, data->samples.x);
360+
adxl345_accel_convert(val++, data->samples.y);
361+
adxl345_accel_convert(val, data->samples.z);
382362
break;
383363
default:
384364
return -ENOTSUP;
@@ -439,13 +419,9 @@ static int adxl345_init(const struct device *dev)
439419
{
440420
int rc;
441421
struct adxl345_dev_data *data = dev->data;
442-
#ifdef CONFIG_ADXL345_TRIGGER
443422
const struct adxl345_dev_config *cfg = dev->config;
444-
#endif
445423
uint8_t dev_id, full_res;
446424

447-
data->sample_number = 0;
448-
449425
if (!adxl345_bus_is_ready(dev)) {
450426
LOG_ERR("bus not ready");
451427
return -ENODEV;
@@ -479,14 +455,14 @@ static int adxl345_init(const struct device *dev)
479455
return -EIO;
480456
}
481457

482-
#ifdef CONFIG_ADXL345_TRIGGER
483-
rc = adxl345_configure_fifo(dev, ADXL345_FIFO_STREAMED,
484-
ADXL345_INT2,
485-
cfg->fifo_config.fifo_samples);
458+
rc = adxl345_configure_fifo(dev,
459+
IS_ENABLED(CONFIG_ADXL345_STREAM) ? ADXL345_FIFO_STREAMED :
460+
ADXL345_FIFO_BYPASSED,
461+
ADXL345_INT2,
462+
cfg->fifo_config.fifo_samples);
486463
if (rc) {
487464
return rc;
488465
}
489-
#endif
490466

491467
rc = adxl345_reg_write_byte(dev, ADXL345_POWER_CTL_REG, ADXL345_ENABLE_MEASURE_BIT);
492468
if (rc < 0) {

drivers/sensor/adi/adxl345/adxl345.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,11 @@ enum adxl345_op_mode {
151151
};
152152

153153
struct adxl345_dev_data {
154-
unsigned int sample_number;
155-
int16_t bufx[ADXL345_MAX_FIFO_SIZE];
156-
int16_t bufy[ADXL345_MAX_FIFO_SIZE];
157-
int16_t bufz[ADXL345_MAX_FIFO_SIZE];
154+
struct {
155+
int16_t x;
156+
int16_t y;
157+
int16_t z;
158+
} samples;
158159
struct adxl345_fifo_config fifo_config;
159160
uint8_t is_full_res;
160161
uint8_t selected_range;
@@ -273,8 +274,8 @@ int adxl345_reg_write_byte(const struct device *dev, uint8_t addr, uint8_t val);
273274
int adxl345_reg_read_byte(const struct device *dev, uint8_t addr, uint8_t *buf);
274275

275276
int adxl345_set_op_mode(const struct device *dev, enum adxl345_op_mode op_mode);
276-
#ifdef CONFIG_SENSOR_ASYNC_API
277277
int adxl345_read_sample(const struct device *dev, struct adxl345_sample *sample);
278+
#ifdef CONFIG_SENSOR_ASYNC_API
278279
void adxl345_submit(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe);
279280
int adxl345_get_decoder(const struct device *dev, const struct sensor_decoder_api **decoder);
280281
void adxl345_accel_convert(struct sensor_value *val, int16_t sample);

drivers/sensor/adi/adxl345/adxl345_trigger.c

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ int adxl345_trigger_set(const struct device *dev,
9090
{
9191
const struct adxl345_dev_config *cfg = dev->config;
9292
struct adxl345_dev_data *drv_data = dev->data;
93-
uint8_t int_mask, int_en, status1;
93+
struct adxl345_sample sample;
94+
uint8_t int_mask, int_en;
95+
uint8_t samples_count;
9496
int ret;
9597

9698
ret = gpio_pin_interrupt_configure_dt(&cfg->interrupt,
@@ -103,26 +105,45 @@ int adxl345_trigger_set(const struct device *dev,
103105
case SENSOR_TRIG_DATA_READY:
104106
drv_data->drdy_handler = handler;
105107
drv_data->drdy_trigger = trig;
106-
int_mask = ADXL345_INT_MAP_DATA_RDY_MSK;
108+
/** Enabling DRDY means not using Watermark interrupt as both
109+
* are served by reading data-register: two clients can't be
110+
* served simultaneously.
111+
*/
112+
int_mask = ADXL345_INT_MAP_DATA_RDY_MSK |
113+
ADXL345_INT_MAP_OVERRUN_MSK |
114+
ADXL345_INT_MAP_WATERMARK_MSK;
107115
break;
108116
default:
109117
LOG_ERR("Unsupported sensor trigger");
110118
return -ENOTSUP;
111119
}
112120

113121
if (handler) {
114-
int_en = int_mask;
122+
int_en = ADXL345_INT_MAP_DATA_RDY_MSK;
115123
} else {
116124
int_en = 0U;
117125
}
118126

127+
#ifdef CONFIG_ADXL345_STREAM
128+
(void)adxl345_configure_fifo(dev, ADXL345_FIFO_BYPASSED, ADXL345_INT2, 0);
129+
#endif
130+
131+
ret = adxl345_reg_write_mask(dev, ADXL345_INT_ENABLE, int_mask, 0);
132+
if (ret < 0) {
133+
return ret;
134+
}
135+
119136
ret = adxl345_reg_write_mask(dev, ADXL345_INT_MAP, int_mask, int_en);
120137
if (ret < 0) {
121138
return ret;
122139
}
123-
/* Clear status */
124-
ret = adxl345_get_status(dev, &status1, NULL);
140+
141+
/* Clear status and read sample-set to clear interrupt flag */
142+
(void)adxl345_read_sample(dev, &sample);
143+
144+
ret = adxl345_reg_read_byte(dev, ADXL345_FIFO_STATUS_REG, &samples_count);
125145
if (ret < 0) {
146+
LOG_ERR("Failed to read FIFO status rc = %d\n", ret);
126147
return ret;
127148
}
128149

@@ -132,6 +153,11 @@ int adxl345_trigger_set(const struct device *dev,
132153
return ret;
133154
}
134155

156+
ret = adxl345_reg_write_mask(dev, ADXL345_INT_ENABLE, int_mask, int_en);
157+
if (ret < 0) {
158+
return ret;
159+
}
160+
135161
return 0;
136162
}
137163

0 commit comments

Comments
 (0)