From 049944529fe8bda17235c0185b0a6ac1b8ae7598 Mon Sep 17 00:00:00 2001 From: "chenchaoqun@rt-thread.com" Date: Mon, 19 Nov 2018 19:04:44 +0800 Subject: [add] adc framework --- components/drivers/misc/SConscript | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'components/drivers/misc/SConscript') diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript index 4cc5f80084..c45ba524c5 100644 --- a/components/drivers/misc/SConscript +++ b/components/drivers/misc/SConscript @@ -7,7 +7,10 @@ group = [] if GetDepend(['RT_USING_PIN']): src = src + ['pin.c'] - + +if GetDepend(['RT_USING_ADC']): + src = src + ['adc.c'] + if GetDepend(['RT_USING_PWM']): src = src + ['rt_drv_pwm.c'] -- cgit v1.3.1 From cc565da5a178d598d35cc9b7d4a1a36be5fb17f5 Mon Sep 17 00:00:00 2001 From: tangweikang Date: Fri, 9 Aug 2019 18:37:16 +0800 Subject: [components][drivers] add encoder driven framework --- components/drivers/Kconfig | 4 + components/drivers/include/drivers/encoder.h | 65 +++++++++++++ components/drivers/include/rtdevice.h | 4 + components/drivers/misc/SConscript | 3 + components/drivers/misc/encoder.c | 135 +++++++++++++++++++++++++++ 5 files changed, 211 insertions(+) create mode 100644 components/drivers/include/drivers/encoder.h create mode 100644 components/drivers/misc/encoder.c (limited to 'components/drivers/misc/SConscript') diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig index 250d661e9f..ff2639b8fa 100755 --- a/components/drivers/Kconfig +++ b/components/drivers/Kconfig @@ -434,6 +434,10 @@ menuconfig RT_USING_HWCRYPTO endif endif +config RT_USING_ENCODER + bool "Using ENCODER device drivers" + default n + menuconfig RT_USING_WIFI bool "Using Wi-Fi framework" default n diff --git a/components/drivers/include/drivers/encoder.h b/components/drivers/include/drivers/encoder.h new file mode 100644 index 0000000000..c6c3e4d708 --- /dev/null +++ b/components/drivers/include/drivers/encoder.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-08 balanceTWK the first version + */ + +#ifndef __ENCODER_H__ +#define __ENCODER_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* encoder control command */ +typedef enum +{ + ENCODER_INFO_GET = 0x01, /* get a encoder feature information */ + ENCODER_SWITCH_ON, /* switch on encoder */ + ENCODER_SWITCH_OFF, /* switch off encoder */ + ENCODER_COUNT_CLEAR, /* clear encoder count */ +} rt_encoder_ctrl_t; + +/* encoder type */ +typedef enum +{ + SINGLE_PHASE_ENCODER = 0x01, /* single phase encoder */ + AB_PHASE_ENCODER /* two phase encoder */ +} rt_encoder_type_t; + +struct rt_encoder_device; + +struct rt_encoder_ops +{ + rt_err_t (*init)(struct rt_encoder_device *encoder); + rt_int32_t (*get_count)(struct rt_encoder_device *encoder); + rt_err_t (*control)(struct rt_encoder_device *encoder, rt_uint32_t cmd, void *args); +}; + +/* Encoder feature information */ +struct rt_encoder_info +{ + rt_encoder_type_t type; /* the type of encoder */ +}; + +typedef struct rt_encoder_device +{ + struct rt_device parent; + const struct rt_encoder_ops *ops; + const struct rt_encoder_info *info; +} rt_encoder_t; + +rt_err_t rt_device_encoder_register(rt_encoder_t *encoder, const char *name, void *user_data); + +#ifdef __cplusplus +} +#endif + +#endif /* __ENCODER_H__ */ diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h index f764d30c24..0c009e9580 100644 --- a/components/drivers/include/rtdevice.h +++ b/components/drivers/include/rtdevice.h @@ -126,6 +126,10 @@ extern "C" { #include "drivers/crypto.h" #endif +#ifdef RT_USING_ENCODER +#include "drivers/encoder.h" +#endif + #ifdef __cplusplus } #endif diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript index c45ba524c5..3bfb73fea0 100644 --- a/components/drivers/misc/SConscript +++ b/components/drivers/misc/SConscript @@ -13,6 +13,9 @@ if GetDepend(['RT_USING_ADC']): if GetDepend(['RT_USING_PWM']): src = src + ['rt_drv_pwm.c'] + +if GetDepend(['RT_USING_ENCODER']): + src = src + ['encoder.c'] if len(src): group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) diff --git a/components/drivers/misc/encoder.c b/components/drivers/misc/encoder.c new file mode 100644 index 0000000000..d0b2ef9522 --- /dev/null +++ b/components/drivers/misc/encoder.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-08 balanceTWK the first version + */ + +#include +#include + +static rt_err_t rt_encoder_init(struct rt_device *dev) +{ + rt_encoder_t *encoder; + + encoder = (rt_encoder_t *)dev; + if (encoder->ops->init) + { + return encoder->ops->init(encoder); + } + else + { + return -RT_ENOSYS; + } +} + +static rt_err_t rt_encoder_open(struct rt_device *dev, rt_uint16_t oflag) +{ + rt_encoder_t *encoder; + + encoder = (rt_encoder_t *)dev; + if (encoder->ops->control) + { + return encoder->ops->control(encoder, ENCODER_SWITCH_ON, RT_NULL); + } + else + { + return -RT_ENOSYS; + } +} + +static rt_err_t rt_encoder_close(struct rt_device *dev) +{ + rt_encoder_t *encoder; + + encoder = (rt_encoder_t *)dev; + if (encoder->ops->control) + { + return encoder->ops->control(encoder, ENCODER_SWITCH_OFF, RT_NULL); + } + else + { + return -RT_ENOSYS; + } +} + +static rt_size_t rt_encoder_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + rt_encoder_t *encoder; + + encoder = (rt_encoder_t *)dev; + if (encoder->ops->get_count) + { + *(rt_int32_t *)buffer = encoder->ops->get_count(encoder); + } + return 1; +} + +static rt_err_t rt_encoder_control(struct rt_device *dev, int cmd, void *args) +{ + rt_err_t result; + rt_encoder_t *encoder; + + result = RT_EOK; + encoder = (rt_encoder_t *)dev; + switch (cmd) + { + case ENCODER_INFO_GET: + *(struct rt_encoder_info *)args = *encoder->info; + break; + case ENCODER_SWITCH_ON: + case ENCODER_SWITCH_OFF: + case ENCODER_COUNT_CLEAR: + result = encoder->ops->control(encoder, cmd, args); + break; + default: + result = -RT_ENOSYS; + break; + } + + return result; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops encoder_ops = +{ + rt_encoder_init, + rt_encoder_open, + rt_encoder_close, + rt_encoder_read, + RT_NULL, + rt_encoder_control +}; +#endif + +rt_err_t rt_device_encoder_register(rt_encoder_t *encoder, const char *name, void *user_data) +{ + struct rt_device *device; + + RT_ASSERT(encoder != RT_NULL); + RT_ASSERT(encoder->ops != RT_NULL); + RT_ASSERT(encoder->info != RT_NULL); + + device = &(encoder->parent); + + device->type = RT_Device_Class_Miscellaneous; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + device->ops = &encoder_ops; +#else + device->init = rt_encoder_init; + device->open = rt_encoder_open; + device->close = rt_encoder_close; + device->read = rt_encoder_read; + device->write = RT_NULL; + device->control = rt_encoder_control; +#endif + device->user_data = user_data; + + return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE); +} -- cgit v1.3.1 From 473505053feebb4eb1e2e870d5e042776556d24c Mon Sep 17 00:00:00 2001 From: tangweikang Date: Tue, 13 Aug 2019 20:14:45 +0800 Subject: [components][drivers] add capture driven framework --- components/drivers/Kconfig | 10 ++ components/drivers/include/drivers/rt_capture.h | 61 ++++++++ components/drivers/include/rtdevice.h | 4 + components/drivers/misc/SConscript | 3 + components/drivers/misc/rt_capture.c | 184 ++++++++++++++++++++++++ 5 files changed, 262 insertions(+) create mode 100644 components/drivers/include/drivers/rt_capture.h create mode 100644 components/drivers/misc/rt_capture.c (limited to 'components/drivers/misc/SConscript') diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig index ff2639b8fa..cc3919ccec 100755 --- a/components/drivers/Kconfig +++ b/components/drivers/Kconfig @@ -438,6 +438,16 @@ config RT_USING_ENCODER bool "Using ENCODER device drivers" default n +config RT_USING_CAPTURE + bool "Using CAPTURE device drivers" + default n + +if RT_USING_CAPTURE + config RT_CAPTURE_RB_SIZE + int "Set capture rinbuffer size" + default 100 +endif + menuconfig RT_USING_WIFI bool "Using Wi-Fi framework" default n diff --git a/components/drivers/include/drivers/rt_capture.h b/components/drivers/include/drivers/rt_capture.h new file mode 100644 index 0000000000..efc2ae4db1 --- /dev/null +++ b/components/drivers/include/drivers/rt_capture.h @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-13 balanceTWK first version. + */ + +#ifndef __RT_CAPTURE_H__ +#define __RT_CAPTURE_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* capture control command */ +#define CAPTURE_CMD_CLEAR_BUF (128 + 0) /* clear capture buf */ +#define CAPTURE_CMD_SET_WATERMARK (128 + 1) /* Set the callback threshold */ + +struct capture_data_struct +{ + rt_bool_t is_high; + rt_uint32_t pulsewidth_us; +}; + +struct rt_capture_device +{ + struct rt_device parent; + + const struct rt_capture_ops *ops; + struct rt_ringbuffer *ringbuff; + rt_size_t watermark; +}; + +/** + * capture operators + */ +struct rt_capture_ops +{ + rt_err_t (*init)(struct rt_capture_device *capture); + rt_err_t (*open)(struct rt_capture_device *capture); + rt_err_t (*close)(struct rt_capture_device *capture); + rt_err_t (*get_pulsewidth)(struct rt_capture_device *capture, rt_uint32_t *pulsewidth_us); +}; + +void rt_hw_capture_isr(struct rt_capture_device *capture, rt_bool_t level); + +rt_err_t rt_hw_capture_register(struct rt_capture_device *capture, + const char *name, + rt_uint32_t flag, + void *data); +#ifdef __cplusplus +} +#endif + +#endif /* __RT_CAPTURE_H__ */ diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h index 0c009e9580..3ba7f72357 100644 --- a/components/drivers/include/rtdevice.h +++ b/components/drivers/include/rtdevice.h @@ -130,6 +130,10 @@ extern "C" { #include "drivers/encoder.h" #endif +#ifdef RT_USING_CAPTURE +#include "drivers/rt_capture.h" +#endif + #ifdef __cplusplus } #endif diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript index 3bfb73fea0..7bc638f427 100644 --- a/components/drivers/misc/SConscript +++ b/components/drivers/misc/SConscript @@ -17,6 +17,9 @@ if GetDepend(['RT_USING_PWM']): if GetDepend(['RT_USING_ENCODER']): src = src + ['encoder.c'] +if GetDepend(['RT_USING_CAPTURE']): + src = src + ['rt_capture.c'] + if len(src): group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) diff --git a/components/drivers/misc/rt_capture.c b/components/drivers/misc/rt_capture.c new file mode 100644 index 0000000000..69337fc319 --- /dev/null +++ b/components/drivers/misc/rt_capture.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-13 balanceTWK the first version + */ + +#include +#include + +static rt_err_t rt_capture_init(struct rt_device *dev) +{ + struct rt_capture_device *capture; + + RT_ASSERT(dev != RT_NULL); + + capture = (struct rt_capture_device *)dev; + capture->watermark = RT_CAPTURE_RB_SIZE/2; + if(capture->ops->init) + { + return capture->ops->init(capture); + } + else + { + return -RT_ENOSYS; + } +} + +static rt_err_t rt_capture_open(struct rt_device *dev, rt_uint16_t oflag) +{ + struct rt_capture_device *capture; + + RT_ASSERT(dev != RT_NULL); + + capture = (struct rt_capture_device *)dev; + if(capture->ringbuff == RT_NULL) + { + capture->ringbuff = rt_ringbuffer_create(sizeof(struct capture_data_struct)*RT_CAPTURE_RB_SIZE); + } + if(capture->ops->open) + { + return capture->ops->open(capture); + } + else + { + return -RT_ENOSYS; + } +} + +static rt_err_t rt_capture_close(struct rt_device *dev) +{ + rt_err_t ret; + struct rt_capture_device *capture; + + RT_ASSERT(dev != RT_NULL); + + ret = -RT_ERROR; + + capture = (struct rt_capture_device *)dev; + + if (capture->ops->close) + { + ret = capture->ops->close(capture); + } + else + { + return -RT_ENOSYS; + } + if(ret == RT_EOK) + { + if(capture->ringbuff) + { + rt_ringbuffer_destroy(capture->ringbuff); + capture->ringbuff = RT_NULL; + } + } + return ret; +} + +static rt_size_t rt_capture_read(struct rt_device *dev, + rt_off_t pos, + void *buffer, + rt_size_t size) +{ + rt_size_t receive_size; + struct rt_capture_device *capture; + + RT_ASSERT(dev != RT_NULL); + + capture = (struct rt_capture_device *)dev; + receive_size = rt_ringbuffer_get(capture->ringbuff, (rt_uint8_t*)buffer, sizeof(struct capture_data_struct)*size); + + return receive_size/sizeof(struct capture_data_struct); +} + +static rt_err_t rt_capture_control(struct rt_device *dev, int cmd, void *args) +{ + rt_err_t result; + struct rt_capture_device *capture; + + RT_ASSERT(dev != RT_NULL); + + result = RT_EOK; + capture = (struct rt_capture_device *)dev; + switch (cmd) + { + case CAPTURE_CMD_CLEAR_BUF: + rt_ringbuffer_reset(capture->ringbuff); + break; + case CAPTURE_CMD_SET_WATERMARK: + capture->watermark = *(rt_size_t *)args; + break; + default: + result = -RT_ENOSYS; + break; + } + + return result; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops capture_ops = +{ + rt_capture_init, + rt_capture_open, + rt_capture_close, + rt_capture_read, + RT_NULL, + rt_capture_control +}; +#endif + +rt_err_t rt_device_capture_register(struct rt_capture_device *capture, const char *name, void *user_data) +{ + struct rt_device *device; + + RT_ASSERT(capture != RT_NULL); + RT_ASSERT(capture->ops != RT_NULL); + + device = &(capture->parent); + + device->type = RT_Device_Class_Miscellaneous; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + device->ops = &capture_ops; +#else + device->init = rt_capture_init; + device->open = rt_capture_open; + device->close = rt_capture_close; + device->read = rt_capture_read; + device->write = RT_NULL; + device->control = rt_capture_control; +#endif + device->user_data = user_data; + + return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE); +} + +/* ISR for capture interrupt */ +void rt_hw_capture_isr(struct rt_capture_device *capture, rt_bool_t level) +{ + struct capture_data_struct data; + rt_size_t receive_size; + if(capture->ops->get_pulsewidth(capture, &data.pulsewidth_us) != RT_EOK) + { + return; + } + + data.is_high = level; + rt_ringbuffer_put(capture->ringbuff, (rt_uint8_t*)&data.pulsewidth_us, sizeof(rt_uint32_t)); + + receive_size = rt_ringbuffer_data_len(capture->ringbuff); + if(receive_size >= capture->watermark) + { + /* indicate to upper layer application */ + if (capture->parent.rx_indicate != RT_NULL) + capture->parent.rx_indicate(&capture->parent, receive_size); + } +} -- cgit v1.3.1 From f9bad31d57132fce38cc1036efaec045ca21c79b Mon Sep 17 00:00:00 2001 From: tangweikang Date: Wed, 21 Aug 2019 10:40:20 +0800 Subject: [components][drivers] change name: capture -> inputcapture --- components/drivers/Kconfig | 10 +- components/drivers/include/drivers/rt_capture.h | 60 ------- .../drivers/include/drivers/rt_inputcapture.h | 60 +++++++ components/drivers/include/rtdevice.h | 4 +- components/drivers/misc/SConscript | 4 +- components/drivers/misc/rt_capture.c | 195 --------------------- components/drivers/misc/rt_inputcapture.c | 195 +++++++++++++++++++++ 7 files changed, 264 insertions(+), 264 deletions(-) delete mode 100644 components/drivers/include/drivers/rt_capture.h create mode 100644 components/drivers/include/drivers/rt_inputcapture.h delete mode 100644 components/drivers/misc/rt_capture.c create mode 100644 components/drivers/misc/rt_inputcapture.c (limited to 'components/drivers/misc/SConscript') diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig index 8f8ed92a23..ff30fa6162 100755 --- a/components/drivers/Kconfig +++ b/components/drivers/Kconfig @@ -438,13 +438,13 @@ config RT_USING_ENCODER bool "Using ENCODER device drivers" default n -config RT_USING_CAPTURE - bool "Using CAPTURE device drivers" +config RT_USING_INPUT_CAPTURE + bool "Using INPUT CAPTURE device drivers" default n -if RT_USING_CAPTURE - config RT_CAPTURE_RB_SIZE - int "Set capture ringbuffer size" +if RT_USING_INPUT_CAPTURE + config RT_INPUT_CAPTURE_RB_SIZE + int "Set input capture ringbuffer size" default 100 endif diff --git a/components/drivers/include/drivers/rt_capture.h b/components/drivers/include/drivers/rt_capture.h deleted file mode 100644 index fe72997b43..0000000000 --- a/components/drivers/include/drivers/rt_capture.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-08-13 balanceTWK first version. - */ - -#ifndef __RT_CAPTURE_H__ -#define __RT_CAPTURE_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* capture control command */ -#define CAPTURE_CMD_CLEAR_BUF (128 + 0) /* clear capture buf */ -#define CAPTURE_CMD_SET_WATERMARK (128 + 1) /* Set the callback threshold */ - -struct capture_data -{ - rt_uint32_t pulsewidth_us; - rt_bool_t is_high; -}; - -struct rt_capture_device -{ - struct rt_device parent; - - const struct rt_capture_ops *ops; - struct rt_ringbuffer *ringbuff; - rt_size_t watermark; -}; - -/** - * capture operators - */ -struct rt_capture_ops -{ - rt_err_t (*init)(struct rt_capture_device *capture); - rt_err_t (*open)(struct rt_capture_device *capture); - rt_err_t (*close)(struct rt_capture_device *capture); - rt_err_t (*get_pulsewidth)(struct rt_capture_device *capture, rt_uint32_t *pulsewidth_us); -}; - -void rt_hw_capture_isr(struct rt_capture_device *capture, rt_bool_t level); - -rt_err_t rt_device_capture_register(struct rt_capture_device *capture, - const char *name, - void *data); -#ifdef __cplusplus -} -#endif - -#endif /* __RT_CAPTURE_H__ */ diff --git a/components/drivers/include/drivers/rt_inputcapture.h b/components/drivers/include/drivers/rt_inputcapture.h new file mode 100644 index 0000000000..0cadf6444c --- /dev/null +++ b/components/drivers/include/drivers/rt_inputcapture.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-13 balanceTWK first version. + */ + +#ifndef __RT_INPUT_CAPTURE_H__ +#define __RT_INPUT_CAPTURE_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* capture control command */ +#define INPUTCAPTURE_CMD_CLEAR_BUF (128 + 0) /* clear capture buf */ +#define INPUTCAPTURE_CMD_SET_WATERMARK (128 + 1) /* Set the callback threshold */ + +struct rt_inputcapture_data +{ + rt_uint32_t pulsewidth_us; + rt_bool_t is_high; +}; + +struct rt_inputcapture_device +{ + struct rt_device parent; + + const struct rt_inputcapture_ops *ops; + struct rt_ringbuffer *ringbuff; + rt_size_t watermark; +}; + +/** + * capture operators + */ +struct rt_inputcapture_ops +{ + rt_err_t (*init)(struct rt_inputcapture_device *inputcapture); + rt_err_t (*open)(struct rt_inputcapture_device *inputcapture); + rt_err_t (*close)(struct rt_inputcapture_device *inputcapture); + rt_err_t (*get_pulsewidth)(struct rt_inputcapture_device *inputcapture, rt_uint32_t *pulsewidth_us); +}; + +void rt_hw_capture_isr(struct rt_inputcapture_device *inputcapture, rt_bool_t level); + +rt_err_t rt_device_inputcapture_register(struct rt_inputcapture_device *inputcapture, + const char *name, + void *data); +#ifdef __cplusplus +} +#endif + +#endif /* __RT_INPUT_CAPTURE_H__ */ diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h index 3ba7f72357..bb302ac2af 100644 --- a/components/drivers/include/rtdevice.h +++ b/components/drivers/include/rtdevice.h @@ -130,8 +130,8 @@ extern "C" { #include "drivers/encoder.h" #endif -#ifdef RT_USING_CAPTURE -#include "drivers/rt_capture.h" +#ifdef RT_USING_INPUT_CAPTURE +#include "drivers/rt_inputcapture.h" #endif #ifdef __cplusplus diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript index 7bc638f427..f0d177f761 100644 --- a/components/drivers/misc/SConscript +++ b/components/drivers/misc/SConscript @@ -17,8 +17,8 @@ if GetDepend(['RT_USING_PWM']): if GetDepend(['RT_USING_ENCODER']): src = src + ['encoder.c'] -if GetDepend(['RT_USING_CAPTURE']): - src = src + ['rt_capture.c'] +if GetDepend(['RT_USING_INPUT_CAPTURE']): + src = src + ['rt_inputcapture.c'] if len(src): group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) diff --git a/components/drivers/misc/rt_capture.c b/components/drivers/misc/rt_capture.c deleted file mode 100644 index 994def0cce..0000000000 --- a/components/drivers/misc/rt_capture.c +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-08-13 balanceTWK the first version - */ - -#include -#include -#include - -static rt_err_t rt_capture_init(struct rt_device *dev) -{ - rt_err_t ret; - struct rt_capture_device *capture; - - RT_ASSERT(dev != RT_NULL); - - ret = RT_EOK; - capture = (struct rt_capture_device *)dev; - capture->watermark = RT_CAPTURE_RB_SIZE / 2; - if (capture->ops->init) - { - ret = capture->ops->init(capture); - } - - return ret; -} - -static rt_err_t rt_capture_open(struct rt_device *dev, rt_uint16_t oflag) -{ - rt_err_t ret; - struct rt_capture_device *capture; - - RT_ASSERT(dev != RT_NULL); - - ret = RT_EOK; - capture = (struct rt_capture_device *)dev; - if (capture->ringbuff == RT_NULL) - { - capture->ringbuff = rt_ringbuffer_create(sizeof(struct capture_data) * RT_CAPTURE_RB_SIZE); - } - if (capture->ops->open) - { - ret = capture->ops->open(capture); - } - - return ret; -} - -static rt_err_t rt_capture_close(struct rt_device *dev) -{ - rt_err_t ret; - struct rt_capture_device *capture; - - RT_ASSERT(dev != RT_NULL); - - ret = -RT_ERROR; - capture = (struct rt_capture_device *)dev; - - if (capture->ops->close) - { - ret = capture->ops->close(capture); - } - - if (ret != RT_EOK) - { - return ret; - } - - if (capture->ringbuff) - { - rt_ringbuffer_destroy(capture->ringbuff); - capture->ringbuff = RT_NULL; - } - return ret; -} - -static rt_size_t rt_capture_read(struct rt_device *dev, - rt_off_t pos, - void *buffer, - rt_size_t size) -{ - rt_size_t receive_size; - struct rt_capture_device *capture; - - RT_ASSERT(dev != RT_NULL); - - capture = (struct rt_capture_device *)dev; - receive_size = rt_ringbuffer_get(capture->ringbuff, (rt_uint8_t *)buffer, sizeof(struct capture_data) * size); - - return receive_size / sizeof(struct capture_data); -} - -static rt_err_t rt_capture_control(struct rt_device *dev, int cmd, void *args) -{ - rt_err_t result; - struct rt_capture_device *capture; - - RT_ASSERT(dev != RT_NULL); - - result = RT_EOK; - capture = (struct rt_capture_device *)dev; - switch (cmd) - { - case CAPTURE_CMD_CLEAR_BUF: - if (capture->ringbuff) - { - rt_ringbuffer_reset(capture->ringbuff); - } - break; - case CAPTURE_CMD_SET_WATERMARK: - capture->watermark = *(rt_size_t *)args; - break; - default: - result = -RT_ENOSYS; - break; - } - - return result; -} - -#ifdef RT_USING_DEVICE_OPS -const static struct rt_device_ops capture_ops = -{ - rt_capture_init, - rt_capture_open, - rt_capture_close, - rt_capture_read, - RT_NULL, - rt_capture_control -}; -#endif - -rt_err_t rt_device_capture_register(struct rt_capture_device *capture, const char *name, void *user_data) -{ - struct rt_device *device; - - RT_ASSERT(capture != RT_NULL); - RT_ASSERT(capture->ops != RT_NULL); - RT_ASSERT(capture->ops->get_pulsewidth != RT_NULL); - - device = &(capture->parent); - - device->type = RT_Device_Class_Miscellaneous; - device->rx_indicate = RT_NULL; - device->tx_complete = RT_NULL; - capture->ringbuff = RT_NULL; - -#ifdef RT_USING_DEVICE_OPS - device->ops = &capture_ops; -#else - device->init = rt_capture_init; - device->open = rt_capture_open; - device->close = rt_capture_close; - device->read = rt_capture_read; - device->write = RT_NULL; - device->control = rt_capture_control; -#endif - device->user_data = user_data; - - return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE); -} - -/** - * This function is ISR for capture interrupt. - * level: RT_TRUE denotes high level pulse, and RT_FALSE denotes low level pulse. - */ -void rt_hw_capture_isr(struct rt_capture_device *capture, rt_bool_t level) -{ - struct capture_data data; - rt_size_t receive_size; - if (capture->ops->get_pulsewidth(capture, &data.pulsewidth_us) != RT_EOK) - { - return; - } - - data.is_high = level; - if (rt_ringbuffer_put(capture->ringbuff, (rt_uint8_t *)&data, sizeof(struct capture_data)) == 0) - { - LOG_W("capture ringbuffer doesn't have enough space."); - } - - receive_size = rt_ringbuffer_data_len(capture->ringbuff) / sizeof(struct capture_data); - - if (receive_size >= capture->watermark) - { - /* indicate to upper layer application */ - if (capture->parent.rx_indicate != RT_NULL) - capture->parent.rx_indicate(&capture->parent, receive_size); - } -} diff --git a/components/drivers/misc/rt_inputcapture.c b/components/drivers/misc/rt_inputcapture.c new file mode 100644 index 0000000000..d1886186d7 --- /dev/null +++ b/components/drivers/misc/rt_inputcapture.c @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-13 balanceTWK the first version + */ + +#include +#include +#include + +static rt_err_t rt_inputcapture_init(struct rt_device *dev) +{ + rt_err_t ret; + struct rt_inputcapture_device *inputcapture; + + RT_ASSERT(dev != RT_NULL); + + ret = RT_EOK; + inputcapture = (struct rt_inputcapture_device *)dev; + inputcapture->watermark = RT_INPUT_CAPTURE_RB_SIZE / 2; + if (inputcapture->ops->init) + { + ret = inputcapture->ops->init(inputcapture); + } + + return ret; +} + +static rt_err_t rt_inputcapture_open(struct rt_device *dev, rt_uint16_t oflag) +{ + rt_err_t ret; + struct rt_inputcapture_device *inputcapture; + + RT_ASSERT(dev != RT_NULL); + + ret = RT_EOK; + inputcapture = (struct rt_inputcapture_device *)dev; + if (inputcapture->ringbuff == RT_NULL) + { + inputcapture->ringbuff = rt_ringbuffer_create(sizeof(struct rt_inputcapture_data) * RT_INPUT_CAPTURE_RB_SIZE); + } + if (inputcapture->ops->open) + { + ret = inputcapture->ops->open(inputcapture); + } + + return ret; +} + +static rt_err_t rt_inputcapture_close(struct rt_device *dev) +{ + rt_err_t ret; + struct rt_inputcapture_device *inputcapture; + + RT_ASSERT(dev != RT_NULL); + + ret = -RT_ERROR; + inputcapture = (struct rt_inputcapture_device *)dev; + + if (inputcapture->ops->close) + { + ret = inputcapture->ops->close(inputcapture); + } + + if (ret != RT_EOK) + { + return ret; + } + + if (inputcapture->ringbuff) + { + rt_ringbuffer_destroy(inputcapture->ringbuff); + inputcapture->ringbuff = RT_NULL; + } + return ret; +} + +static rt_size_t rt_inputcapture_read(struct rt_device *dev, + rt_off_t pos, + void *buffer, + rt_size_t size) +{ + rt_size_t receive_size; + struct rt_inputcapture_device *inputcapture; + + RT_ASSERT(dev != RT_NULL); + + inputcapture = (struct rt_inputcapture_device *)dev; + receive_size = rt_ringbuffer_get(inputcapture->ringbuff, (rt_uint8_t *)buffer, sizeof(struct rt_inputcapture_data) * size); + + return receive_size / sizeof(struct rt_inputcapture_data); +} + +static rt_err_t rt_inputcapture_control(struct rt_device *dev, int cmd, void *args) +{ + rt_err_t result; + struct rt_inputcapture_device *inputcapture; + + RT_ASSERT(dev != RT_NULL); + + result = RT_EOK; + inputcapture = (struct rt_inputcapture_device *)dev; + switch (cmd) + { + case INPUTCAPTURE_CMD_CLEAR_BUF: + if (inputcapture->ringbuff) + { + rt_ringbuffer_reset(inputcapture->ringbuff); + } + break; + case INPUTCAPTURE_CMD_SET_WATERMARK: + inputcapture->watermark = *(rt_size_t *)args; + break; + default: + result = -RT_ENOSYS; + break; + } + + return result; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops inputcapture_ops = +{ + rt_inputcapture_init, + rt_inputcapture_open, + rt_inputcapture_close, + rt_inputcapture_read, + RT_NULL, + rt_inputcapture_control +}; +#endif + +rt_err_t rt_device_inputcapture_register(struct rt_inputcapture_device *inputcapture, const char *name, void *user_data) +{ + struct rt_device *device; + + RT_ASSERT(inputcapture != RT_NULL); + RT_ASSERT(inputcapture->ops != RT_NULL); + RT_ASSERT(inputcapture->ops->get_pulsewidth != RT_NULL); + + device = &(inputcapture->parent); + + device->type = RT_Device_Class_Miscellaneous; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + inputcapture->ringbuff = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + device->ops = &inputcapture_ops; +#else + device->init = rt_inputcapture_init; + device->open = rt_inputcapture_open; + device->close = rt_inputcapture_close; + device->read = rt_inputcapture_read; + device->write = RT_NULL; + device->control = rt_inputcapture_control; +#endif + device->user_data = user_data; + + return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE); +} + +/** + * This function is ISR for inputcapture interrupt. + * level: RT_TRUE denotes high level pulse, and RT_FALSE denotes low level pulse. + */ +void rt_hw_inputcapture_isr(struct rt_inputcapture_device *inputcapture, rt_bool_t level) +{ + struct rt_inputcapture_data data; + rt_size_t receive_size; + if (inputcapture->ops->get_pulsewidth(inputcapture, &data.pulsewidth_us) != RT_EOK) + { + return; + } + + data.is_high = level; + if (rt_ringbuffer_put(inputcapture->ringbuff, (rt_uint8_t *)&data, sizeof(struct rt_inputcapture_data)) == 0) + { + LOG_W("inputcapture ringbuffer doesn't have enough space."); + } + + receive_size = rt_ringbuffer_data_len(inputcapture->ringbuff) / sizeof(struct rt_inputcapture_data); + + if (receive_size >= inputcapture->watermark) + { + /* indicate to upper layer application */ + if (inputcapture->parent.rx_indicate != RT_NULL) + inputcapture->parent.rx_indicate(&inputcapture->parent, receive_size); + } +} -- cgit v1.3.1 From b76d3dac8a92b36993169e5d38a6960b3210af04 Mon Sep 17 00:00:00 2001 From: tangweikang Date: Fri, 30 Aug 2019 15:38:05 +0800 Subject: [components][drivers] change name: encoder -> pulse_encoder --- bsp/stm32/libraries/HAL_Drivers/SConscript | 4 +- .../HAL_Drivers/config/f1/encoder_config.h | 64 -------- .../HAL_Drivers/config/f1/pulse_encoder_config.h | 64 ++++++++ .../HAL_Drivers/config/f4/encoder_config.h | 64 -------- .../HAL_Drivers/config/f4/pulse_encoder_config.h | 64 ++++++++ bsp/stm32/libraries/HAL_Drivers/drv_config.h | 4 +- bsp/stm32/libraries/HAL_Drivers/drv_encoder.c | 176 --------------------- .../libraries/HAL_Drivers/drv_pulse_encoder.c | 176 +++++++++++++++++++++ bsp/stm32/libraries/STM32F1xx_HAL/SConscript | 2 +- bsp/stm32/libraries/STM32F4xx_HAL/SConscript | 2 +- bsp/stm32/stm32f103-atk-warshipv3/board/Kconfig | 12 +- bsp/stm32/stm32f407-atk-explorer/board/Kconfig | 12 +- components/drivers/Kconfig | 4 +- components/drivers/include/drivers/encoder.h | 58 ------- components/drivers/include/drivers/pulse_encoder.h | 58 +++++++ components/drivers/include/rtdevice.h | 4 +- components/drivers/misc/SConscript | 4 +- components/drivers/misc/encoder.c | 136 ---------------- components/drivers/misc/pulse_encoder.c | 136 ++++++++++++++++ 19 files changed, 522 insertions(+), 522 deletions(-) delete mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f1/encoder_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f1/pulse_encoder_config.h delete mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f4/encoder_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f4/pulse_encoder_config.h delete mode 100644 bsp/stm32/libraries/HAL_Drivers/drv_encoder.c create mode 100644 bsp/stm32/libraries/HAL_Drivers/drv_pulse_encoder.c delete mode 100644 components/drivers/include/drivers/encoder.h create mode 100644 components/drivers/include/drivers/pulse_encoder.h delete mode 100644 components/drivers/misc/encoder.c create mode 100644 components/drivers/misc/pulse_encoder.c (limited to 'components/drivers/misc/SConscript') diff --git a/bsp/stm32/libraries/HAL_Drivers/SConscript b/bsp/stm32/libraries/HAL_Drivers/SConscript index cb675a16d3..1d37075fcd 100644 --- a/bsp/stm32/libraries/HAL_Drivers/SConscript +++ b/bsp/stm32/libraries/HAL_Drivers/SConscript @@ -85,8 +85,8 @@ if GetDepend(['BSP_USING_SDIO']): if GetDepend(['BSP_USING_USBD_FS']): src += ['drv_usbd_fs.c'] -if GetDepend(['BSP_USING_ENCODER']): - src += ['drv_encoder.c'] +if GetDepend(['BSP_USING_PULSE_ENCODER']): + src += ['drv_pulse_encoder.c'] src += ['drv_common.c'] diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f1/encoder_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f1/encoder_config.h deleted file mode 100644 index 80d515955f..0000000000 --- a/bsp/stm32/libraries/HAL_Drivers/config/f1/encoder_config.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-08-23 balanceTWK first version - */ - -#ifndef __ENCODER_CONFIG_H__ -#define __ENCODER_CONFIG_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef BSP_USING_ENCODER1 -#ifndef ENCODER1_CONFIG -#define ENCODER1_CONFIG \ - { \ - .tim_handler.Instance = TIM1, \ - .name = "encoder1" \ - } -#endif /* ENCODER1_CONFIG */ -#endif /* BSP_USING_ENCODER1 */ - -#ifdef BSP_USING_ENCODER2 -#ifndef ENCODER2_CONFIG -#define ENCODER2_CONFIG \ - { \ - .tim_handler.Instance = TIM2, \ - .name = "encoder2" \ - } -#endif /* ENCODER2_CONFIG */ -#endif /* BSP_USING_ENCODER2 */ - -#ifdef BSP_USING_ENCODER3 -#ifndef ENCODER3_CONFIG -#define ENCODER3_CONFIG \ - { \ - .tim_handler.Instance = TIM3, \ - .name = "encoder3" \ - } -#endif /* ENCODER3_CONFIG */ -#endif /* BSP_USING_ENCODER3 */ - -#ifdef BSP_USING_ENCODER4 -#ifndef ENCODER4_CONFIG -#define ENCODER4_CONFIG \ - { \ - .tim_handler.Instance = TIM4, \ - .name = "encoder4" \ - } -#endif /* ENCODER4_CONFIG */ -#endif /* BSP_USING_ENCODER4 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __ENCODER_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f1/pulse_encoder_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f1/pulse_encoder_config.h new file mode 100644 index 0000000000..4621240c98 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f1/pulse_encoder_config.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-23 balanceTWK first version + */ + +#ifndef __PULSE_ENCODER_CONFIG_H__ +#define __PULSE_ENCODER_CONFIG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef BSP_USING_PULSE_ENCODER1 +#ifndef PULSE_ENCODER1_CONFIG +#define PULSE_ENCODER1_CONFIG \ + { \ + .tim_handler.Instance = TIM1, \ + .name = "pulse1" \ + } +#endif /* PULSE_ENCODER1_CONFIG */ +#endif /* BSP_USING_PULSE_ENCODER1 */ + +#ifdef BSP_USING_PULSE_ENCODER2 +#ifndef PULSE_ENCODER2_CONFIG +#define PULSE_ENCODER2_CONFIG \ + { \ + .tim_handler.Instance = TIM2, \ + .name = "pulse2" \ + } +#endif /* PULSE_ENCODER2_CONFIG */ +#endif /* BSP_USING_PULSE_ENCODER2 */ + +#ifdef BSP_USING_PULSE_ENCODER3 +#ifndef PULSE_ENCODER3_CONFIG +#define PULSE_ENCODER3_CONFIG \ + { \ + .tim_handler.Instance = TIM3, \ + .name = "pulse3" \ + } +#endif /* PULSE_ENCODER3_CONFIG */ +#endif /* BSP_USING_PULSE_ENCODER3 */ + +#ifdef BSP_USING_PULSE_ENCODER4 +#ifndef PULSE_ENCODER4_CONFIG +#define PULSE_ENCODER4_CONFIG \ + { \ + .tim_handler.Instance = TIM4, \ + .name = "pulse4" \ + } +#endif /* PULSE_ENCODER4_CONFIG */ +#endif /* BSP_USING_PULSE_ENCODER4 */ + +#ifdef __cplusplus +} +#endif + +#endif /* __PULSE_ENCODER_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f4/encoder_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f4/encoder_config.h deleted file mode 100644 index 80d515955f..0000000000 --- a/bsp/stm32/libraries/HAL_Drivers/config/f4/encoder_config.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-08-23 balanceTWK first version - */ - -#ifndef __ENCODER_CONFIG_H__ -#define __ENCODER_CONFIG_H__ - -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef BSP_USING_ENCODER1 -#ifndef ENCODER1_CONFIG -#define ENCODER1_CONFIG \ - { \ - .tim_handler.Instance = TIM1, \ - .name = "encoder1" \ - } -#endif /* ENCODER1_CONFIG */ -#endif /* BSP_USING_ENCODER1 */ - -#ifdef BSP_USING_ENCODER2 -#ifndef ENCODER2_CONFIG -#define ENCODER2_CONFIG \ - { \ - .tim_handler.Instance = TIM2, \ - .name = "encoder2" \ - } -#endif /* ENCODER2_CONFIG */ -#endif /* BSP_USING_ENCODER2 */ - -#ifdef BSP_USING_ENCODER3 -#ifndef ENCODER3_CONFIG -#define ENCODER3_CONFIG \ - { \ - .tim_handler.Instance = TIM3, \ - .name = "encoder3" \ - } -#endif /* ENCODER3_CONFIG */ -#endif /* BSP_USING_ENCODER3 */ - -#ifdef BSP_USING_ENCODER4 -#ifndef ENCODER4_CONFIG -#define ENCODER4_CONFIG \ - { \ - .tim_handler.Instance = TIM4, \ - .name = "encoder4" \ - } -#endif /* ENCODER4_CONFIG */ -#endif /* BSP_USING_ENCODER4 */ - -#ifdef __cplusplus -} -#endif - -#endif /* __ENCODER_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f4/pulse_encoder_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f4/pulse_encoder_config.h new file mode 100644 index 0000000000..4621240c98 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f4/pulse_encoder_config.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-23 balanceTWK first version + */ + +#ifndef __PULSE_ENCODER_CONFIG_H__ +#define __PULSE_ENCODER_CONFIG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef BSP_USING_PULSE_ENCODER1 +#ifndef PULSE_ENCODER1_CONFIG +#define PULSE_ENCODER1_CONFIG \ + { \ + .tim_handler.Instance = TIM1, \ + .name = "pulse1" \ + } +#endif /* PULSE_ENCODER1_CONFIG */ +#endif /* BSP_USING_PULSE_ENCODER1 */ + +#ifdef BSP_USING_PULSE_ENCODER2 +#ifndef PULSE_ENCODER2_CONFIG +#define PULSE_ENCODER2_CONFIG \ + { \ + .tim_handler.Instance = TIM2, \ + .name = "pulse2" \ + } +#endif /* PULSE_ENCODER2_CONFIG */ +#endif /* BSP_USING_PULSE_ENCODER2 */ + +#ifdef BSP_USING_PULSE_ENCODER3 +#ifndef PULSE_ENCODER3_CONFIG +#define PULSE_ENCODER3_CONFIG \ + { \ + .tim_handler.Instance = TIM3, \ + .name = "pulse3" \ + } +#endif /* PULSE_ENCODER3_CONFIG */ +#endif /* BSP_USING_PULSE_ENCODER3 */ + +#ifdef BSP_USING_PULSE_ENCODER4 +#ifndef PULSE_ENCODER4_CONFIG +#define PULSE_ENCODER4_CONFIG \ + { \ + .tim_handler.Instance = TIM4, \ + .name = "pulse4" \ + } +#endif /* PULSE_ENCODER4_CONFIG */ +#endif /* BSP_USING_PULSE_ENCODER4 */ + +#ifdef __cplusplus +} +#endif + +#endif /* __PULSE_ENCODER_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_config.h b/bsp/stm32/libraries/HAL_Drivers/drv_config.h index 9f5194d960..fa4555fe50 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_config.h @@ -34,7 +34,7 @@ extern "C" { #include "f1/sdio_config.h" #include "f1/pwm_config.h" #include "f1/usbd_fs_config.h" -#include "f1/encoder_config.h" +#include "f1/pulse_encoder_config.h" #elif defined(SOC_SERIES_STM32F2) #include "f2/dma_config.h" #include "f2/uart_config.h" @@ -53,7 +53,7 @@ extern "C" { #include "f4/tim_config.h" #include "f4/sdio_config.h" #include "f4/pwm_config.h" -#include "f4/encoder_config.h" +#include "f4/pulse_encoder_config.h" #elif defined(SOC_SERIES_STM32F7) #include "f7/dma_config.h" #include "f7/uart_config.h" diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_encoder.c b/bsp/stm32/libraries/HAL_Drivers/drv_encoder.c deleted file mode 100644 index ca42c151fa..0000000000 --- a/bsp/stm32/libraries/HAL_Drivers/drv_encoder.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-08-23 balanceTWK first version - */ - -#include "board.h" -#include "drv_config.h" -#ifdef RT_USING_ENCODER - -//#define DRV_DEBUG -#define LOG_TAG "drv.encoder" -#include - -#if !defined(BSP_USING_ENCODER1) && !defined(BSP_USING_ENCODER2) && !defined(BSP_USING_ENCODER3) \ - && !defined(BSP_USING_ENCODER4) && !defined(BSP_USING_ENCODER5) && !defined(BSP_USING_ENCODER6) && !defined(BSP_USING_LPENCODER1) - #error "Please define at least one BSP_USING_ENCODERx" - /* this driver can be disabled at menuconfig → RT-Thread Components → Device Drivers */ -#endif - -enum -{ -#ifdef BSP_USING_ENCODER1 - ENCODER1_INDEX, -#endif -#ifdef BSP_USING_ENCODER2 - ENCODER2_INDEX, -#endif -#ifdef BSP_USING_ENCODER3 - ENCODER3_INDEX, -#endif -#ifdef BSP_USING_ENCODER4 - ENCODER4_INDEX, -#endif -#ifdef BSP_USING_ENCODER5 - ENCODER5_INDEX, -#endif -#ifdef BSP_USING_ENCODER6 - ENCODER6_INDEX, -#endif -}; - -struct stm32_encoder_device -{ - struct rt_encoder_device encoder; - TIM_HandleTypeDef tim_handler; - char *name; -}; - -static struct stm32_encoder_device stm32_encoder_obj[] = -{ -#ifdef BSP_USING_ENCODER1 - ENCODER1_CONFIG, -#endif -#ifdef BSP_USING_ENCODER2 - ENCODER2_CONFIG, -#endif -#ifdef BSP_USING_ENCODER3 - ENCODER3_CONFIG, -#endif -#ifdef BSP_USING_ENCODER4 - ENCODER4_CONFIG, -#endif -#ifdef BSP_USING_ENCODER5 - ENCODER5_CONFIG, -#endif -#ifdef BSP_USING_ENCODER6 - ENCODER6_CONFIG, -#endif -}; - -rt_err_t encoder_init(struct rt_encoder_device *encoder) -{ - TIM_Encoder_InitTypeDef sConfig; - TIM_MasterConfigTypeDef sMasterConfig; - TIM_HandleTypeDef *tim_handler = (TIM_HandleTypeDef *)encoder->parent.user_data; - - tim_handler->Init.Prescaler = 0; - tim_handler->Init.CounterMode = TIM_COUNTERMODE_UP; - tim_handler->Init.Period = 0xffff; - tim_handler->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; - - sConfig.EncoderMode = TIM_ENCODERMODE_TI12; - sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; - sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; - sConfig.IC1Prescaler = TIM_ICPSC_DIV1; - sConfig.IC1Filter = 3; - sConfig.IC2Polarity = TIM_ICPOLARITY_RISING; - sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; - sConfig.IC2Prescaler = TIM_ICPSC_DIV1; - sConfig.IC2Filter = 3; - - if (HAL_TIM_Encoder_Init(tim_handler, &sConfig) != HAL_OK) - { - LOG_E("encoder init failed"); - return -RT_ERROR; - } - - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - - if (HAL_TIMEx_MasterConfigSynchronization(tim_handler, &sMasterConfig)) - { - LOG_E("TIMx master config failed"); - return -RT_ERROR; - } - - return RT_EOK; -} - -rt_int32_t encoder_get_count(struct rt_encoder_device *encoder) -{ - TIM_HandleTypeDef *tim_handler = (TIM_HandleTypeDef *)encoder->parent.user_data; - return (rt_int16_t)__HAL_TIM_GET_COUNTER(tim_handler); -} - -rt_err_t encoder_control(struct rt_encoder_device *encoder, rt_uint32_t cmd, void *args) -{ - rt_err_t result; - TIM_HandleTypeDef *tim_handler = (TIM_HandleTypeDef *)encoder->parent.user_data; - - result = RT_EOK; - - switch (cmd) - { - case ENCODER_CMD_ENABLE: - HAL_TIM_Encoder_Start(tim_handler, TIM_CHANNEL_ALL); - break; - case ENCODER_CMD_DISABLE: - HAL_TIM_Encoder_Stop(tim_handler, TIM_CHANNEL_ALL); - break; - case ENCODER_CMD_CLEAR_COUNT: - __HAL_TIM_SET_COUNTER(tim_handler, 0); - break; - default: - result = -RT_ENOSYS; - break; - } - - return result; -} - -static const struct rt_encoder_ops _ops = -{ - .init = encoder_init, - .get_count = encoder_get_count, - .control = encoder_control, -}; - -int hw_encoder_init(void) -{ - int i; - int result; - - result = RT_EOK; - for (i = 0; i < sizeof(stm32_encoder_obj) / sizeof(stm32_encoder_obj[0]); i++) - { - stm32_encoder_obj[i].encoder.type = AB_PHASE_ENCODER; - stm32_encoder_obj[i].encoder.ops = &_ops; - - if (rt_device_encoder_register(&stm32_encoder_obj[i].encoder, stm32_encoder_obj[i].name, &stm32_encoder_obj[i].tim_handler) != RT_EOK) - { - LOG_E("%s register failed", stm32_encoder_obj[i].name); - result = -RT_ERROR; - } - } - - return result; -} -INIT_BOARD_EXPORT(hw_encoder_init); - -#endif diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_pulse_encoder.c b/bsp/stm32/libraries/HAL_Drivers/drv_pulse_encoder.c new file mode 100644 index 0000000000..432b8b2a05 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/drv_pulse_encoder.c @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-23 balanceTWK first version + */ + +#include "board.h" +#include "drv_config.h" +#ifdef RT_USING_PULSE_ENCODER + +//#define DRV_DEBUG +#define LOG_TAG "drv.pulse_encoder" +#include + +#if !defined(BSP_USING_PULSE_ENCODER1) && !defined(BSP_USING_PULSE_ENCODER2) && !defined(BSP_USING_PULSE_ENCODER3) \ + && !defined(BSP_USING_PULSE_ENCODER4) && !defined(BSP_USING_PULSE_ENCODER5) && !defined(BSP_USING_PULSE_ENCODER6) + #error "Please define at least one BSP_USING_PULSE_ENCODERx" + /* this driver can be disabled at menuconfig → RT-Thread Components → Device Drivers */ +#endif + +enum +{ +#ifdef BSP_USING_PULSE_ENCODER1 + PULSE_ENCODER1_INDEX, +#endif +#ifdef BSP_USING_PULSE_ENCODER2 + PULSE_ENCODER2_INDEX, +#endif +#ifdef BSP_USING_PULSE_ENCODER3 + PULSE_ENCODER3_INDEX, +#endif +#ifdef BSP_USING_PULSE_ENCODER4 + PULSE_ENCODER4_INDEX, +#endif +#ifdef BSP_USING_PULSE_ENCODER5 + PULSE_ENCODER5_INDEX, +#endif +#ifdef BSP_USING_PULSE_ENCODER6 + PULSE_ENCODER6_INDEX, +#endif +}; + +struct stm32_pulse_encoder_device +{ + struct rt_pulse_encoder_device pulse_encoder; + TIM_HandleTypeDef tim_handler; + char *name; +}; + +static struct stm32_pulse_encoder_device stm32_pulse_encoder_obj[] = +{ +#ifdef BSP_USING_PULSE_ENCODER1 + PULSE_ENCODER1_CONFIG, +#endif +#ifdef BSP_USING_PULSE_ENCODER2 + PULSE_ENCODER2_CONFIG, +#endif +#ifdef BSP_USING_PULSE_ENCODER3 + PULSE_ENCODER3_CONFIG, +#endif +#ifdef BSP_USING_PULSE_ENCODER4 + PULSE_ENCODER4_CONFIG, +#endif +#ifdef BSP_USING_PULSE_ENCODER5 + PULSE_ENCODER5_CONFIG, +#endif +#ifdef BSP_USING_PULSE_ENCODER6 + PULSE_ENCODER6_CONFIG, +#endif +}; + +rt_err_t pulse_encoder_init(struct rt_pulse_encoder_device *pulse_encoder) +{ + TIM_Encoder_InitTypeDef sConfig; + TIM_MasterConfigTypeDef sMasterConfig; + TIM_HandleTypeDef *tim_handler = (TIM_HandleTypeDef *)pulse_encoder->parent.user_data; + + tim_handler->Init.Prescaler = 0; + tim_handler->Init.CounterMode = TIM_COUNTERMODE_UP; + tim_handler->Init.Period = 0xffff; + tim_handler->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + + sConfig.EncoderMode = TIM_ENCODERMODE_TI12; + sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; + sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; + sConfig.IC1Prescaler = TIM_ICPSC_DIV1; + sConfig.IC1Filter = 3; + sConfig.IC2Polarity = TIM_ICPOLARITY_RISING; + sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI; + sConfig.IC2Prescaler = TIM_ICPSC_DIV1; + sConfig.IC2Filter = 3; + + if (HAL_TIM_Encoder_Init(tim_handler, &sConfig) != HAL_OK) + { + LOG_E("pulse_encoder init failed"); + return -RT_ERROR; + } + + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + + if (HAL_TIMEx_MasterConfigSynchronization(tim_handler, &sMasterConfig)) + { + LOG_E("TIMx master config failed"); + return -RT_ERROR; + } + + return RT_EOK; +} + +rt_int32_t pulse_encoder_get_count(struct rt_pulse_encoder_device *pulse_encoder) +{ + TIM_HandleTypeDef *tim_handler = (TIM_HandleTypeDef *)pulse_encoder->parent.user_data; + return (rt_int16_t)__HAL_TIM_GET_COUNTER(tim_handler); +} + +rt_err_t pulse_encoder_control(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t cmd, void *args) +{ + rt_err_t result; + TIM_HandleTypeDef *tim_handler = (TIM_HandleTypeDef *)pulse_encoder->parent.user_data; + + result = RT_EOK; + + switch (cmd) + { + case PULSE_ENCODER_CMD_ENABLE: + HAL_TIM_Encoder_Start(tim_handler, TIM_CHANNEL_ALL); + break; + case PULSE_ENCODER_CMD_DISABLE: + HAL_TIM_Encoder_Stop(tim_handler, TIM_CHANNEL_ALL); + break; + case PULSE_ENCODER_CMD_CLEAR_COUNT: + __HAL_TIM_SET_COUNTER(tim_handler, 0); + break; + default: + result = -RT_ENOSYS; + break; + } + + return result; +} + +static const struct rt_pulse_encoder_ops _ops = +{ + .init = pulse_encoder_init, + .get_count = pulse_encoder_get_count, + .control = pulse_encoder_control, +}; + +int hw_pulse_encoder_init(void) +{ + int i; + int result; + + result = RT_EOK; + for (i = 0; i < sizeof(stm32_pulse_encoder_obj) / sizeof(stm32_pulse_encoder_obj[0]); i++) + { + stm32_pulse_encoder_obj[i].pulse_encoder.type = AB_PHASE_PULSE_ENCODER; + stm32_pulse_encoder_obj[i].pulse_encoder.ops = &_ops; + + if (rt_device_pulse_encoder_register(&stm32_pulse_encoder_obj[i].pulse_encoder, stm32_pulse_encoder_obj[i].name, &stm32_pulse_encoder_obj[i].tim_handler) != RT_EOK) + { + LOG_E("%s register failed", stm32_pulse_encoder_obj[i].name); + result = -RT_ERROR; + } + } + + return result; +} +INIT_BOARD_EXPORT(hw_pulse_encoder_init); + +#endif diff --git a/bsp/stm32/libraries/STM32F1xx_HAL/SConscript b/bsp/stm32/libraries/STM32F1xx_HAL/SConscript index 8d554cac85..f629479376 100644 --- a/bsp/stm32/libraries/STM32F1xx_HAL/SConscript +++ b/bsp/stm32/libraries/STM32F1xx_HAL/SConscript @@ -44,7 +44,7 @@ if GetDepend(['RT_USING_USB_HOST']) or GetDepend(['RT_USING_USB_DEVICE']): if GetDepend(['RT_USING_CAN']): src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']) or GetDepend(['RT_USING_ENCODER']): +if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']) or GetDepend(['RT_USING_PULSE_ENCODER']): src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c'] src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c'] diff --git a/bsp/stm32/libraries/STM32F4xx_HAL/SConscript b/bsp/stm32/libraries/STM32F4xx_HAL/SConscript index 7bf1638169..87c000ae18 100644 --- a/bsp/stm32/libraries/STM32F4xx_HAL/SConscript +++ b/bsp/stm32/libraries/STM32F4xx_HAL/SConscript @@ -46,7 +46,7 @@ if GetDepend(['RT_USING_USB_HOST']) or GetDepend(['RT_USING_USB_DEVICE']): if GetDepend(['RT_USING_CAN']): src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c'] -if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']) or GetDepend(['RT_USING_ENCODER']): +if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']) or GetDepend(['RT_USING_PULSE_ENCODER']): src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c'] src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c'] src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.c'] diff --git a/bsp/stm32/stm32f103-atk-warshipv3/board/Kconfig b/bsp/stm32/stm32f103-atk-warshipv3/board/Kconfig index 8f34aca198..e02250d243 100644 --- a/bsp/stm32/stm32f103-atk-warshipv3/board/Kconfig +++ b/bsp/stm32/stm32f103-atk-warshipv3/board/Kconfig @@ -201,13 +201,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n - menuconfig BSP_USING_ENCODER - bool "Enable Encoder" + menuconfig BSP_USING_PULSE_ENCODER + bool "Enable Pulse Encoder" default n - select RT_USING_ENCODER - if BSP_USING_ENCODER - config BSP_USING_ENCODER3 - bool "Enable Encoder3" + select RT_USING_PULSE_ENCODER + if BSP_USING_PULSE_ENCODER + config BSP_USING_PULSE_ENCODER3 + bool "Enable Pulse Encoder3" default n endif diff --git a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig index 1f0de499ed..2a235f0550 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig +++ b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig @@ -294,13 +294,13 @@ menu "On-chip Peripheral Drivers" select RT_USING_DFS default n - menuconfig BSP_USING_ENCODER - bool "Enable Encoder" + menuconfig BSP_USING_PULSE_ENCODER + bool "Enable Pulse Encoder" default n - select RT_USING_ENCODER - if BSP_USING_ENCODER - config BSP_USING_ENCODER4 - bool "Enable Encoder4" + select RT_USING_PULSE_ENCODER + if BSP_USING_PULSE_ENCODER + config BSP_USING_PULSE_ENCODER4 + bool "Enable Pulse Encoder4" default n endif diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig index ff30fa6162..ea928f452d 100755 --- a/components/drivers/Kconfig +++ b/components/drivers/Kconfig @@ -434,8 +434,8 @@ menuconfig RT_USING_HWCRYPTO endif endif -config RT_USING_ENCODER - bool "Using ENCODER device drivers" +config RT_USING_PULSE_ENCODER + bool "Using PULSE ENCODER device drivers" default n config RT_USING_INPUT_CAPTURE diff --git a/components/drivers/include/drivers/encoder.h b/components/drivers/include/drivers/encoder.h deleted file mode 100644 index f338f9e845..0000000000 --- a/components/drivers/include/drivers/encoder.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-08-08 balanceTWK the first version - */ - -#ifndef __ENCODER_H__ -#define __ENCODER_H__ - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -/* encoder control command */ -#define ENCODER_CMD_GET_TYPE (128 + 0) /* get a encoder type information */ -#define ENCODER_CMD_ENABLE (128 + 1) /* enable encoder */ -#define ENCODER_CMD_DISABLE (128 + 2) /* disable encoder */ -#define ENCODER_CMD_CLEAR_COUNT (128 + 3) /* clear encoder count */ - -/* encoder type */ -enum rt_encoder_type -{ - UNKNOWN_ENCODER_TYPE = 0x00, /* Unknown encoder type */ - SINGLE_PHASE_ENCODER, /* single phase encoder */ - AB_PHASE_ENCODER /* two phase encoder */ -}; - -struct rt_encoder_device; - -struct rt_encoder_ops -{ - rt_err_t (*init)(struct rt_encoder_device *encoder); - rt_int32_t (*get_count)(struct rt_encoder_device *encoder); - rt_err_t (*clear_count)(struct rt_encoder_device *encoder); - rt_err_t (*control)(struct rt_encoder_device *encoder, rt_uint32_t cmd, void *args); -}; - -struct rt_encoder_device -{ - struct rt_device parent; - const struct rt_encoder_ops *ops; - enum rt_encoder_type type; -}; - -rt_err_t rt_device_encoder_register(struct rt_encoder_device *encoder, const char *name, void *user_data); - -#ifdef __cplusplus -} -#endif - -#endif /* __ENCODER_H__ */ diff --git a/components/drivers/include/drivers/pulse_encoder.h b/components/drivers/include/drivers/pulse_encoder.h new file mode 100644 index 0000000000..0c7df04cd6 --- /dev/null +++ b/components/drivers/include/drivers/pulse_encoder.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-08 balanceTWK the first version + */ + +#ifndef __PULSE_ENCODER_H__ +#define __PULSE_ENCODER_H__ + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* pulse_encoder control command */ +#define PULSE_ENCODER_CMD_GET_TYPE (128 + 0) /* get a pulse_encoder type information */ +#define PULSE_ENCODER_CMD_ENABLE (128 + 1) /* enable pulse_encoder */ +#define PULSE_ENCODER_CMD_DISABLE (128 + 2) /* disable pulse_encoder */ +#define PULSE_ENCODER_CMD_CLEAR_COUNT (128 + 3) /* clear pulse_encoder count */ + +/* pulse_encoder type */ +enum rt_pulse_encoder_type +{ + UNKNOWN_PULSE_ENCODER_TYPE = 0x00, /* Unknown pulse_encoder type */ + SINGLE_PHASE_PULSE_ENCODER, /* single phase pulse_encoder */ + AB_PHASE_PULSE_ENCODER /* two phase pulse_encoder */ +}; + +struct rt_pulse_encoder_device; + +struct rt_pulse_encoder_ops +{ + rt_err_t (*init)(struct rt_pulse_encoder_device *pulse_encoder); + rt_int32_t (*get_count)(struct rt_pulse_encoder_device *pulse_encoder); + rt_err_t (*clear_count)(struct rt_pulse_encoder_device *pulse_encoder); + rt_err_t (*control)(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t cmd, void *args); +}; + +struct rt_pulse_encoder_device +{ + struct rt_device parent; + const struct rt_pulse_encoder_ops *ops; + enum rt_pulse_encoder_type type; +}; + +rt_err_t rt_device_pulse_encoder_register(struct rt_pulse_encoder_device *pulse_encoder, const char *name, void *user_data); + +#ifdef __cplusplus +} +#endif + +#endif /* __PULSE_ENCODER_H__ */ diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h index bb302ac2af..623c085430 100644 --- a/components/drivers/include/rtdevice.h +++ b/components/drivers/include/rtdevice.h @@ -126,8 +126,8 @@ extern "C" { #include "drivers/crypto.h" #endif -#ifdef RT_USING_ENCODER -#include "drivers/encoder.h" +#ifdef RT_USING_PULSE_ENCODER +#include "drivers/pulse_encoder.h" #endif #ifdef RT_USING_INPUT_CAPTURE diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript index f0d177f761..8a9fdb5eb9 100644 --- a/components/drivers/misc/SConscript +++ b/components/drivers/misc/SConscript @@ -14,8 +14,8 @@ if GetDepend(['RT_USING_ADC']): if GetDepend(['RT_USING_PWM']): src = src + ['rt_drv_pwm.c'] -if GetDepend(['RT_USING_ENCODER']): - src = src + ['encoder.c'] +if GetDepend(['RT_USING_PULSE_ENCODER']): + src = src + ['pulse_encoder.c'] if GetDepend(['RT_USING_INPUT_CAPTURE']): src = src + ['rt_inputcapture.c'] diff --git a/components/drivers/misc/encoder.c b/components/drivers/misc/encoder.c deleted file mode 100644 index e9e1da0f40..0000000000 --- a/components/drivers/misc/encoder.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2019-08-08 balanceTWK the first version - */ - -#include -#include - -static rt_err_t rt_encoder_init(struct rt_device *dev) -{ - struct rt_encoder_device *encoder; - - encoder = (struct rt_encoder_device *)dev; - if (encoder->ops->init) - { - return encoder->ops->init(encoder); - } - else - { - return -RT_ENOSYS; - } -} - -static rt_err_t rt_encoder_open(struct rt_device *dev, rt_uint16_t oflag) -{ - struct rt_encoder_device *encoder; - - encoder = (struct rt_encoder_device *)dev; - if (encoder->ops->control) - { - return encoder->ops->control(encoder, ENCODER_CMD_ENABLE, RT_NULL); - } - else - { - return -RT_ENOSYS; - } -} - -static rt_err_t rt_encoder_close(struct rt_device *dev) -{ - struct rt_encoder_device *encoder; - - encoder = (struct rt_encoder_device *)dev; - if (encoder->ops->control) - { - return encoder->ops->control(encoder, ENCODER_CMD_DISABLE, RT_NULL); - } - else - { - return -RT_ENOSYS; - } -} - -static rt_size_t rt_encoder_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size) -{ - struct rt_encoder_device *encoder; - - encoder = (struct rt_encoder_device *)dev; - if (encoder->ops->get_count) - { - *(rt_int32_t *)buffer = encoder->ops->get_count(encoder); - } - return 1; -} - -static rt_err_t rt_encoder_control(struct rt_device *dev, int cmd, void *args) -{ - rt_err_t result; - struct rt_encoder_device *encoder; - - result = RT_EOK; - encoder = (struct rt_encoder_device *)dev; - switch (cmd) - { - case ENCODER_CMD_CLEAR_COUNT: - result = encoder->ops->clear_count(encoder); - break; - case ENCODER_CMD_GET_TYPE: - *(enum rt_encoder_type *)args = encoder->type; - break; - case ENCODER_CMD_ENABLE: - case ENCODER_CMD_DISABLE: - result = encoder->ops->control(encoder, cmd, args); - break; - default: - result = -RT_ENOSYS; - break; - } - - return result; -} - -#ifdef RT_USING_DEVICE_OPS -const static struct rt_device_ops encoder_ops = -{ - rt_encoder_init, - rt_encoder_open, - rt_encoder_close, - rt_encoder_read, - RT_NULL, - rt_encoder_control -}; -#endif - -rt_err_t rt_device_encoder_register(struct rt_encoder_device *encoder, const char *name, void *user_data) -{ - struct rt_device *device; - - RT_ASSERT(encoder != RT_NULL); - RT_ASSERT(encoder->ops != RT_NULL); - - device = &(encoder->parent); - - device->type = RT_Device_Class_Miscellaneous; - device->rx_indicate = RT_NULL; - device->tx_complete = RT_NULL; - -#ifdef RT_USING_DEVICE_OPS - device->ops = &encoder_ops; -#else - device->init = rt_encoder_init; - device->open = rt_encoder_open; - device->close = rt_encoder_close; - device->read = rt_encoder_read; - device->write = RT_NULL; - device->control = rt_encoder_control; -#endif - device->user_data = user_data; - - return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE); -} diff --git a/components/drivers/misc/pulse_encoder.c b/components/drivers/misc/pulse_encoder.c new file mode 100644 index 0000000000..3145c24675 --- /dev/null +++ b/components/drivers/misc/pulse_encoder.c @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-08-08 balanceTWK the first version + */ + +#include +#include + +static rt_err_t rt_pulse_encoder_init(struct rt_device *dev) +{ + struct rt_pulse_encoder_device *pulse_encoder; + + pulse_encoder = (struct rt_pulse_encoder_device *)dev; + if (pulse_encoder->ops->init) + { + return pulse_encoder->ops->init(pulse_encoder); + } + else + { + return -RT_ENOSYS; + } +} + +static rt_err_t rt_pulse_encoder_open(struct rt_device *dev, rt_uint16_t oflag) +{ + struct rt_pulse_encoder_device *pulse_encoder; + + pulse_encoder = (struct rt_pulse_encoder_device *)dev; + if (pulse_encoder->ops->control) + { + return pulse_encoder->ops->control(pulse_encoder, PULSE_ENCODER_CMD_ENABLE, RT_NULL); + } + else + { + return -RT_ENOSYS; + } +} + +static rt_err_t rt_pulse_encoder_close(struct rt_device *dev) +{ + struct rt_pulse_encoder_device *pulse_encoder; + + pulse_encoder = (struct rt_pulse_encoder_device *)dev; + if (pulse_encoder->ops->control) + { + return pulse_encoder->ops->control(pulse_encoder, PULSE_ENCODER_CMD_DISABLE, RT_NULL); + } + else + { + return -RT_ENOSYS; + } +} + +static rt_size_t rt_pulse_encoder_read(struct rt_device *dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + struct rt_pulse_encoder_device *pulse_encoder; + + pulse_encoder = (struct rt_pulse_encoder_device *)dev; + if (pulse_encoder->ops->get_count) + { + *(rt_int32_t *)buffer = pulse_encoder->ops->get_count(pulse_encoder); + } + return 1; +} + +static rt_err_t rt_pulse_encoder_control(struct rt_device *dev, int cmd, void *args) +{ + rt_err_t result; + struct rt_pulse_encoder_device *pulse_encoder; + + result = RT_EOK; + pulse_encoder = (struct rt_pulse_encoder_device *)dev; + switch (cmd) + { + case PULSE_ENCODER_CMD_CLEAR_COUNT: + result = pulse_encoder->ops->clear_count(pulse_encoder); + break; + case PULSE_ENCODER_CMD_GET_TYPE: + *(enum rt_pulse_encoder_type *)args = pulse_encoder->type; + break; + case PULSE_ENCODER_CMD_ENABLE: + case PULSE_ENCODER_CMD_DISABLE: + result = pulse_encoder->ops->control(pulse_encoder, cmd, args); + break; + default: + result = -RT_ENOSYS; + break; + } + + return result; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops pulse_encoder_ops = +{ + rt_pulse_encoder_init, + rt_pulse_encoder_open, + rt_pulse_encoder_close, + rt_pulse_encoder_read, + RT_NULL, + rt_pulse_encoder_control +}; +#endif + +rt_err_t rt_device_pulse_encoder_register(struct rt_pulse_encoder_device *pulse_encoder, const char *name, void *user_data) +{ + struct rt_device *device; + + RT_ASSERT(pulse_encoder != RT_NULL); + RT_ASSERT(pulse_encoder->ops != RT_NULL); + + device = &(pulse_encoder->parent); + + device->type = RT_Device_Class_Miscellaneous; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + device->ops = &pulse_encoder_ops; +#else + device->init = rt_pulse_encoder_init; + device->open = rt_pulse_encoder_open; + device->close = rt_pulse_encoder_close; + device->read = rt_pulse_encoder_read; + device->write = RT_NULL; + device->control = rt_pulse_encoder_control; +#endif + device->user_data = user_data; + + return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE); +} -- cgit v1.3.1