drivers: sensor: qdec_stm32: add optional encoder mode

Add support for setting encoder mode in dts.

Signed-off-by: Jeppe Odgaard <jeppe.odgaard@prevas.dk>
This commit is contained in:
Jeppe Odgaard 2024-03-13 20:30:53 +01:00 committed by Maureen Helm
parent 06a4d4b02f
commit 2a5dc2a0df
2 changed files with 35 additions and 0 deletions

View file

@ -30,6 +30,7 @@ struct qdec_stm32_dev_cfg {
const struct pinctrl_dev_config *pin_config;
struct stm32_pclken pclken;
TIM_TypeDef *timer_inst;
uint32_t encoder_mode;
bool is_input_polarity_inverted;
uint8_t input_filtering_level;
uint32_t counts_per_revolution;
@ -107,6 +108,8 @@ static int qdec_stm32_initialize(const struct device *dev)
LL_TIM_ENCODER_StructInit(&init_props);
init_props.EncoderMode = dev_cfg->encoder_mode;
if (dev_cfg->is_input_polarity_inverted) {
init_props.IC1Polarity = LL_TIM_IC_POLARITY_FALLING;
init_props.IC2Polarity = LL_TIM_IC_POLARITY_FALLING;
@ -139,12 +142,16 @@ static const struct sensor_driver_api qdec_stm32_driver_api = {
};
#define QDEC_STM32_INIT(n) \
BUILD_ASSERT(!(DT_INST_PROP(n, st_encoder_mode) & ~TIM_SMCR_SMS), \
"Encoder mode is not supported by this MCU"); \
\
PINCTRL_DT_INST_DEFINE(n); \
static const struct qdec_stm32_dev_cfg qdec##n##_stm32_config = { \
.pin_config = PINCTRL_DT_INST_DEV_CONFIG_GET(n), \
.timer_inst = ((TIM_TypeDef *)DT_REG_ADDR(DT_INST_PARENT(n))), \
.pclken = {.bus = DT_CLOCKS_CELL(DT_INST_PARENT(n), bus), \
.enr = DT_CLOCKS_CELL(DT_INST_PARENT(n), bits)}, \
.encoder_mode = DT_INST_PROP(n, st_encoder_mode), \
.is_input_polarity_inverted = DT_INST_PROP(n, st_input_polarity_inverted), \
.input_filtering_level = DT_INST_PROP(n, st_input_filter_level), \
.counts_per_revolution = DT_INST_PROP(n, st_counts_per_revolution), \

View file

@ -16,6 +16,34 @@ properties:
pinctrl-names:
required: true
st,encoder-mode:
type: int
description: |
Set encoder mode.
The following modes are supported:
0x1: Encoder mode 1 (Default)
0x2: Encoder mode 2
0x3: Encoder mode 3
Some MCUs supports additional modes:
0x10002: Encoder mode: Clock plus direction, x2 mode
0x10003: Encoder mode: Clock plus direction, x1 mode
0x10004: Encoder mode: Directional Clock, x2 mode
0x10005: Encoder mode: Directional Clock, x1 mode
0x10006: Quadrature encoder mode: x1 mode, counting on tim_ti1fp1
0x10007: Quadrature encoder mode: x1 mode, counting on tim_ti2fp2
Default value complies with stm32 low level timer encoder init value.
default: 0x1
enum:
- 0x1
- 0x2
- 0x3
- 0x10002
- 0x10003
- 0x10004
- 0x10005
- 0x10006
- 0x10007
st,input-polarity-inverted:
type: boolean
description: Encoder is triggered by a falling edge on the input pin