VSF Documented
vsf_timer_gpio_pwm.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *x
15 * *
16 ****************************************************************************/
17
18#ifndef __HAL_DRIVER_TIMER_GPIO_PWM_H__
19#define __HAL_DRIVER_TIMER_GPIO_PWM_H__
20
21/* Implement PWM device driver with TIMER + GPIO
22 * PWMs are at the same frequency with different duty cycle.
23 * timer_gpio_multi_pwm not ready:
24 * Used to support multi pwm channels per timer, but will take more time in timer interrupt handler.
25 * timer_gpio_single_pwm:
26 * Used to support single pwm channel per timer.
27 */
28
29/*============================ INCLUDES ======================================*/
30
31#include "hal/vsf_hal_cfg.h"
32
33#if VSF_HAL_USE_PWM == ENABLED && VSF_HAL_USE_TIMER_GPIO_PWM == ENABLED
34
35// for VSF_MFOREACH
37
38#if defined(__VSF_HAL_TIMER_GPIO_PWM_CLASS_IMPLEMENT)
39# define __VSF_CLASS_IMPLEMENT__
40#endif
41
42#include "utilities/ooc_class.h"
43
44#ifdef __cplusplus
45extern "C" {
46#endif
47
48/*============================ MACROS ========================================*/
49
50#ifndef VSF_TIMER_GPIO_PWM_CFG_MULTI_CLASS
51# define VSF_TIMER_GPIO_PWM_CFG_MULTI_CLASS VSF_PWM_CFG_MULTI_CLASS
52#endif
53
54/*============================ MACROFIED FUNCTIONS ===========================*/
55
56#if VSF_TIMER_GPIO_PWM_CFG_MULTI_CLASS == ENABLED
57# define __VSF_TIMER_GPIO_MULTI_PWM_INIT_HALOP \
58 .vsf_pwm.op = &vsf_timer_gpio_multi_pwm_op,
59# define __VSF_TIMER_GPIO_SINGLE_PWM_INIT_HALOP \
60 .vsf_pwm.op = &vsf_timer_gpio_single_pwm_op,
61#else
62# define __VSF_TIMER_GPIO_MULTI_PWM_INIT_HALOP
63# define __VSF_TIMER_GPIO_SINGLE_PWM_INIT_HALOP
64#endif
65
66#define __VSF_TIMER_GPIO_MULTI_PWM_INIT(__TIMER, __GPIO_PORT, __CHANNEL_NUM, __CHANNELS)\
67 __VSF_TIMER_GPIO_MULTI_PWM_INIT_HALOP \
68 .timer = (vsf_timer_t *)(__TIMER), \
69 .gpio = (vsf_gpio_t *)(__GPIO_PORT), \
70 .channels = (__CHANNELS), \
71 .channel_num = (__CHANNEL_NUM),
72#define VSF_TIMER_GPIO_MULTI_PWM_INIT(__TIMER, __GPIO_PORT, __CHANNEL_NUM, __CHANNELS)\
73 __VSF_TIMER_GPIO_MULTI_PWM_INIT((__TIMER), (__GPIO_PORT), (__CHANNEL_NUM), (__CHANNELS))
74
75#define __describe_timer_gpio_multi_pwm_channel(__config) \
76 { .config = (__config) },
77
78#define __describe_timer_gpio_multi_pwm(__name, __timer, __gpio_port, ...) \
79 static vsf_timer_gpio_multi_pwm_channel_t VSF_MCONNECT3(__, __name, _channels)[] = {\
80 VSF_MFOREACH(__describe_timer_gpio_multi_pwm_channel, __VA_ARGS__)\
81 }; \
82 vsf_timer_gpio_multi_pwm_t __name = { \
83 VSF_TIMER_GPIO_MULTI_PWM_INIT((__timer), (__gpio_port), \
84 dimof(VSF_MCONNECT3(__, __name, _channels)), \
85 VSF_MCONNECT3(__, __name, _channels)) \
86 };
87
88#define describe_timer_gpio_multi_pwm(__name, __timer, __gpio_port, ...) \
89 __describe_timer_gpio_multi_pwm(__name, (__timer), (__gpio_port), __VA_ARGS__)
90
91
92#define __VSF_TIMER_GPIO_SINGLE_PWM_INIT(__TIMER, __FN_GPIO_CONTROL) \
93 __VSF_TIMER_GPIO_SINGLE_PWM_INIT_HALOP \
94 .timer = (vsf_timer_t *)(__TIMER), \
95 .gpio_control = (__FN_GPIO_CONTROL),
96#define VSF_TIMER_GPIO_SINGLE_PWM_INIT(__TIMER, __FN_GPIO_CONTROL) \
97 __VSF_TIMER_GPIO_SINGLE_PWM_INIT((__TIMER), (__FN_GPIO_CONTROL))
98
99#define __describe_timer_gpio_single_pwm(__name, __timer, __fn_gpio_control) \
100 vsf_timer_gpio_single_pwm_t __name = { \
101 VSF_TIMER_GPIO_SINGLE_PWM_INIT((__timer), (__fn_gpio_control)) \
102 };
103
104#define describe_timer_gpio_single_pwm(__name, __timer, __fn_gpio_control) \
105 __describe_timer_gpio_single_pwm(__name, (__timer), (__fn_gpio_control))
106
107/*============================ TYPES =========================================*/
108
109enum {
112};
113
115 public_member(
116 union {
117 struct {
118 uint8_t pin_idx : 7;
119 uint8_t reverse : 1;
120 };
121 uint8_t config;
122 };
124 private_member(
125 uint32_t pulse;
126 uint32_t pulse_shadow;
127 )
128};
129
131 public_member(
133 vsf_pwm_t vsf_pwm;
134#endif
135 vsf_timer_t *timer;
136 vsf_gpio_t *gpio;
138 uint8_t channel_num;
139 )
140 private_member(
141 bool enabled;
142 uint32_t period;
143 uint32_t freq;
144 uint32_t cur_pulse;
145 )
146};
147
149 public_member(
151 vsf_pwm_t vsf_pwm;
152#endif
153 vsf_timer_t *timer;
154 void (*gpio_control)(uint_fast8_t value);
155 uint8_t pin;
156 bool reverse;
157 )
158 private_member(
159 bool enabled;
160 bool update_egde;
161 bool timer_started;
162 uint32_t freq;
163 uint32_t period;
164 uint32_t pulse;
165 uint32_t period_shadow;
166 uint32_t pulse_shadow;
167 )
168};
169
170/*============================ GLOBAL VARIABLES ==============================*/
171
172#if VSF_TIMER_GPIO_PWM_CFG_MULTI_CLASS == ENABLED
175#endif
176
177/*============================ PROTOTYPES ====================================*/
178
179#ifdef __cplusplus
180}
181#endif
182
183#endif // VSF_HAL_USE_PWM && VSF_HAL_USE_TIMER_GPIO_PWM
184#endif
185/* EOF */
#define ENABLED
Definition __type.h:28
Definition vsf_timer_gpio_pwm.h:114
Definition vsf_timer_gpio_pwm.h:130
Definition vsf_timer_gpio_pwm.h:148
#define vsf_class(__name)
Definition ooc_class.h:48
unsigned char uint_fast8_t
Definition stdint.h:23
unsigned uint32_t
Definition stdint.h:9
unsigned char uint8_t
Definition stdint.h:5
Definition vsf_template_gpio.h:471
Definition vsf_template_pwm.h:113
Definition vsf_template_pwm.h:121
Definition vsf_template_timer.h:184
vk_av_control_value_t value
Definition vsf_audio.h:171
const vsf_pwm_op_t vsf_timer_gpio_single_pwm_op
@ VSF_TIMER_GPIO_PWM_NORMAL
Definition vsf_timer_gpio_pwm.h:110
@ VSF_TIMER_GPIO_PWM_REVERSE
Definition vsf_timer_gpio_pwm.h:111
const vsf_pwm_op_t vsf_timer_gpio_multi_pwm_op
#define VSF_TIMER_GPIO_PWM_CFG_MULTI_CLASS
Definition vsf_timer_gpio_pwm.h:51