From e5a8945f0314d4a7b9b81ff198f8cdebeabcefc0 Mon Sep 17 00:00:00 2001 From: Hauke Petersen Date: Mon, 3 Feb 2014 19:35:37 +0100 Subject: [PATCH 1/3] Initial import of low-level PWM driver interface --- drivers/include/periph/pwm.h | 100 +++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 drivers/include/periph/pwm.h diff --git a/drivers/include/periph/pwm.h b/drivers/include/periph/pwm.h new file mode 100644 index 0000000000..3e9c4b5933 --- /dev/null +++ b/drivers/include/periph/pwm.h @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2014 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the LGPLv2 License. + * See the file LICENSE in the top level directory for more details. + */ + +/** + * @ingroup driver_periph + * @brief Low-level PWM periphial driver + * @{ + * + * @file pwm.h + * @brief Low-level PWM periphial driver interface definitions + * + * @author Hauke Petersen + */ + +#ifndef __PWM_H +#define __PWM_H + +#include "periph_conf.h" + + +/** + * @brief Definition of available PWM devices + */ +#ifdef PWM_NUMOF +typedef enum { +#ifdef PWM_0_EN + PWM_0, ///< first PWM device +#endif +#ifdef PWM_1_EN + PWM_1 ///< Second PWM device +#endif +} pwm_t; +#endif + +/** + * @brief Definition of availabe PWM modes + */ +typedef enum { + PWM_LEFT, ///< use left aligned PWM + PWM_RIGHT, ///< use right aligned PWM + PWM_CENTER ///< use center aligned PWM +} pwm_mode_t; + + +/** + * @brief Initialize a PWM device + * + * The PWM module is based on virtual PWM devices, which can have one or more channels. + * The PWM devices can be configured to run with a given frequency and resolution, which + * are always identical for the complete device, hence for every channel on a device. + * + * The desired frequency and resolution may not be possible on a given device when chosen + * to large. In this case the PWM driver will always keep the resolution and decrease the + * frequency if needed. To veryfy the correct settings compare the returned value which + * is the actually set frequency. + * + * @param dev PWM channel to initialize + * @param mode PWM mode, left, right or center aligned + * @param frequency the PWM frequency in Hz + * @param resolution the PWM resolution + * @return the acutally set frequency, + * 0 if frequency and resolution settings are not applicable, + * -1 on error + */ +int pwm_init(pwm_t dev, pwm_mode_t mode, unsigned int frequency, unsigned int resolution); + +/** + * @brief Set the duty-cycle for a given channel of the given PWM device + * + * The duty-cycle is set in relation to the chosen resolution of the given device. If + * value > resolution, value is set to resolution. + * + * @param dev the PWM device to set + * @param channel the channel of the given device to set + * @param value the desired duty-cycle to set + * @return the acutally set duty-cycle, -1 on invalic device or channel + */ +int pwm_set(pwm_t dev, int channel, unsigned int value); + +/** + * @brief Start PWM generation on the given device + * + * @param dev device to start + */ +void pwm_start(pwm_t dev); + +/** + * @brief Stop PWM generation on the given deivce + * + * @param dev device to stop + */ +void pwm_stop(pwm_t dev); + + +#endif /* __PWM_H */ +/** @} */ From cd27639ee33a717dc56a7f29c1e663bb7ed315cd Mon Sep 17 00:00:00 2001 From: Hauke Petersen Date: Tue, 4 Feb 2014 18:52:53 +0100 Subject: [PATCH 2/3] Fixed spelling --- drivers/include/periph/pwm.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/include/periph/pwm.h b/drivers/include/periph/pwm.h index 3e9c4b5933..97841e354b 100644 --- a/drivers/include/periph/pwm.h +++ b/drivers/include/periph/pwm.h @@ -7,11 +7,11 @@ /** * @ingroup driver_periph - * @brief Low-level PWM periphial driver + * @brief Low-level PWM peripheral driver * @{ * * @file pwm.h - * @brief Low-level PWM periphial driver interface definitions + * @brief Low-level PWM peripheral driver interface definitions * * @author Hauke Petersen */ @@ -37,7 +37,7 @@ typedef enum { #endif /** - * @brief Definition of availabe PWM modes + * @brief Definition of available PWM modes */ typedef enum { PWM_LEFT, ///< use left aligned PWM @@ -55,14 +55,14 @@ typedef enum { * * The desired frequency and resolution may not be possible on a given device when chosen * to large. In this case the PWM driver will always keep the resolution and decrease the - * frequency if needed. To veryfy the correct settings compare the returned value which + * frequency if needed. To verify the correct settings compare the returned value which * is the actually set frequency. * * @param dev PWM channel to initialize * @param mode PWM mode, left, right or center aligned * @param frequency the PWM frequency in Hz * @param resolution the PWM resolution - * @return the acutally set frequency, + * @return the actually set frequency, * 0 if frequency and resolution settings are not applicable, * -1 on error */ @@ -77,7 +77,7 @@ int pwm_init(pwm_t dev, pwm_mode_t mode, unsigned int frequency, unsigned int re * @param dev the PWM device to set * @param channel the channel of the given device to set * @param value the desired duty-cycle to set - * @return the acutally set duty-cycle, -1 on invalic device or channel + * @return the actually set duty-cycle, -1 on invalid device or channel */ int pwm_set(pwm_t dev, int channel, unsigned int value); @@ -89,7 +89,7 @@ int pwm_set(pwm_t dev, int channel, unsigned int value); void pwm_start(pwm_t dev); /** - * @brief Stop PWM generation on the given deivce + * @brief Stop PWM generation on the given device * * @param dev device to stop */ From cfc9ef459db52de9b73e1cd72d9c2a85b5cae83a Mon Sep 17 00:00:00 2001 From: Hauke Petersen Date: Wed, 26 Mar 2014 17:11:24 +0100 Subject: [PATCH 3/3] drivers: small fixes for low-level pwm driver IF - added UNDEFINED device for compatability - adjusted meaning of return values for init and set functions - overdue spell fix --- drivers/include/periph/pwm.h | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/drivers/include/periph/pwm.h b/drivers/include/periph/pwm.h index 97841e354b..1a3dee8108 100644 --- a/drivers/include/periph/pwm.h +++ b/drivers/include/periph/pwm.h @@ -24,25 +24,32 @@ /** * @brief Definition of available PWM devices + * + * To this point a maximum of four PWM device is available. */ -#ifdef PWM_NUMOF typedef enum { -#ifdef PWM_0_EN - PWM_0, ///< first PWM device +#if PWM_0_EN + PWM_0, /*< 1st PWM device */ #endif -#ifdef PWM_1_EN - PWM_1 ///< Second PWM device +#if PWM_1_EN + PWM_1, /*< 2nd PWM device */ #endif +#if PWM_2_EN + PWM_2, /*< 3rd PWM device */ +#endif +#if PWM_3_EN + PWM_3, /*< 4th PWM device */ +#endif + PWM_UNDEFINED } pwm_t; -#endif /** * @brief Definition of available PWM modes */ typedef enum { - PWM_LEFT, ///< use left aligned PWM - PWM_RIGHT, ///< use right aligned PWM - PWM_CENTER ///< use center aligned PWM + PWM_LEFT, /*< use left aligned PWM */ + PWM_RIGHT, /*< use right aligned PWM */ + PWM_CENTER /*< use center aligned PWM */ } pwm_mode_t; @@ -54,7 +61,7 @@ typedef enum { * are always identical for the complete device, hence for every channel on a device. * * The desired frequency and resolution may not be possible on a given device when chosen - * to large. In this case the PWM driver will always keep the resolution and decrease the + * too large. In this case the PWM driver will always keep the resolution and decrease the * frequency if needed. To verify the correct settings compare the returned value which * is the actually set frequency. * @@ -62,9 +69,8 @@ typedef enum { * @param mode PWM mode, left, right or center aligned * @param frequency the PWM frequency in Hz * @param resolution the PWM resolution - * @return the actually set frequency, - * 0 if frequency and resolution settings are not applicable, - * -1 on error + * @return 0 on success, -1 if requested mode and/or frequency and resolution + * not applicable */ int pwm_init(pwm_t dev, pwm_mode_t mode, unsigned int frequency, unsigned int resolution); @@ -77,7 +83,7 @@ int pwm_init(pwm_t dev, pwm_mode_t mode, unsigned int frequency, unsigned int re * @param dev the PWM device to set * @param channel the channel of the given device to set * @param value the desired duty-cycle to set - * @return the actually set duty-cycle, -1 on invalid device or channel + * @return 0 on success, -1 on invalid device or channel */ int pwm_set(pwm_t dev, int channel, unsigned int value);