Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
182bc8f
sensor: adxl345: DTS: add binding for FIFO interrupts
Rubusch Jun 26, 2025
655870d
sensor: adxl345: DTS: set minimum watermark to 2
Rubusch Oct 6, 2025
e4ce8f5
sensor: adxl345: DTS: adjust comment for interrupt binding
Rubusch Oct 8, 2025
eaf2b48
sensor: adxl345: set minimum watermark to 2
Rubusch Oct 8, 2025
f2400ba
sensor: adxl345: rename ADXL345_INT_ENABLE to ADXL345_INT_ENABLE_REG
Rubusch Jul 22, 2025
baf2957
sensor: adxl345: rename ADXL345_INT_MAP to ADXL345_INT_MAP_REG
Rubusch Jul 22, 2025
05ef6ae
sensor: adxl345: rename ADXL345_INT_SOURCE to ADXL345_INT_SOURCE_REG
Rubusch Jul 22, 2025
8901286
sensor: adxl345: rename SAMPLE_SIZE to ADXL345_FIFO_SAMPLE_SIZE
Rubusch Jul 23, 2025
d120c48
sensor: adxl345: rename SAMPLE_MASK to ADXL345_FIFO_SAMPLE_MSK
Rubusch Jul 23, 2025
d075536
sensor: adxl345: rename SAMPLE_NUM to ADXL345_FIFO_CTL_SAMPLES_MSK
Rubusch Jul 22, 2025
6928939
sensor: adxl345: change type of member is_full_res
Rubusch Jul 21, 2025
b634780
sensor: adxl345: change type of member fifo_samples
Rubusch Jul 22, 2025
c742a13
sensor: adxl345: fix function adxl345_write_mask()
Rubusch Jul 21, 2025
013925b
sensor: adxl345: remove unused adxl345_set_op_mode()
Rubusch Jul 21, 2025
d8a9f58
sensor: adxl345: remove unused field op_mode
Rubusch Jul 22, 2025
c177965
sensor: adxl345: control measurement by a dedicated function
Rubusch Jul 22, 2025
adcbc72
sensor: adxl345: split function get_status()
Rubusch Jul 22, 2025
e6718a8
sensor: adxl345: refactor both interrupt lines configurable in device…
Rubusch Jul 22, 2025
da74339
sensor: adxl345: rename local status1 to status
Rubusch Oct 10, 2025
012004e
sensor: adxl345: refactor ODR initialization
Rubusch Jul 22, 2025
a5248fb
sensor: adxl345: init the ADXL345_DATA_FORMAT_REG register
Rubusch Jul 22, 2025
917e51e
sensor: adxl345: fix FIFO default configuration
Rubusch Jul 25, 2025
4b6e074
sensor: adxl345: introduce ADXL345_REG_DATA_XYZ_REGS
Rubusch Jul 27, 2025
8014790
sensor: adxl345: rework FIFO mode and interrupt initialization
Rubusch Jul 22, 2025
6ccabb0
sensor: adxl345: remove unused field fifo_config from the const config
Rubusch Jul 22, 2025
4f3204a
sensor: adxl345: remove unnecessary loop check
Rubusch Jul 22, 2025
a64c486
sensor: adxl345: simplify INT register field defines
Rubusch Jul 26, 2025
2c2df72
sensor: adxl345: simplify event handler registration
Rubusch Jul 22, 2025
ccea5a0
sensor: adxl345: fix fetch and get to correctly read the FIFO samples
Rubusch Jul 27, 2025
23189cd
sensor: adxl345: reorganize stream code
Rubusch Sep 22, 2025
334077b
sensor: adxl345: remove pointless variable fifo_total_bytes
Rubusch Sep 22, 2025
4f92ab8
sensor: adxl345: use a concise naming for fifo related variables
Rubusch Sep 22, 2025
7730503
sensor: adxl345: add watermark configuration through app attribute
Rubusch Jul 21, 2025
6a4d044
sensor: adxl345: rename status1 to reg_int_source
Rubusch Sep 23, 2025
e3e53db
sensor: adxl345: streamline error handling
Rubusch Sep 23, 2025
00a8fe7
sensor: adxl345: provide generic bus access API
Rubusch Sep 23, 2025
98ec77b
sensor: adxl345: factor out initialization of the stream header
Rubusch Sep 23, 2025
d45b662
sensor: adxl345: factor out consumption of CQEs
Rubusch Sep 23, 2025
d0cd81f
sensor: adxl345: move streaming checks to separate function
Rubusch Sep 23, 2025
a2b8770
sensor: adxl345: rework flushing the fifo
Rubusch Sep 23, 2025
f6b7a52
sensor: adxl345: cover watermark and overrun as sensor events
Rubusch Sep 23, 2025
29365ff
sensor: adxl345: distinguish the stream handler from trigger
Rubusch Sep 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
150 changes: 130 additions & 20 deletions drivers/sensor/adi/adxl345/adxl345.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,22 +87,111 @@ int adxl345_reg_write(const struct device *dev, uint8_t addr, uint8_t *data,
return adxl345_reg_access(dev, ADXL345_WRITE_CMD, addr, data, len);
}

int adxl345_reg_read(const struct device *dev, uint8_t addr, uint8_t *data,
uint8_t len)
int adxl345_raw_reg_read(const struct device *dev, uint8_t addr,
uint8_t *data, uint8_t len)
{

return adxl345_reg_access(dev, ADXL345_READ_CMD, addr, data, len);
}

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)

{
return adxl345_reg_write(dev, addr, &val, 1);
}
struct adxl345_dev_data *data = dev->data;

int adxl345_reg_read_byte(const struct device *dev, uint8_t addr, uint8_t *buf)
/* caching for particular config registers */
switch (addr) {
case ADXL345_POWER_CTL_REG:
*buf = data->cache_reg_power_ctl;
return 0;
case ADXL345_INT_ENABLE_REG:
*buf = data->cache_reg_int_enable;
return 0;
case ADXL345_INT_MAP_REG:
*buf = data->cache_reg_int_map;
return 0;
case ADXL345_DATA_FORMAT_REG:
*buf = data->cache_reg_data_format;
return 0;
case ADXL345_RATE_REG:
*buf = data->cache_reg_rate;
return 0;
case ADXL345_FIFO_CTL_REG:
*buf = data->cache_reg_fifo_ctl;
return 0;
case ADXL345_THRESH_ACT_REG:
*buf = data->cache_reg_act_thresh;
return 0;
default:
#if defined(CONFIG_ADXL345_STREAM)
LOG_DBG("Fall through reading 0x%02x on RTIO might need a %s",
addr, "callback for evaluation!");
return adxl345_rtio_reg_read(dev, addr, buf, 1, NULL, NULL);
#else
return adxl345_raw_reg_read(dev, addr, buf, 1);
#endif
}
}

int adxl345_reg_write_byte(const struct device *dev, uint8_t addr, uint8_t val)
{
return adxl345_reg_read(dev, addr, buf, 1);
struct adxl345_dev_data *data = dev->data;

/* caching for particular config registers */
switch (addr) {
case ADXL345_POWER_CTL_REG:
data->cache_reg_power_ctl = val;
break;
case ADXL345_INT_ENABLE_REG:
data->cache_reg_int_enable = val;
break;
case ADXL345_INT_MAP_REG:
data->cache_reg_int_map = val;
break;
case ADXL345_DATA_FORMAT_REG:
data->cache_reg_data_format = val;
break;
case ADXL345_RATE_REG:
data->cache_reg_rate = val;
break;
case ADXL345_FIFO_CTL_REG:
data->cache_reg_fifo_ctl = val;
break;
case ADXL345_THRESH_ACT_REG:
data->cache_reg_act_thresh = val;
break;
default:
break;
}

#if defined(CONFIG_ADXL345_STREAM)
const struct adxl345_dev_config *cfg = dev->config;
struct rtio_sqe *write_reg_sqe = rtio_sqe_acquire(data->rtio_ctx);

rtio_sqe_prep_tiny_write(write_reg_sqe, data->iodev, RTIO_PRIO_NORM,
&addr, sizeof(addr), NULL);
write_reg_sqe->flags |= RTIO_SQE_TRANSACTION;

/*
* Use a tiny write for register and an additional write for register
* content. It's not possible to pass two byte directly as tiny write,
* since the sqe buffer was defined holding just one byte.
*/
struct rtio_sqe *write_buf_sqe = rtio_sqe_acquire(data->rtio_ctx);

rtio_sqe_prep_tiny_write(write_buf_sqe, data->iodev, RTIO_PRIO_NORM,
&val, sizeof(val), NULL);

if (cfg->bus_type == ADXL345_BUS_I2C) {
write_buf_sqe->iodev_flags |= RTIO_IODEV_I2C_STOP | RTIO_IODEV_I2C_RESTART;
}

rtio_submit(data->rtio_ctx, 2); /* keep control commands blocking */

return 0;
#else
return adxl345_reg_write(dev, addr, &val, 1);
#endif
Comment on lines +167 to +194
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we want to go this ifdefry route. If you want to go the route of everything working over RTIO, I suggest looking into other drivers that define the _bus.h/.c module to abstract this away, OR don't have the fetch-get code depend on RTIO.

}

int adxl345_reg_write_mask(const struct device *dev,
Expand Down Expand Up @@ -175,8 +264,8 @@ int adxl345_flush_fifo(const struct device *dev)

sample_number = adxl345_get_fifo_entries(dev);
while (sample_number >= 0) { /* Read FIFO entries + 1 sample lines */
rc = adxl345_reg_read(dev, ADXL345_REG_DATA_XYZ_REGS,
&regval, ADXL345_FIFO_SAMPLE_SIZE);
rc = adxl345_raw_reg_read(dev, ADXL345_REG_DATA_XYZ_REGS,
&regval, ADXL345_FIFO_SAMPLE_SIZE);
if (rc) {
return rc;
}
Expand Down Expand Up @@ -314,8 +403,8 @@ int adxl345_read_sample(const struct device *dev,
uint8_t axis_data[ADXL345_FIFO_SAMPLE_SIZE];
int rc;

rc = adxl345_reg_read(dev, ADXL345_REG_DATA_XYZ_REGS,
axis_data, ADXL345_FIFO_SAMPLE_SIZE);
rc = adxl345_raw_reg_read(dev, ADXL345_REG_DATA_XYZ_REGS,
axis_data, ADXL345_FIFO_SAMPLE_SIZE);
if (rc < 0) {
LOG_ERR("Samples read failed with rc=%d\n", rc);
return rc;
Expand Down Expand Up @@ -474,19 +563,41 @@ static int adxl345_init(const struct device *dev)
return -ENODEV;
}

rc = adxl345_reg_read_byte(dev, ADXL345_DEVICE_ID_REG, &dev_id);
rc = adxl345_raw_reg_read(dev, ADXL345_DEVICE_ID_REG, &dev_id, 1);
if (rc < 0 || dev_id != ADXL345_PART_ID) {
LOG_ERR("Read PART ID failed: 0x%x\n", rc);
return -ENODEV;
}

#if CONFIG_ADXL345_STREAM
rc = adxl345_reg_write_byte(dev, ADXL345_FIFO_CTL_REG, ADXL345_FIFO_STREAM_MODE);
if (rc < 0) {
LOG_ERR("FIFO enable failed\n");
return -EIO;
/*
* Preset used config registers and init caches in order to use bit
* changes also for STREAM mode in a more efficient way
*/
rc = adxl345_reg_write_byte(dev, ADXL345_POWER_CTL_REG, 0x00);
if (rc) {
return rc;
}
#endif

rc = adxl345_reg_write_byte(dev, ADXL345_INT_ENABLE_REG, 0x00);
if (rc) {
return rc;
}

rc = adxl345_reg_write_byte(dev, ADXL345_INT_MAP_REG, 0x00);
if (rc) {
return rc;
}

rc = adxl345_reg_write_byte(dev, ADXL345_RATE_REG, 0x00);
if (rc) {
return rc;
}

rc = adxl345_reg_write_byte(dev, ADXL345_FIFO_CTL_REG, ADXL345_FIFO_CTL_MODE_BYPASSED);
if (rc) {
return rc;
}

data->selected_range = ADXL345_RANGE_8G;
data->is_full_res = true;

Expand Down Expand Up @@ -532,9 +643,8 @@ static int adxl345_init(const struct device *dev)
* soldered. Anyway, for individual interrupt mapping, set up
* DTB bindings.
*/
uint8_t int_mask = UCHAR_MAX;

rc = adxl345_reg_assign_bits(dev, ADXL345_INT_MAP_REG, int_mask,
rc = adxl345_reg_assign_bits(dev, ADXL345_INT_MAP_REG, UCHAR_MAX,
(cfg->drdy_pad == 2));
if (rc) {
return rc;
Expand Down
21 changes: 18 additions & 3 deletions drivers/sensor/adi/adxl345/adxl345.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
#define ADXL345_READ_CMD 0x80
#define ADXL345_MULTIBYTE_FLAG 0x40

#define ADXL345_REG_READ(x) ((x & 0xFF) | ADXL345_READ_CMD)
#define ADXL345_REG_READ(x) (FIELD_GET(UCHAR_MAX, x) | ADXL345_READ_CMD)
#define ADXL345_REG_READ_MULTIBYTE(x) (ADXL345_REG_READ(x) | ADXL345_MULTIBYTE_FLAG)

#define ADXL345_FIFO_SAMPLE_SIZE 6
#define ADXL345_FIFO_ENTRIES_MSK GENMASK(5, 0) /* FIFO status entries */
Expand Down Expand Up @@ -184,6 +185,13 @@ struct adxl345_sample {
} __attribute__((__packed__));

struct adxl345_dev_data {
uint8_t cache_reg_power_ctl;
uint8_t cache_reg_int_enable;
uint8_t cache_reg_int_map;
uint8_t cache_reg_data_format;
uint8_t cache_reg_rate;
uint8_t cache_reg_fifo_ctl;
uint8_t cache_reg_act_thresh;
struct adxl345_sample sample[ADXL345_MAX_FIFO_SIZE];
uint8_t fifo_entries; /* the actual read FIFO entries */
uint8_t sample_idx; /* index counting up sample_number entries */
Expand Down Expand Up @@ -295,8 +303,11 @@ int adxl345_reg_access(const struct device *dev, uint8_t cmd, uint8_t addr,
int adxl345_reg_write(const struct device *dev, uint8_t addr, uint8_t *data,
uint8_t len);

int adxl345_reg_read(const struct device *dev, uint8_t addr, uint8_t *data,
uint8_t len);
#if defined(CONFIG_ADXL345_STREAM)
int adxl345_rtio_reg_read(const struct device *dev, uint8_t reg,
uint8_t *buf, size_t buflen, void *userdata,
rtio_callback_t cb);
#endif

int adxl345_reg_write_byte(const struct device *dev, uint8_t addr, uint8_t val);

Expand All @@ -314,4 +325,8 @@ int adxl345_configure_fifo(const struct device *dev, enum adxl345_fifo_mode mode
#ifdef CONFIG_ADXL345_STREAM
size_t adxl345_get_packet_size(const struct adxl345_dev_config *cfg);
#endif /* CONFIG_ADXL345_STREAM */

int adxl345_raw_reg_read(const struct device *dev, uint8_t addr, uint8_t *data,
uint8_t len);

#endif /* ZEPHYR_DRIVERS_SENSOR_ADX345_ADX345_H_ */
Loading