VSF Documented
pwm_template.inc
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. *
15 * *
16 ****************************************************************************/
17
18#if VSF_HAL_USE_PWM == ENABLED
19
20/*============================ INCLUDES ======================================*/
21
22/*============================ MACROS ========================================*/
23
24#ifndef VSF_PWM_CFG_REIMPLEMENT_API_GET_CONFIGURATION
25# define VSF_PWM_CFG_REIMPLEMENT_API_GET_CONFIGURATION DISABLED
26#endif
27
28#ifndef VSF_PWM_CFG_REIMPLEMENT_API_CAPABILITY
29# define VSF_PWM_CFG_REIMPLEMENT_API_CAPABILITY DISABLED
30#endif
31
32#ifndef VSF_PWM_CFG_REIMPLEMENT_API_CTRL
33# define VSF_PWM_CFG_REIMPLEMENT_API_CTRL DISABLED
34#endif
35
36#ifdef VSF_PWM_CFG_IMP_REMAP_PREFIX
37# undef VSF_PWM_CFG_REIMPLEMENT_API_CAPABILITY
38# define VSF_PWM_CFG_REIMPLEMENT_API_CAPABILITY ENABLED
39# undef VSF_PWM_CFG_REIMPLEMENT_API_GET_CONFIGURATION
40# define VSF_PWM_CFG_REIMPLEMENT_API_GET_CONFIGURATION ENABLED
41# undef VSF_PWM_CFG_REIMPLEMENT_API_CTRL
42# define VSF_PWM_CFG_REIMPLEMENT_API_CTRL ENABLED
43#endif
44
45#if VSF_PWM_CFG_REIMPLEMENT_API_CAPABILITY == DISABLEDs
46# ifndef VSF_PWM_CFG_CAPABILITY_MIN_FREQ
47# define VSF_PWM_CFG_CAPABILITY_MIN_FREQ (1ul * 1000)
48# endif
49# ifndef VSF_PWM_CFG_CAPABILITY_MAX_FREQ
50# define VSF_PWM_CFG_CAPABILITY_MAX_FREQ (10ul * 1000 * 1000)
51# endif
52#endif
53
54#if defined(VSF_PWM_CFG_IMP_RENAME_DEVICE_PREFIX) && (VSF_PWM_CFG_IMP_RENAME_DEVICE_PREFIX == ENABLED)
55# define vsf_real_pwm_t VSF_MCONNECT(VSF_PWM_CFG_IMP_DEVICE_PREFIX, _t)
56# define vsf_real_pwm_set VSF_MCONNECT(VSF_PWM_CFG_IMP_DEVICE_PREFIX, _set)
57# define vsf_real_pwm_get_freq VSF_MCONNECT(VSF_PWM_CFG_IMP_DEVICE_PREFIX, _get_freq)
58# define vsf_real_pwm_capability VSF_MCONNECT(VSF_PWM_CFG_IMP_DEVICE_PREFIX, _capability)
59# define vsf_real_pwm_ctrl VSF_MCONNECT(VSF_PWM_CFG_IMP_DEVICE_PREFIX, _ctrl)
60# define vsf_real_pwm_get_configuration VSF_MCONNECT(VSF_PWM_CFG_IMP_DEVICE_PREFIX, _get_configuration)
61#else
62# define vsf_real_pwm_t VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_t)
63# define vsf_real_pwm_set VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_set)
64# define vsf_real_pwm_get_freq VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_get_freq)
65# define vsf_real_pwm_capability VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_capability)
66# define vsf_real_pwm_ctrl VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_ctrl)
67# define vsf_real_pwm_get_configuration VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_get_configuration)
68#endif
69
70/*============================ MACROFIED FUNCTIONS ===========================*/
71/*============================ TYPES =========================================*/
72/*============================ GLOBAL VARIABLES ==============================*/
73/*============================ LOCAL VARIABLES ===============================*/
74/*============================ PROTOTYPES ====================================*/
75/*============================ IMPLEMENTATION ================================*/
76
77#if VSF_PWM_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
78vsf_pwm_capability_t vsf_real_pwm_capability(vsf_real_pwm_t *pwm_ptr)
79{
80 vsf_pwm_capability_t pwm_capability = {
83 };
84
85 return pwm_capability;
86}
87#endif
88
89#if VSF_PWM_CFG_REIMPLEMENT_API_CTRL == DISABLED
90vsf_err_t vsf_real_pwm_ctrl(vsf_real_pwm_t *pwm_ptr, vsf_pwm_ctrl_t ctrl, void *param)
91{
92 VSF_HAL_ASSERT(NULL != pwm_ptr);
93
94 // Default implementation: not supported, trigger assertion
96
98}
99#endif
100
101#if VSF_PWM_CFG_REIMPLEMENT_API_GET_CONFIGURATION == DISABLED
102vsf_err_t vsf_real_pwm_get_configuration(vsf_real_pwm_t *pwm_ptr, vsf_pwm_cfg_t *cfg_ptr)
103{
104 VSF_HAL_ASSERT(NULL != pwm_ptr);
105 VSF_HAL_ASSERT(NULL != cfg_ptr);
106 VSF_HAL_ASSERT(0); // Default implementation: not supported, trigger assertion
107 return VSF_ERR_NOT_SUPPORT;
108}
109#endif
110
111/*============================ MACROS ========================================*/
112
113#undef VSF_PWM_CFG_REIMPLEMENT_TYPE_CAPABILITY
114#undef VSF_PWM_CFG_REIMPLEMENT_TYPE_CFG
115#undef VSF_PWM_CFG_REIMPLEMENT_TYPE_CTRL
116#undef VSF_PWM_CFG_REIMPLEMENT_API_CAPABILITY
117#undef VSF_PWM_CFG_REIMPLEMENT_API_CTRL
118#undef VSF_PWM_CFG_REIMPLEMENT_API_GET_CONFIGURATION
119#undef VSF_PWM_CFG_CAPABILITY_MAX_FREQ
120#undef VSF_PWM_CFG_CAPABILITY_MIN_FREQ
121#undef vsf_real_pwm_t
122#undef vsf_real_pwm_set
123#undef vsf_real_pwm_get_freq
124#undef vsf_real_pwm_capability
125#undef vsf_real_pwm_ctrl
126#undef vsf_real_pwm_get_configuration
127
128/*============================ MACROS ========================================*/
129
130#ifdef VSF_PWM_CFG_IMP_REMAP_PREFIX
131
132# define vsf_imp_pwm_t VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_t)
133# define vsf_imp_pwm_init VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_init)
134# define vsf_imp_pwm_fini VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_fini)
135# define vsf_imp_pwm_enable VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_enable)
136# define vsf_imp_pwm_disable VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_disable)
137# define vsf_imp_pwm_capability VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_capability)
138# define vsf_imp_pwm_set VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_set)
139# define vsf_imp_pwm_get_freq VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_get_freq)
140# define vsf_imp_pwm_get_configuration VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_get_configuration)
141# define vsf_imp_pwm_ctrl VSF_MCONNECT(VSF_PWM_CFG_IMP_PREFIX, _pwm_ctrl)
142
143# define vsf_remap_pwm_t VSF_MCONNECT(VSF_PWM_CFG_IMP_REMAP_PREFIX, _pwm_t)
144# define vsf_remap_pwm_init VSF_MCONNECT(VSF_PWM_CFG_IMP_REMAP_PREFIX, _pwm_init)
145# define vsf_remap_pwm_fini VSF_MCONNECT(VSF_PWM_CFG_IMP_REMAP_PREFIX, _pwm_fini)
146# define vsf_remap_pwm_enable VSF_MCONNECT(VSF_PWM_CFG_IMP_REMAP_PREFIX, _pwm_enable)
147# define vsf_remap_pwm_disable VSF_MCONNECT(VSF_PWM_CFG_IMP_REMAP_PREFIX, _pwm_disable)
148# define vsf_remap_pwm_capability VSF_MCONNECT(VSF_PWM_CFG_IMP_REMAP_PREFIX, _pwm_capability)
149# define vsf_remap_pwm_set VSF_MCONNECT(VSF_PWM_CFG_IMP_REMAP_PREFIX, _pwm_set)
150# define vsf_remap_pwm_get_freq VSF_MCONNECT(VSF_PWM_CFG_IMP_REMAP_PREFIX, _pwm_get_freq)
151# define vsf_remap_pwm_get_configuration VSF_MCONNECT(VSF_PWM_CFG_IMP_REMAP_PREFIX, _pwm_get_configuration)
152# define vsf_remap_pwm_ctrl VSF_MCONNECT(VSF_PWM_CFG_IMP_REMAP_PREFIX, _pwm_ctrl)
153
154# define VSF_PWM_CFG_IMP_REMAP_FUNCTIONS \
155 vsf_err_t vsf_imp_pwm_init(vsf_imp_pwm_t *pwm_ptr, vsf_pwm_cfg_t *cfg_ptr) \
156 { \
157 VSF_HAL_ASSERT(pwm_ptr != NULL); \
158 return vsf_remap_pwm_init(pwm_ptr, cfg_ptr); \
159 } \
160 void vsf_imp_pwm_fini(vsf_imp_pwm_t *pwm_ptr) \
161 { \
162 VSF_HAL_ASSERT(pwm_ptr != NULL); \
163 vsf_remap_pwm_fini(pwm_ptr); \
164 } \
165 fsm_rt_t vsf_imp_pwm_enable(vsf_imp_pwm_t *pwm_ptr) \
166 { \
167 VSF_HAL_ASSERT(pwm_ptr != NULL); \
168 return vsf_remap_pwm_enable(pwm_ptr); \
169 } \
170 fsm_rt_t vsf_imp_pwm_disable(vsf_imp_pwm_t *pwm_ptr) \
171 { \
172 VSF_HAL_ASSERT(pwm_ptr != NULL); \
173 return vsf_remap_pwm_disable(pwm_ptr); \
174 } \
175 vsf_pwm_capability_t vsf_imp_pwm_capability(vsf_imp_pwm_t *pwm_ptr) \
176 { \
177 VSF_HAL_ASSERT(pwm_ptr != NULL); \
178 return vsf_remap_pwm_capability(pwm_ptr); \
179 } \
180 vsf_err_t vsf_imp_pwm_set(vsf_imp_pwm_t *pwm_ptr, uint8_t channel, \
181 uint32_t period, uint32_t pulse) \
182 { \
183 VSF_HAL_ASSERT(pwm_ptr != NULL); \
184 return vsf_remap_pwm_set(pwm_ptr, channel, period, pulse); \
185 } \
186 uint32_t vsf_imp_pwm_get_freq(vsf_imp_pwm_t *pwm_ptr) \
187 { \
188 VSF_HAL_ASSERT(pwm_ptr != NULL); \
189 return vsf_remap_pwm_get_freq(pwm_ptr); \
190 } \
191 \
192 vsf_err_t vsf_imp_pwm_get_configuration(vsf_imp_pwm_t *pwm_ptr, vsf_pwm_cfg_t *cfg_ptr) \
193 { \
194 VSF_HAL_ASSERT(pwm_ptr != NULL); \
195 return vsf_remap_pwm_get_configuration(pwm_ptr, cfg_ptr); \
196 } \
197 vsf_err_t vsf_imp_pwm_ctrl(vsf_imp_pwm_t *pwm_ptr, vsf_pwm_ctrl_t ctrl, void *param) \
198 { \
199 VSF_HAL_ASSERT(pwm_ptr != NULL); \
200 return vsf_remap_pwm_ctrl(pwm_ptr, ctrl, param); \
201 }
202#endif
203
204
205/*============================ GLOBAL VARIABLES ==============================*/
206
207#define VSF_HAL_TEMPLATE_IMP_NAME _pwm
208#define VSF_HAL_TEMPLATE_IMP_UPCASE_NAME _PWM
209
210#if !defined(VSF_PWM_CFG_IMP_PREFIX) && !defined(VSF_PWM_CFG_IMP_DEVICE_PREFIX)
211# error "Please define VSF_PWM_CFG_IMP_PREFIX in pwm driver"
212#endif
213
214#if !defined(VSF_PWM_CFG_IMP_UPCASE_PREFIX) && !defined(VSF_PWM_CFG_IMP_DEVICE_UPCASE_PREFIX)
215# error "Please define VSF_PWM_CFG_IMP_UPCASE_PREFIX in pwm driver"
216#endif
217
218#ifndef VSF_PWM_CFG_IMP_COUNT_MASK_PREFIX
219# define VSF_PWM_CFG_IMP_COUNT_MASK_PREFIX VSF_PWM_CFG_IMP_UPCASE_PREFIX
220#endif
221
222#ifdef VSF_PWM_CFG_IMP_REMAP_FUNCTIONS
223# define VSF_HAL_CFG_IMP_REMAP_FUNCTIONS VSF_PWM_CFG_IMP_REMAP_FUNCTIONS
224#endif
225
227
228#undef VSF_PWM_CFG_IMP_PREFIX
229#undef VSF_PWM_CFG_IMP_COUNT_MASK_PREFIX
230#undef VSF_PWM_CFG_IMP_UPCASE_PREFIX
231#undef VSF_PWM_CFG_IMP_DEVICE_PREFIX
232#undef VSF_PWM_CFG_IMP_DEVICE_UPCASE_PREFIX
233#undef VSF_PWM_CFG_IMP_LV0
234#undef VSF_PWM_CFG_IMP_REMAP_FUNCTIONS
235#undef VSF_PWM_CFG_IMP_HAS_OP
236#undef VSF_PWM_CFG_IMP_EXTERN_OP
237#undef VSF_PWM_CFG_IMP_RENAME_DEVICE_PREFIX
238
239#undef vsf_imp_pwm_t
240#undef vsf_imp_pwm_init
241#undef vsf_imp_pwm_fini
242#undef vsf_imp_pwm_enable
243#undef vsf_imp_pwm_disable
244#undef vsf_imp_pwm_capability
245#undef vsf_imp_pwm_set
246#undef vsf_imp_pwm_get_freq
247#undef vsf_imp_pwm_get_configuration
248#undef vsf_imp_pwm_ctrl
249
250#undef vsf_remap_pwm_t
251#undef vsf_remap_pwm_init
252#undef vsf_remap_pwm_fini
253#undef vsf_remap_pwm_enable
254#undef vsf_remap_pwm_disable
255#undef vsf_remap_pwm_capability
256#undef vsf_remap_pwm_set
257#undef vsf_remap_pwm_get_freq
258#undef vsf_remap_pwm_get_configuration
259#undef vsf_remap_pwm_ctrl
260
261#undef VSF_HAL_TEMPLATE_IMP_NAME
262#undef VSF_HAL_TEMPLATE_IMP_UPCASE_NAME
263
264/*============================ STATIC ASSERTIONS ==============================*/
265
266/* User-extensible macros for custom mode and IRQ mask values
267 * Users can define these macros before including this template to append
268 * their custom enum values to the uniqueness checks.
269 *
270 * Check modes for custom values:
271 * VSF_PWM_CFG_MODE_CHECK_UNIQUE - Check mode for custom mode values
272 * Default: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
273 * Can be set to: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
274 * VSF_PWM_CFG_IRQ_MASK_CHECK_UNIQUE - Check mode for custom IRQ mask values
275 * Default: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
276 * Can be set to: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
277 *
278 * Example usage in vendor driver:
279 * #define VSF_PWM_CUSTOM_MODE_VALUES MY_CUSTOM_MODE1, MY_CUSTOM_MODE2
280 * #define VSF_PWM_CFG_MODE_CHECK_UNIQUE VSF_HAL_CHECK_MODE_LOOSE
281 * #define VSF_PWM_CUSTOM_IRQ_MASK_VALUES MY_CUSTOM_IRQ1, MY_CUSTOM_IRQ2
282 * #define VSF_PWM_CFG_IRQ_MASK_CHECK_UNIQUE VSF_HAL_CHECK_MODE_STRICT
283 * #include "hal/driver/common/pwm/pwm_template.inc"
284 */
285
286
287#ifdef VSF_PWM_CFG_MODE_CHECK_UNIQUE
288/* Default mode lists - can be redefined by users before including this file */
289/* Note: PWM typically doesn't have mode enums, but custom modes can be added */
290
291#ifdef VSF_PWM_CUSTOM_MODE_VALUES
292/* Check uniqueness among custom mode values using user-specified check mode */
294#endif
295#endif /* VSF_PWM_CFG_MODE_CHECK_UNIQUE */
296
297/* ==================== IRQ MASK UNIQUENESS CHECKS ==================== */
298
299#ifdef VSF_PWM_CFG_IRQ_MASK_CHECK_UNIQUE
300
301#ifdef VSF_PWM_CUSTOM_IRQ_MASK_VALUES
302/* Check uniqueness among custom IRQ mask values using user-specified check mode */
304#endif
305
306/* Note: PWM typically doesn't have a standard IRQ mask enum, but custom IRQ masks can be added */
307#endif /* VSF_PWM_CFG_IRQ_MASK_CHECK_UNIQUE */
308
309#undef VSF_PWM_CFG_MODE_CHECK_UNIQUE
310#undef VSF_PWM_CFG_IRQ_MASK_CHECK_UNIQUE
311#undef VSF_PWM_CUSTOM_MODE_VALUES
312#undef VSF_PWM_CUSTOM_IRQ_MASK_VALUES
313
314#endif /* VSF_HAL_USE_PWM */
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NOT_SUPPORT
function not supported
Definition __type.h:46
#define VSF_PWM_CFG_CAPABILITY_MIN_FREQ
Definition aic_pwm.c:139
#define VSF_PWM_CFG_CAPABILITY_MAX_FREQ
Definition aic_pwm.c:138
#define NULL
Definition lvgl.h:26
PWM capability structure. Describes the capabilities and limitations of the PWM hardware.
Definition vsf_template_pwm.h:204
uint32_t min_freq
Minimum supported PWM frequency in Hz. The lower limit of the PWM generator's frequency range.
Definition vsf_template_pwm.h:227
PWM configuration structure. Used to configure the PWM generator's frequency settings.
Definition vsf_template_pwm.h:170
#define VSF_PWM_CFG_IRQ_MASK_CHECK_UNIQUE
Definition pwm.c:193
#define VSF_PWM_CFG_MODE_CHECK_UNIQUE
Definition pwm.c:192
#define VSF_HAL_ASSERT(__CON)
all hal modules use this configuration file
Definition vsf_hal_cfg.h:36
vsf_pwm_ctrl_t
PWM control commands for hardware-specific operations.
Definition vsf_template_pwm.h:240
#define VSF_HAL_CHECK_UNIQUE_CUSTOM(__CHECK_FUNC,...)
Definition vsf_template_static_assert_unique.h:2426
Generated from commit: vsfteam/vsf@85be636