From 109c69cbab0a417c97b20788b0fd3bcd720178f1 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Mon, 20 Jul 2020 20:54:58 -0400 Subject: EN11 is actually EC11, some sample work. --- app/drivers/zephyr/ec11.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 app/drivers/zephyr/ec11.c (limited to 'app/drivers/zephyr/ec11.c') diff --git a/app/drivers/zephyr/ec11.c b/app/drivers/zephyr/ec11.c new file mode 100644 index 0000000..ef0c5c3 --- /dev/null +++ b/app/drivers/zephyr/ec11.c @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2020 Peter Johanson + * + * SPDX-License-Identifier: MIT + */ + +#define DT_DRV_COMPAT alps_ec11 + +#include +#include +#include +#include +#include +#include +#include + +#include "ec11.h" + +LOG_MODULE_REGISTER(EC11, CONFIG_SENSOR_LOG_LEVEL); + + +static int ec11_sample_fetch(struct device *dev, enum sensor_channel chan) +{ + struct ec11_data *drv_data = dev->driver_data; + const struct ec11_config *drv_cfg = dev->config_info; + u8_t val; + u8_t delta; + + __ASSERT_NO_MSG(chan == SENSOR_CHAN_ALL || chan == SENSOR_CHAN_ROTATION); + + val = (gpio_pin_get(drv_data->a, drv_cfg->a_pin) << 1) | gpio_pin_get(drv_data->b, drv_cfg->b_pin); + + LOG_DBG("prev: %d, new: %d", drv_data->ab_state, val); + + switch(val | (drv_data->ab_state << 2)) { + case 0b0001: case 0b0111: case 0b1110: + LOG_DBG("+1"); + delta = 1; + break; + default: + LOG_DBG("FIGURE IT OUT!"); + break; + } + + LOG_DBG("Delta: %d", delta); + + + // if (ec11_reg_read(drv_data, EC11_REG_TOBJ, &val) < 0) { + // return -EIO; + // } + + // if (val & EC11_DATA_INVALID_BIT) { + // return -EIO; + // } + + // drv_data->sample = arithmetic_shift_right((s16_t)val, 2); + + return 0; +} + +static int ec11_channel_get(struct device *dev, + enum sensor_channel chan, + struct sensor_value *val) +{ + struct ec11_data *drv_data = dev->driver_data; + + // s32_t uval; + + // if (chan != SENSOR_CHAN_AMBIENT_TEMP) { + // return -ENOTSUP; + // } + + // uval = (s32_t)drv_data->sample * EC11_TEMP_SCALE; + // val->val1 = uval / 1000000; + // val->val2 = uval % 1000000; + + return 0; +} + +static const struct sensor_driver_api ec11_driver_api = { +#ifdef CONFIG_EC11_TRIGGER + .trigger_set = ec11_trigger_set, +#endif + .sample_fetch = ec11_sample_fetch, + .channel_get = ec11_channel_get, +}; + +int ec11_init(struct device *dev) +{ + struct ec11_data *drv_data = dev->driver_data; + const struct ec11_config *drv_cfg = dev->config_info; + + LOG_DBG("resolution %d", drv_cfg->resolution); + + drv_data->a = device_get_binding(drv_cfg->a_label); + if (drv_data->a == NULL) { + LOG_ERR("Failed to get pointer to A GPIO device"); + return -EINVAL; + } + + drv_data->b = device_get_binding(drv_cfg->b_label); + if (drv_data->b == NULL) { + LOG_ERR("Failed to get pointer to B GPIO device"); + return -EINVAL; + } + +#ifdef CONFIG_EC11_TRIGGER + if (ec11_init_interrupt(dev) < 0) { + LOG_DBG("Failed to initialize interrupt!"); + return -EIO; + } +#endif + + return 0; +} + +struct ec11_data ec11_data; + +const struct ec11_config ec11_cfg = { + .a_label = DT_INST_GPIO_LABEL(0, a_gpios), + .a_pin = DT_INST_GPIO_PIN(0, a_gpios), + .a_flags = DT_INST_GPIO_FLAGS(0, a_gpios), + .b_label = DT_INST_GPIO_LABEL(0, b_gpios), + .b_pin = DT_INST_GPIO_PIN(0, b_gpios), + .b_flags = DT_INST_GPIO_FLAGS(0, b_gpios), + COND_CODE_0(DT_INST_NODE_HAS_PROP(0, resolution), (1), (DT_INST_PROP(0, resolution))), +}; + +DEVICE_AND_API_INIT(ec11, DT_INST_LABEL(0), ec11_init, + &ec11_data, + &ec11_cfg, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, + &ec11_driver_api); -- cgit v1.2.3 From c058757252c01b347bb432cea45e4a7bfb189738 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Mon, 20 Jul 2020 22:47:50 -0400 Subject: Fetch/get implementation work. --- app/drivers/zephyr/ec11.c | 43 +++++++++++++++++++------------------------ 1 file changed, 19 insertions(+), 24 deletions(-) (limited to 'app/drivers/zephyr/ec11.c') diff --git a/app/drivers/zephyr/ec11.c b/app/drivers/zephyr/ec11.c index ef0c5c3..3e09cd6 100644 --- a/app/drivers/zephyr/ec11.c +++ b/app/drivers/zephyr/ec11.c @@ -24,7 +24,7 @@ static int ec11_sample_fetch(struct device *dev, enum sensor_channel chan) struct ec11_data *drv_data = dev->driver_data; const struct ec11_config *drv_cfg = dev->config_info; u8_t val; - u8_t delta; + s8_t delta; __ASSERT_NO_MSG(chan == SENSOR_CHAN_ALL || chan == SENSOR_CHAN_ROTATION); @@ -33,28 +33,26 @@ static int ec11_sample_fetch(struct device *dev, enum sensor_channel chan) LOG_DBG("prev: %d, new: %d", drv_data->ab_state, val); switch(val | (drv_data->ab_state << 2)) { - case 0b0001: case 0b0111: case 0b1110: - LOG_DBG("+1"); + case 0b0001: case 0b0111: case 0b1110: case 0b1000: delta = 1; break; + case 0b0010: case 0b0100: case 0b1101: case 0b1011: + delta = -1; + break; default: - LOG_DBG("FIGURE IT OUT!"); + delta = 0; break; } LOG_DBG("Delta: %d", delta); + drv_data->pulses += delta; + drv_data->ab_state = val; - // if (ec11_reg_read(drv_data, EC11_REG_TOBJ, &val) < 0) { - // return -EIO; - // } - - // if (val & EC11_DATA_INVALID_BIT) { - // return -EIO; - // } - - // drv_data->sample = arithmetic_shift_right((s16_t)val, 2); - + drv_data->ticks = drv_data->pulses / drv_cfg->resolution; + drv_data->delta = delta; + drv_data->pulses %= drv_cfg->resolution; + return 0; } @@ -63,17 +61,14 @@ static int ec11_channel_get(struct device *dev, struct sensor_value *val) { struct ec11_data *drv_data = dev->driver_data; + + if (chan != SENSOR_CHAN_ROTATION) { + return -ENOTSUP; + } - // s32_t uval; - - // if (chan != SENSOR_CHAN_AMBIENT_TEMP) { - // return -ENOTSUP; - // } - - // uval = (s32_t)drv_data->sample * EC11_TEMP_SCALE; - // val->val1 = uval / 1000000; - // val->val2 = uval % 1000000; - + val->val1 = drv_data->ticks; + val->val2 = drv_data->delta; + return 0; } -- cgit v1.2.3 From 7da9a1039f453d549318737d85603a7a8c87b1d9 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 21 Jul 2020 13:16:15 -0400 Subject: Working encoder detection. --- app/drivers/zephyr/ec11.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'app/drivers/zephyr/ec11.c') diff --git a/app/drivers/zephyr/ec11.c b/app/drivers/zephyr/ec11.c index 3e09cd6..74c8f9b 100644 --- a/app/drivers/zephyr/ec11.c +++ b/app/drivers/zephyr/ec11.c @@ -18,6 +18,13 @@ LOG_MODULE_REGISTER(EC11, CONFIG_SENSOR_LOG_LEVEL); +static int ec11_get_ab_state(struct device *dev) +{ + struct ec11_data *drv_data = dev->driver_data; + const struct ec11_config *drv_cfg = dev->config_info; + + return (gpio_pin_get(drv_data->a, drv_cfg->a_pin) << 1) | gpio_pin_get(drv_data->b, drv_cfg->b_pin); +} static int ec11_sample_fetch(struct device *dev, enum sensor_channel chan) { @@ -28,15 +35,15 @@ static int ec11_sample_fetch(struct device *dev, enum sensor_channel chan) __ASSERT_NO_MSG(chan == SENSOR_CHAN_ALL || chan == SENSOR_CHAN_ROTATION); - val = (gpio_pin_get(drv_data->a, drv_cfg->a_pin) << 1) | gpio_pin_get(drv_data->b, drv_cfg->b_pin); + val = ec11_get_ab_state(dev); LOG_DBG("prev: %d, new: %d", drv_data->ab_state, val); switch(val | (drv_data->ab_state << 2)) { - case 0b0001: case 0b0111: case 0b1110: case 0b1000: + case 0b0010: case 0b0100: case 0b1101: case 0b1011: delta = 1; break; - case 0b0010: case 0b0100: case 0b1101: case 0b1011: + case 0b0001: case 0b0111: case 0b1110: case 0b1000: delta = -1; break; default: @@ -106,6 +113,8 @@ int ec11_init(struct device *dev) } #endif + drv_data->ab_state = ec11_get_ab_state(dev); + return 0; } -- cgit v1.2.3 From ac9ba3ae7d6db496ba7ddccf434804cfebfa6dab Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 21 Jul 2020 13:29:21 -0400 Subject: Code cleanup for non-trigger mode. --- app/drivers/zephyr/ec11.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'app/drivers/zephyr/ec11.c') diff --git a/app/drivers/zephyr/ec11.c b/app/drivers/zephyr/ec11.c index 74c8f9b..9d724d5 100644 --- a/app/drivers/zephyr/ec11.c +++ b/app/drivers/zephyr/ec11.c @@ -92,7 +92,7 @@ int ec11_init(struct device *dev) struct ec11_data *drv_data = dev->driver_data; const struct ec11_config *drv_cfg = dev->config_info; - LOG_DBG("resolution %d", drv_cfg->resolution); + LOG_DBG("A: %s %d B: %s %d resolution %d", drv_cfg->a_label, drv_cfg->a_pin, drv_cfg->b_label, drv_cfg->b_pin, drv_cfg->resolution); drv_data->a = device_get_binding(drv_cfg->a_label); if (drv_data->a == NULL) { @@ -106,6 +106,22 @@ int ec11_init(struct device *dev) return -EINVAL; } + if (gpio_pin_configure(drv_data->a, drv_cfg->a_pin, + drv_cfg->a_flags + | GPIO_INPUT)) { + LOG_DBG("Failed to configure A pin"); + return -EIO; + } + + if (gpio_pin_configure(drv_data->b, drv_cfg->b_pin, + drv_cfg->b_flags + | GPIO_INPUT)) { + LOG_DBG("Failed to configure B pin"); + return -EIO; + } + + + #ifdef CONFIG_EC11_TRIGGER if (ec11_init_interrupt(dev) < 0) { LOG_DBG("Failed to initialize interrupt!"); -- cgit v1.2.3 From c619d36294374ffea018090938d3613454fe3aae Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 21 Jul 2020 13:37:02 -0400 Subject: Support multiple instances of the encoder. --- app/drivers/zephyr/ec11.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) (limited to 'app/drivers/zephyr/ec11.c') diff --git a/app/drivers/zephyr/ec11.c b/app/drivers/zephyr/ec11.c index 9d724d5..357c572 100644 --- a/app/drivers/zephyr/ec11.c +++ b/app/drivers/zephyr/ec11.c @@ -134,19 +134,20 @@ int ec11_init(struct device *dev) return 0; } -struct ec11_data ec11_data; - -const struct ec11_config ec11_cfg = { - .a_label = DT_INST_GPIO_LABEL(0, a_gpios), - .a_pin = DT_INST_GPIO_PIN(0, a_gpios), - .a_flags = DT_INST_GPIO_FLAGS(0, a_gpios), - .b_label = DT_INST_GPIO_LABEL(0, b_gpios), - .b_pin = DT_INST_GPIO_PIN(0, b_gpios), - .b_flags = DT_INST_GPIO_FLAGS(0, b_gpios), - COND_CODE_0(DT_INST_NODE_HAS_PROP(0, resolution), (1), (DT_INST_PROP(0, resolution))), -}; - -DEVICE_AND_API_INIT(ec11, DT_INST_LABEL(0), ec11_init, - &ec11_data, - &ec11_cfg, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, - &ec11_driver_api); +#define EC11_INST(n) \ + struct ec11_data ec11_data_##n; \ + const struct ec11_config ec11_cfg_##n = { \ + .a_label = DT_INST_GPIO_LABEL(n, a_gpios), \ + .a_pin = DT_INST_GPIO_PIN(n, a_gpios), \ + .a_flags = DT_INST_GPIO_FLAGS(n, a_gpios), \ + .b_label = DT_INST_GPIO_LABEL(n, b_gpios), \ + .b_pin = DT_INST_GPIO_PIN(n, b_gpios), \ + .b_flags = DT_INST_GPIO_FLAGS(n, b_gpios), \ + COND_CODE_0(DT_INST_NODE_HAS_PROP(n, resolution), (1), (DT_INST_PROP(n, resolution))), \ + }; \ + DEVICE_AND_API_INIT(ec11, DT_INST_LABEL(n), ec11_init, \ + &ec11_data_##n, \ + &ec11_cfg_##n, POST_KERNEL, CONFIG_SENSOR_INIT_PRIORITY, \ + &ec11_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(EC11_INST) \ No newline at end of file -- cgit v1.2.3 From f3267e6030822abc594aadd4264508607dc5bb69 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Tue, 21 Jul 2020 13:52:03 -0400 Subject: Tweaks for orientation and A/B pins for Kyria left --- app/drivers/zephyr/ec11.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/drivers/zephyr/ec11.c') diff --git a/app/drivers/zephyr/ec11.c b/app/drivers/zephyr/ec11.c index 357c572..1bc5d6a 100644 --- a/app/drivers/zephyr/ec11.c +++ b/app/drivers/zephyr/ec11.c @@ -41,10 +41,10 @@ static int ec11_sample_fetch(struct device *dev, enum sensor_channel chan) switch(val | (drv_data->ab_state << 2)) { case 0b0010: case 0b0100: case 0b1101: case 0b1011: - delta = 1; + delta = -1; break; case 0b0001: case 0b0111: case 0b1110: case 0b1000: - delta = -1; + delta = 1; break; default: delta = 0; -- cgit v1.2.3