From cdfef4839594423a53c683b6234587ff5bab12eb Mon Sep 17 00:00:00 2001 From: aozima Date: Thu, 7 Jun 2018 21:23:22 +0800 Subject: [DeviceDrivers] add pwm driver framework. --- components/drivers/misc/SConscript | 3 +++ 1 file changed, 3 insertions(+) (limited to 'components/drivers/misc/SConscript') diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript index 7f269d4ee9..a8e042554d 100644 --- a/components/drivers/misc/SConscript +++ b/components/drivers/misc/SConscript @@ -8,6 +8,9 @@ group = [] if GetDepend(['RT_USING_PIN']): src = src + ['pin.c'] +if GetDepend(['RT_USING_PWM']): + src = src + ['_pwm.c'] + if len(src): group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) -- cgit v1.3.1 From 5569d17b957edcccefeac83818c90030ee9d955d Mon Sep 17 00:00:00 2001 From: aozima Date: Fri, 8 Jun 2018 16:07:12 +0800 Subject: [DeviceDrivers] rename _pwm.c to rt_drv_pwm.c --- components/drivers/misc/SConscript | 2 +- components/drivers/misc/_pwm.c | 214 ----------------------------------- components/drivers/misc/rt_drv_pwm.c | 214 +++++++++++++++++++++++++++++++++++ 3 files changed, 215 insertions(+), 215 deletions(-) delete mode 100644 components/drivers/misc/_pwm.c create mode 100644 components/drivers/misc/rt_drv_pwm.c (limited to 'components/drivers/misc/SConscript') diff --git a/components/drivers/misc/SConscript b/components/drivers/misc/SConscript index a8e042554d..4cc5f80084 100644 --- a/components/drivers/misc/SConscript +++ b/components/drivers/misc/SConscript @@ -9,7 +9,7 @@ if GetDepend(['RT_USING_PIN']): src = src + ['pin.c'] if GetDepend(['RT_USING_PWM']): - src = src + ['_pwm.c'] + src = src + ['rt_drv_pwm.c'] if len(src): group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH) diff --git a/components/drivers/misc/_pwm.c b/components/drivers/misc/_pwm.c deleted file mode 100644 index fc5b9b5976..0000000000 --- a/components/drivers/misc/_pwm.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * File : _pwm.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2018, RT-Thread Development Team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Change Logs: - * Date Author Notes - * 2018-05-07 aozima the first version - */ - -#include - -#include -#include - - -static rt_err_t _pwm_control(rt_device_t dev, int cmd, void *args) -{ - rt_err_t result = RT_EOK; - struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev; - - if (pwm->ops->control) - { - result = pwm->ops->control(pwm, cmd, args); - } - - return result; -} - - -/* -pos: channel -void *buffer: rt_uint32_t pulse[size] -size : number of pulse, only set to sizeof(rt_uint32_t). -*/ -static rt_size_t _pwm_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) -{ - rt_err_t result = RT_EOK; - struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev; - rt_uint32_t *pulse = (rt_uint32_t *)buffer; - struct rt_pwm_configuration configuration = {0}; - - configuration.channel = pos; - - if (pwm->ops->control) - { - result = pwm->ops->control(pwm, PWM_CMD_GET, &configuration); - if (result != RT_EOK) - { - return 0; - } - - *pulse = configuration.pulse; - } - - return size; -} - -/* -pos: channel -void *buffer: rt_uint32_t pulse[size] -size : number of pulse, only set to sizeof(rt_uint32_t). -*/ -static rt_size_t _pwm_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) -{ - rt_err_t result = RT_EOK; - struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev; - rt_uint32_t *pulse = (rt_uint32_t *)buffer; - struct rt_pwm_configuration configuration = {0}; - - configuration.channel = pos; - - if (pwm->ops->control) - { - result = pwm->ops->control(pwm, PWM_CMD_GET, &configuration); - if (result != RT_EOK) - { - return 0; - } - - configuration.pulse = *pulse; - - result = pwm->ops->control(pwm, PWM_CMD_SET, &configuration); - if (result != RT_EOK) - { - return 0; - } - - } - - return size; -} - -rt_err_t rt_device_pwm_register(struct rt_device_pwm *device, const char *name, const struct rt_pwm_ops *ops, const void *user_data) -{ - rt_err_t result = RT_EOK; - - memset(device, 0, sizeof(struct rt_device_pwm)); - - device->parent.type = RT_Device_Class_Miscellaneous; - - device->parent.init = RT_NULL; - device->parent.open = RT_NULL; - device->parent.close = RT_NULL; - device->parent.read = _pwm_read; - device->parent.write = _pwm_write; - device->parent.control = _pwm_control; - - device->ops = ops; - device->parent.user_data = (void *)user_data; - - result = rt_device_register(&device->parent, name, RT_DEVICE_FLAG_RDWR); - - return result; -} - -rt_err_t rt_pwm_enable(int channel) -{ - rt_err_t result = RT_EOK; - struct rt_device *device = rt_device_find("pwm"); - struct rt_pwm_configuration configuration = {0}; - - if (!device) - { - return -RT_EIO; - } - - configuration.channel = channel; - result = rt_device_control(device, PWM_CMD_ENABLE, &configuration); - - return result; -} - -rt_err_t rt_pwm_set(int channel, rt_uint32_t period, rt_uint32_t pulse) -{ - rt_err_t result = RT_EOK; - struct rt_device *device = rt_device_find("pwm"); - struct rt_pwm_configuration configuration = {0}; - - if (!device) - { - return -RT_EIO; - } - - configuration.channel = channel; - configuration.period = period; - configuration.pulse = pulse; - result = rt_device_control(device, PWM_CMD_SET, &configuration); - - return result; -} - - -#ifdef RT_USING_FINSH -#include - -FINSH_FUNCTION_EXPORT_ALIAS(rt_pwm_enable, pwm_enable, enable pwm by channel.); -FINSH_FUNCTION_EXPORT_ALIAS(rt_pwm_set, pwm_set, set pwm.); - -#ifdef FINSH_USING_MSH -static int pwm_enable(int argc, char **argv) -{ - int result = 0; - - if (argc != 2) - { - rt_kprintf("Usage: pwm_enable 1\n"); - result = -RT_ERROR; - goto _exit; - } - - result = rt_pwm_enable(atoi(argv[1])); - -_exit: - return result; -} -MSH_CMD_EXPORT(pwm_enable, pwm_enable 1); - -static int pwm_set(int argc, char **argv) -{ - int result = 0; - - if (argc != 4) - { - rt_kprintf("Usage: pwm_set 1 100 50\n"); - result = -RT_ERROR; - goto _exit; - } - - result = rt_pwm_set(atoi(argv[1]), atoi(argv[2]), atoi(argv[3])); - -_exit: - return result; -} -MSH_CMD_EXPORT(pwm_set, pwm_set 1 100 50); - -#endif /* FINSH_USING_MSH */ - - -#endif /* RT_USING_FINSH */ diff --git a/components/drivers/misc/rt_drv_pwm.c b/components/drivers/misc/rt_drv_pwm.c new file mode 100644 index 0000000000..6884f8cfe4 --- /dev/null +++ b/components/drivers/misc/rt_drv_pwm.c @@ -0,0 +1,214 @@ +/* + * File : rt_drv_pwm.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2018, RT-Thread Development Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Change Logs: + * Date Author Notes + * 2018-05-07 aozima the first version + */ + +#include + +#include +#include + + +static rt_err_t _pwm_control(rt_device_t dev, int cmd, void *args) +{ + rt_err_t result = RT_EOK; + struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev; + + if (pwm->ops->control) + { + result = pwm->ops->control(pwm, cmd, args); + } + + return result; +} + + +/* +pos: channel +void *buffer: rt_uint32_t pulse[size] +size : number of pulse, only set to sizeof(rt_uint32_t). +*/ +static rt_size_t _pwm_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + rt_err_t result = RT_EOK; + struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev; + rt_uint32_t *pulse = (rt_uint32_t *)buffer; + struct rt_pwm_configuration configuration = {0}; + + configuration.channel = pos; + + if (pwm->ops->control) + { + result = pwm->ops->control(pwm, PWM_CMD_GET, &configuration); + if (result != RT_EOK) + { + return 0; + } + + *pulse = configuration.pulse; + } + + return size; +} + +/* +pos: channel +void *buffer: rt_uint32_t pulse[size] +size : number of pulse, only set to sizeof(rt_uint32_t). +*/ +static rt_size_t _pwm_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + rt_err_t result = RT_EOK; + struct rt_device_pwm *pwm = (struct rt_device_pwm *)dev; + rt_uint32_t *pulse = (rt_uint32_t *)buffer; + struct rt_pwm_configuration configuration = {0}; + + configuration.channel = pos; + + if (pwm->ops->control) + { + result = pwm->ops->control(pwm, PWM_CMD_GET, &configuration); + if (result != RT_EOK) + { + return 0; + } + + configuration.pulse = *pulse; + + result = pwm->ops->control(pwm, PWM_CMD_SET, &configuration); + if (result != RT_EOK) + { + return 0; + } + + } + + return size; +} + +rt_err_t rt_device_pwm_register(struct rt_device_pwm *device, const char *name, const struct rt_pwm_ops *ops, const void *user_data) +{ + rt_err_t result = RT_EOK; + + memset(device, 0, sizeof(struct rt_device_pwm)); + + device->parent.type = RT_Device_Class_Miscellaneous; + + device->parent.init = RT_NULL; + device->parent.open = RT_NULL; + device->parent.close = RT_NULL; + device->parent.read = _pwm_read; + device->parent.write = _pwm_write; + device->parent.control = _pwm_control; + + device->ops = ops; + device->parent.user_data = (void *)user_data; + + result = rt_device_register(&device->parent, name, RT_DEVICE_FLAG_RDWR); + + return result; +} + +rt_err_t rt_pwm_enable(int channel) +{ + rt_err_t result = RT_EOK; + struct rt_device *device = rt_device_find("pwm"); + struct rt_pwm_configuration configuration = {0}; + + if (!device) + { + return -RT_EIO; + } + + configuration.channel = channel; + result = rt_device_control(device, PWM_CMD_ENABLE, &configuration); + + return result; +} + +rt_err_t rt_pwm_set(int channel, rt_uint32_t period, rt_uint32_t pulse) +{ + rt_err_t result = RT_EOK; + struct rt_device *device = rt_device_find("pwm"); + struct rt_pwm_configuration configuration = {0}; + + if (!device) + { + return -RT_EIO; + } + + configuration.channel = channel; + configuration.period = period; + configuration.pulse = pulse; + result = rt_device_control(device, PWM_CMD_SET, &configuration); + + return result; +} + + +#ifdef RT_USING_FINSH +#include + +FINSH_FUNCTION_EXPORT_ALIAS(rt_pwm_enable, pwm_enable, enable pwm by channel.); +FINSH_FUNCTION_EXPORT_ALIAS(rt_pwm_set, pwm_set, set pwm.); + +#ifdef FINSH_USING_MSH +static int pwm_enable(int argc, char **argv) +{ + int result = 0; + + if (argc != 2) + { + rt_kprintf("Usage: pwm_enable 1\n"); + result = -RT_ERROR; + goto _exit; + } + + result = rt_pwm_enable(atoi(argv[1])); + +_exit: + return result; +} +MSH_CMD_EXPORT(pwm_enable, pwm_enable 1); + +static int pwm_set(int argc, char **argv) +{ + int result = 0; + + if (argc != 4) + { + rt_kprintf("Usage: pwm_set 1 100 50\n"); + result = -RT_ERROR; + goto _exit; + } + + result = rt_pwm_set(atoi(argv[1]), atoi(argv[2]), atoi(argv[3])); + +_exit: + return result; +} +MSH_CMD_EXPORT(pwm_set, pwm_set 1 100 50); + +#endif /* FINSH_USING_MSH */ + + +#endif /* RT_USING_FINSH */ -- cgit v1.3.1