From: Jonathan Cameron <jic23@kernel.org>
To: Lothar Rubusch <l.rubusch@gmail.com>
Cc: lars@metafoo.de, Michael.Hennerich@analog.com,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
eraretuya@gmail.com
Subject: Re: [PATCH v2 13/14] iio: accel: adxl345: add coupling detection for activity/inactivity
Date: Sun, 16 Feb 2025 17:54:27 +0000 [thread overview]
Message-ID: <20250216175427.70cc3be1@jic23-huawei> (raw)
In-Reply-To: <20250210110119.260858-14-l.rubusch@gmail.com>
On Mon, 10 Feb 2025 11:01:18 +0000
Lothar Rubusch <l.rubusch@gmail.com> wrote:
> Add coupling activity/inactivity detection by the AC/DC bit. This is an
> addititional enhancement for the detection of activity states and
> completes the activity / inactivity feature of the ADXL345.
Give a little more info here. This is a somewhat unusual feature.
The AC description is odd terminology as it is really about
referencing to when the event is enabled, nothing is alternating.
The activity one is fairly simple. The inactivity seems not.
I'm not entirely sure what the value used as reference is:
"Similarly, in ac-coupled operation for inactivity detection,
a reference value is used for comparison and is updated whenever
the device exceeds the inactivity threshold. After the reference
value is selected, the device compares the magnitude of the
difference between the reference value and the current acceleration
with THRESH_INACT. If the difference is less than the value in
THRESH_INACT for the time in TIME_INACT, the device is considered
inactive and the inactivity interrupt is triggered."
What is it updated to? Is it updated to effectively the maximum
activity value? Or just a snap shot of whatever triggered the
inactivity be left (so takes into account which axis the
activity occurred on.)
I've no idea.
The definition we have for mag referenced is vague enough
to incorporate this so not a problem if we can't figure out
exactly what it is!
Jonathan
>
> Signed-off-by: Lothar Rubusch <l.rubusch@gmail.com>
> ---
> drivers/iio/accel/adxl345_core.c | 77 ++++++++++++++++++++++++++++++++
> 1 file changed, 77 insertions(+)
>
> diff --git a/drivers/iio/accel/adxl345_core.c b/drivers/iio/accel/adxl345_core.c
> index 7de869fac799..411ae7bf6b97 100644
> --- a/drivers/iio/accel/adxl345_core.c
> +++ b/drivers/iio/accel/adxl345_core.c
> @@ -36,7 +36,9 @@
> #define ADXL345_REG_TAP_AXIS_MSK GENMASK(2, 0)
> #define ADXL345_REG_TAP_SUPPRESS_MSK BIT(3)
> #define ADXL345_REG_ACT_AXIS_MSK GENMASK(6, 4)
> +#define ADXL345_REG_ACT_ACDC_MSK BIT(7)
> #define ADXL345_REG_INACT_AXIS_MSK GENMASK(2, 0)
> +#define ADXL345_REG_INACT_ACDC_MSK BIT(3)
> #define ADXL345_POWER_CTL_INACT_MSK (ADXL345_POWER_CTL_AUTO_SLEEP | ADXL345_POWER_CTL_LINK)
>
> enum adxl345_axis {
> @@ -86,6 +88,11 @@ static const unsigned int adxl345_act_thresh_reg[2] = {
> [ADXL345_INACTIVITY] = ADXL345_REG_THRESH_INACT,
> };
>
> +static const unsigned int adxl345_act_acdc_msk[2] = {
> + [ADXL345_ACTIVITY] = ADXL345_REG_ACT_ACDC_MSK,
> + [ADXL345_INACTIVITY] = ADXL345_REG_INACT_ACDC_MSK,
> +};
> +
> static const unsigned int adxl345_act_axis_msk[2] = {
> [ADXL345_ACTIVITY] = ADXL345_REG_ACT_AXIS_MSK,
> [ADXL345_INACTIVITY] = ADXL345_REG_INACT_AXIS_MSK,
> @@ -178,9 +185,11 @@ struct adxl345_state {
> enum adxl345_range range;
>
> u32 act_axis_ctrl;
> + bool act_ac;
> u8 act_threshold;
>
> u32 inact_axis_ctrl;
> + bool inact_ac;
> u8 inact_threshold;
> u8 inact_time_s;
>
> @@ -237,6 +246,18 @@ static struct iio_event_spec adxl345_events[] = {
> BIT(IIO_EV_INFO_VALUE) |
> BIT(IIO_EV_INFO_PERIOD),
> },
> + {
> + /* activity, activity - ac bit */
> + .type = IIO_EV_TYPE_MAG_REFERENCED,
> + .dir = IIO_EV_DIR_RISING,
> + .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE),
> + },
> + {
> + /* activity, inactivity - ac bit */
> + .type = IIO_EV_TYPE_MAG_REFERENCED,
> + .dir = IIO_EV_DIR_FALLING,
> + .mask_shared_by_type = BIT(IIO_EV_INFO_ENABLE),
> + },
> };
>
> #define ADXL345_CHANNEL(index, reg, axis) { \
> @@ -334,6 +355,35 @@ static int adxl345_write_act_axis(struct adxl345_state *st,
> return 0;
> }
>
> +static int adxl345_is_act_inact_ac(struct adxl345_state *st,
> + enum adxl345_activity_type type, bool *ac)
> +{
> + if (type == ADXL345_ACTIVITY)
> + *ac = st->act_ac;
> + else
> + *ac = st->inact_ac;
> +
> + return 0;
> +}
> +
> +static int adxl345_set_act_inact_ac(struct adxl345_state *st,
> + enum adxl345_activity_type type, bool ac)
> +{
> + int ret;
> +
> + ret = regmap_update_bits(st->regmap, ADXL345_REG_ACT_INACT_CTRL,
> + adxl345_act_acdc_msk[type], ac);
> + if (ret)
> + return ret;
> +
> + if (type == ADXL345_ACTIVITY)
> + st->act_ac = ac;
> + else
> + st->inact_ac = ac;
> +
> + return 0;
> +}
> +
> static int adxl345_is_act_inact_en(struct adxl345_state *st,
> enum adxl345_activity_type type, bool *en)
> {
> @@ -959,6 +1009,21 @@ static int adxl345_read_event_config(struct iio_dev *indio_dev,
> if (ret)
> return ret;
> return int_en;
> + case IIO_EV_TYPE_MAG_REFERENCED:
> + switch (dir) {
> + case IIO_EV_DIR_RISING:
> + ret = adxl345_is_act_inact_ac(st, ADXL345_ACTIVITY, &int_en);
> + if (ret)
> + return ret;
> + return int_en;
> + case IIO_EV_DIR_FALLING:
> + ret = adxl345_is_act_inact_ac(st, ADXL345_INACTIVITY, &int_en);
> + if (ret)
> + return ret;
> + return int_en;
> + default:
> + return -EINVAL;
> + }
> default:
> return -EINVAL;
> }
> @@ -1008,6 +1073,16 @@ static int adxl345_write_event_config(struct iio_dev *indio_dev,
> }
> case IIO_EV_TYPE_MAG:
> return adxl345_set_ff_en(st, state);
> + case IIO_EV_TYPE_MAG_REFERENCED:
> + switch (dir) {
> + case IIO_EV_DIR_RISING:
> + return adxl345_set_act_inact_ac(st, ADXL345_ACTIVITY, state);
> + case IIO_EV_DIR_FALLING:
> + return adxl345_set_act_inact_ac(st, ADXL345_INACTIVITY, state);
> + default:
> + return -EINVAL;
> + }
> +
> default:
> return -EINVAL;
> }
> @@ -1619,6 +1694,8 @@ int adxl345_core_probe(struct device *dev, struct regmap *regmap,
> */
> st->act_axis_ctrl = ADXL345_REG_ACT_AXIS_MSK;
> st->inact_axis_ctrl = ADXL345_REG_INACT_AXIS_MSK;
> + st->inact_ac = 0; /* 0 [dc] */
> + st->act_ac = 0;
> st->int_map = 0x00; /* reset interrupts */
>
> /* Init with reasonable values */
next prev parent reply other threads:[~2025-02-16 17:54 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-10 11:01 [PATCH v2 00/14] iio: accel: adxl345: add interrupt based sensor events Lothar Rubusch
2025-02-10 11:01 ` [PATCH v2 01/14] iio: accel: adxl345: reorganize measurement enable Lothar Rubusch
2025-02-10 11:01 ` [PATCH v2 02/14] iio: accel: adxl345: add debug register access Lothar Rubusch
2025-02-10 11:01 ` [PATCH v2 03/14] iio: accel: adxl345: reorganize irq handler Lothar Rubusch
2025-02-16 17:05 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 04/14] iio: accel: adxl345: refac set_interrupts and IRQ map Lothar Rubusch
2025-02-16 17:11 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 05/14] iio: accel: adxl345: add single tap feature Lothar Rubusch
2025-02-16 17:20 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 06/14] iio: accel: adxl345: add double " Lothar Rubusch
2025-02-16 17:23 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 07/14] iio: accel: adxl345: add double tap suppress bit Lothar Rubusch
2025-02-16 17:28 ` Jonathan Cameron
2025-02-18 22:29 ` Lothar Rubusch
2025-02-20 17:47 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 08/14] iio: accel: adxl345: add freefall feature Lothar Rubusch
2025-02-16 17:33 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 09/14] iio: accel: adxl345: extend sample frequency adjustments Lothar Rubusch
2025-02-16 17:38 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 10/14] iio: accel: adxl345: add g-range configuration Lothar Rubusch
2025-02-16 17:41 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 11/14] iio: accel: adxl345: add activity event feature Lothar Rubusch
2025-02-16 17:43 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 12/14] iio: accel: adxl345: add inactivity feature Lothar Rubusch
2025-02-16 17:47 ` Jonathan Cameron
2025-02-10 11:01 ` [PATCH v2 13/14] iio: accel: adxl345: add coupling detection for activity/inactivity Lothar Rubusch
2025-02-16 17:54 ` Jonathan Cameron [this message]
2025-02-10 11:01 ` [PATCH v2 14/14] docs: iio: add documentation for adxl345 driver Lothar Rubusch
2025-02-16 18:00 ` Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250216175427.70cc3be1@jic23-huawei \
--to=jic23@kernel.org \
--cc=Michael.Hennerich@analog.com \
--cc=eraretuya@gmail.com \
--cc=l.rubusch@gmail.com \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox