From 277524ab6b5e699ecf347a9fd9cf60e4140e6111 Mon Sep 17 00:00:00 2001 From: Pieter De Gendt Date: Wed, 7 Sep 2022 15:12:56 +0200 Subject: [PATCH 1/4] drivers: sensor: lis2dh: Configurable latch and mode for any movement Add 2 properties to configure the "any movement" event. * Ability to disable the interrupt latch * Select movement mode Signed-off-by: Pieter De Gendt --- drivers/sensor/lis2dh/lis2dh.c | 22 ++++++++--- drivers/sensor/lis2dh/lis2dh.h | 6 ++- drivers/sensor/lis2dh/lis2dh_trigger.c | 46 ++++++++++++----------- dts/bindings/sensor/st,lis2dh-common.yaml | 24 ++++++++++++ 4 files changed, 70 insertions(+), 28 deletions(-) diff --git a/drivers/sensor/lis2dh/lis2dh.c b/drivers/sensor/lis2dh/lis2dh.c index aaf2d9952f301..6fd0210e10d8a 100644 --- a/drivers/sensor/lis2dh/lis2dh.c +++ b/drivers/sensor/lis2dh/lis2dh.c @@ -496,6 +496,12 @@ static int lis2dh_pm_action(const struct device *dev, #define ANYM_ON_INT1(inst) \ DT_INST_PROP(inst, anym_on_int1) +#define ANYM_LATCH(inst) \ + !DT_INST_PROP(inst, anym_no_latch) + +#define ANYM_MODE(inst) \ + DT_INST_PROP(inst, anym_mode) + #ifdef CONFIG_LIS2DH_TRIGGER #define GPIO_DT_SPEC_INST_GET_BY_IDX_COND(id, prop, idx) \ COND_CODE_1(DT_INST_PROP_HAS_IDX(id, prop, idx), \ @@ -548,9 +554,11 @@ static int lis2dh_pm_action(const struct device *dev, SPI_MODE_CPOL | \ SPI_MODE_CPHA, \ 0) }, \ - .hw = { .is_lsm303agr_dev = IS_LSM303AGR_DEV(inst), \ - .disc_pull_up = DISC_PULL_UP(inst), \ - .anym_on_int1 = ANYM_ON_INT1(inst), }, \ + .hw = { .is_lsm303agr_dev = IS_LSM303AGR_DEV(inst), \ + .disc_pull_up = DISC_PULL_UP(inst), \ + .anym_on_int1 = ANYM_ON_INT1(inst), \ + .anym_latch = ANYM_LATCH(inst), \ + .anym_mode = ANYM_MODE(inst), }, \ LIS2DH_CFG_TEMPERATURE(inst) \ LIS2DH_CFG_INT(inst) \ } @@ -569,9 +577,11 @@ static int lis2dh_pm_action(const struct device *dev, { \ .bus_init = lis2dh_i2c_init, \ .bus_cfg = { .i2c = I2C_DT_SPEC_INST_GET(inst), }, \ - .hw = { .is_lsm303agr_dev = IS_LSM303AGR_DEV(inst), \ - .disc_pull_up = DISC_PULL_UP(inst), \ - .anym_on_int1 = ANYM_ON_INT1(inst), }, \ + .hw = { .is_lsm303agr_dev = IS_LSM303AGR_DEV(inst), \ + .disc_pull_up = DISC_PULL_UP(inst), \ + .anym_on_int1 = ANYM_ON_INT1(inst), \ + .anym_latch = ANYM_LATCH(inst), \ + .anym_mode = ANYM_MODE(inst), }, \ LIS2DH_CFG_TEMPERATURE(inst) \ LIS2DH_CFG_INT(inst) \ } diff --git a/drivers/sensor/lis2dh/lis2dh.h b/drivers/sensor/lis2dh/lis2dh.h index cb4f12d216ef3..f951e7ca92dcf 100644 --- a/drivers/sensor/lis2dh/lis2dh.h +++ b/drivers/sensor/lis2dh/lis2dh.h @@ -159,7 +159,9 @@ #define LIS2DH_REG_INT2_THS 0x36 #define LIS2DH_REG_INT2_DUR 0x37 -#define LIS2DH_AOI_CFG BIT(7) +#define LIS2DH_INT_CFG_MODE_SHIFT 6 +#define LIS2DH_INT_CFG_AOI_CFG BIT(LIS2DH_INT_CFG_MODE_SHIFT + 1) +#define LIS2DH_INT_CFG_6D_CFG BIT(LIS2DH_INT_CFG_MODE_SHIFT) #define LIS2DH_INT_CFG_ZHIE_ZUPE BIT(5) #define LIS2DH_INT_CFG_ZLIE_ZDOWNE BIT(4) #define LIS2DH_INT_CFG_YHIE_YUPE BIT(3) @@ -208,6 +210,8 @@ struct lis2dh_config { bool is_lsm303agr_dev : 1; bool disc_pull_up : 1; bool anym_on_int1 : 1; + bool anym_latch : 1; + uint8_t anym_mode : 2; } hw; #ifdef CONFIG_LIS2DH_MEASURE_TEMPERATURE const struct temperature temperature; diff --git a/drivers/sensor/lis2dh/lis2dh_trigger.c b/drivers/sensor/lis2dh/lis2dh_trigger.c index fd422d607dec6..219ee33baa3cc 100644 --- a/drivers/sensor/lis2dh/lis2dh_trigger.c +++ b/drivers/sensor/lis2dh/lis2dh_trigger.c @@ -187,7 +187,7 @@ static int lis2dh_start_trigger_int2(const struct device *dev) return lis2dh->hw_tf->write_reg( dev, cfg->hw.anym_on_int1 ? LIS2DH_REG_INT1_CFG : LIS2DH_REG_INT2_CFG, - LIS2DH_ANYM_CFG); + (cfg->hw.anym_mode << LIS2DH_INT_CFG_MODE_SHIFT) | LIS2DH_ANYM_CFG); } int lis2dh_trigger_set(const struct device *dev, @@ -275,7 +275,7 @@ static void lis2dh_gpio_int1_callback(const struct device *dev, atomic_set_bit(&lis2dh->trig_flags, TRIGGED_INT1); - /* int is level triggered so disable until we clear it */ + /* int is level triggered so disable until processed */ setup_int1(lis2dh->dev, false); #if defined(CONFIG_LIS2DH_TRIGGER_OWN_THREAD) @@ -295,7 +295,7 @@ static void lis2dh_gpio_int2_callback(const struct device *dev, atomic_set_bit(&lis2dh->trig_flags, TRIGGED_INT2); - /* int is level triggered so disable until we clear it */ + /* int is level triggered so disable until processed */ setup_int2(lis2dh->dev, false); #if defined(CONFIG_LIS2DH_TRIGGER_OWN_THREAD) @@ -365,15 +365,17 @@ static void lis2dh_thread_cb(const struct device *dev) }; uint8_t reg_val; - /* clear interrupt to de-assert int line */ - status = lis2dh->hw_tf->read_reg(dev, - cfg->hw.anym_on_int1 ? - LIS2DH_REG_INT1_SRC : - LIS2DH_REG_INT2_SRC, - ®_val); - if (status < 0) { - LOG_ERR("clearing interrupt 2 failed: %d", status); - return; + if (cfg->hw.anym_latch) { + /* clear interrupt to de-assert int line */ + status = lis2dh->hw_tf->read_reg(dev, + cfg->hw.anym_on_int1 ? + LIS2DH_REG_INT1_SRC : + LIS2DH_REG_INT2_SRC, + ®_val); + if (status < 0) { + LOG_ERR("clearing interrupt 2 failed: %d", status); + return; + } } if (likely(lis2dh->handler_anymotion != NULL)) { @@ -538,23 +540,25 @@ int lis2dh_init_interrupt(const struct device *dev) status = lis2dh->hw_tf->update_reg(dev, LIS2DH_REG_CTRL3, LIS2DH_EN_INT1_INT1, LIS2DH_EN_INT1_INT1); - - /* latch int1 line interrupt */ - status = lis2dh->hw_tf->write_reg(dev, LIS2DH_REG_CTRL5, - LIS2DH_EN_LIR_INT1); + if (cfg->hw.anym_latch) { + /* latch int1 line interrupt */ + status = lis2dh->hw_tf->write_reg(dev, LIS2DH_REG_CTRL5, + LIS2DH_EN_LIR_INT1); + } } else { /* enable interrupt 2 on int2 line */ status = lis2dh->hw_tf->update_reg(dev, LIS2DH_REG_CTRL6, LIS2DH_EN_INT2_INT2, LIS2DH_EN_INT2_INT2); - - /* latch int2 line interrupt */ - status = lis2dh->hw_tf->write_reg(dev, LIS2DH_REG_CTRL5, - LIS2DH_EN_LIR_INT2); + if (cfg->hw.anym_latch) { + /* latch int2 line interrupt */ + status = lis2dh->hw_tf->write_reg(dev, LIS2DH_REG_CTRL5, + LIS2DH_EN_LIR_INT2); + } } if (status < 0) { - LOG_ERR("latch enable reg write failed (%d)", status); + LOG_ERR("enable reg write failed (%d)", status); return status; } diff --git a/dts/bindings/sensor/st,lis2dh-common.yaml b/dts/bindings/sensor/st,lis2dh-common.yaml index 23c970ca5aa84..dbad97aadfa7c 100644 --- a/dts/bindings/sensor/st,lis2dh-common.yaml +++ b/dts/bindings/sensor/st,lis2dh-common.yaml @@ -25,3 +25,27 @@ properties: Indicates that the device driver should use interrupt 1 for any movement. This is for boards that only have one interrupt line connected from the sensor to the processor. + + anym-no-latch: + type: boolean + description: | + Disable the latching of interrupts for any movement. + + anym-mode: + type: int + required: false + default: 0 + description: | + Select the interrupt mode for any movement. + + 0 = OR combination of interrupt events + 1 = 6D movement recognition + 2 = AND combination of interrupt events + 3 = 6D position recognition + + The default of 0 is the power-on-reset value. + enum: + - 0 + - 1 + - 2 + - 3 From 8ca3045485ba35a0a72e933912ea4df248b3f02a Mon Sep 17 00:00:00 2001 From: Pieter De Gendt Date: Wed, 14 Sep 2022 09:13:16 +0200 Subject: [PATCH 2/4] dts: bindings: sensor: st,lis2dh cleanup boolean properties Remove 'required: false' for boolean properties. Signed-off-by: Pieter De Gendt --- dts/bindings/sensor/st,lis2dh-common.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/dts/bindings/sensor/st,lis2dh-common.yaml b/dts/bindings/sensor/st,lis2dh-common.yaml index dbad97aadfa7c..2ab76605b60b3 100644 --- a/dts/bindings/sensor/st,lis2dh-common.yaml +++ b/dts/bindings/sensor/st,lis2dh-common.yaml @@ -11,7 +11,6 @@ properties: disconnect-sdo-sa0-pull-up: type: boolean - required: false description: | Indicates the device driver should disconnect SDO/SA0 pull-up during device initialization (e.g. to save current @@ -20,7 +19,6 @@ properties: anym-on-int1: type: boolean - required: false description: | Indicates that the device driver should use interrupt 1 for any movement. This is for boards that only have one From 661fc78d38fec4935f4238f124d5cd0264ead4e0 Mon Sep 17 00:00:00 2001 From: Pieter De Gendt Date: Wed, 14 Sep 2022 09:17:06 +0200 Subject: [PATCH 3/4] dts: bindings: sensor: st,lis2dw12 cleanup boolean properties Remove 'required: false' for boolean properties. Signed-off-by: Pieter De Gendt --- dts/bindings/sensor/st,lis2dw12-common.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/dts/bindings/sensor/st,lis2dw12-common.yaml b/dts/bindings/sensor/st,lis2dw12-common.yaml index 9c149d390bcb6..1f3a84549aa87 100644 --- a/dts/bindings/sensor/st,lis2dw12-common.yaml +++ b/dts/bindings/sensor/st,lis2dw12-common.yaml @@ -159,7 +159,6 @@ properties: low-noise: type: boolean - required: false description: | Enables the LOW_NOISE flag in the CTRL6 register. This influences the noise density and the current consumption. @@ -167,7 +166,6 @@ properties: hp-filter-path: type: boolean - required: false description: | Sets the Filtered Data Selection bit in the CTRL6 register. When enabled, the high-pass filter path is selected. @@ -177,7 +175,6 @@ properties: hp-ref-mode: type: boolean - required: false description: | Enables the high-pass filter reference mode in the CTRL7 register. When the high-pass filter is configured in reference mode, @@ -190,7 +187,6 @@ properties: drdy-pulsed: type: boolean - required: false description: | Selects the pulsed mode for data-ready interrupt when enabled, and the latched mode when disabled. From 9f716d33ac30ed310543ead72d9dabfc5e186898 Mon Sep 17 00:00:00 2001 From: Pieter De Gendt Date: Wed, 14 Sep 2022 09:17:37 +0200 Subject: [PATCH 4/4] dts: bindings: sensor: st,lis2mdl cleanup boolean properties Remove 'required: false' for boolean properties. Signed-off-by: Pieter De Gendt --- dts/bindings/sensor/st,lis2mdl-common.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/dts/bindings/sensor/st,lis2mdl-common.yaml b/dts/bindings/sensor/st,lis2mdl-common.yaml index 89125cdead28d..61c0909f72c31 100644 --- a/dts/bindings/sensor/st,lis2mdl-common.yaml +++ b/dts/bindings/sensor/st,lis2mdl-common.yaml @@ -13,20 +13,17 @@ properties: single-mode: type: boolean - required: false description: | Set to config the sensor in single measurement mode. Leave unset to configure the sensor in continious measurement mode. cancel-offset: type: boolean - required: false description: | Set to enable the offset cancellation. Otherwise it would be disabled as default. spi-full-duplex: type: boolean - required: false description: | Enable SPI 4wires mode with separated MISO and MOSI lines