15#ifndef ZEPHYR_INCLUDE_DRIVERS_PWM_H_
16#define ZEPHYR_INCLUDE_DRIVERS_PWM_H_
56#define PWM_CAPTURE_TYPE_SHIFT 1U
57#define PWM_CAPTURE_TYPE_MASK (3U << PWM_CAPTURE_TYPE_SHIFT)
58#define PWM_CAPTURE_MODE_SHIFT 3U
59#define PWM_CAPTURE_MODE_MASK (1U << PWM_CAPTURE_MODE_SHIFT)
63#define PWM_CAPTURE_TYPE_PERIOD (1U << PWM_CAPTURE_TYPE_SHIFT)
66#define PWM_CAPTURE_TYPE_PULSE (2U << PWM_CAPTURE_TYPE_SHIFT)
69#define PWM_CAPTURE_TYPE_BOTH (PWM_CAPTURE_TYPE_PERIOD | \
70 PWM_CAPTURE_TYPE_PULSE)
73#define PWM_CAPTURE_MODE_SINGLE (0U << PWM_CAPTURE_MODE_SHIFT)
76#define PWM_CAPTURE_MODE_CONTINUOUS (1U << PWM_CAPTURE_MODE_SHIFT)
86#define PWM_EVENT_TYPE_SHIFT 0U
89#define PWM_EVENT_TYPE_PERIOD (1U << PWM_EVENT_TYPE_SHIFT)
97#define PWM_EVENT_TYPE_FAULT (2U << PWM_EVENT_TYPE_SHIFT)
103#define PWM_EVENT_TYPE_COMPARE_CAPTURE (4U << PWM_EVENT_TYPE_SHIFT)
196#define PWM_DT_SPEC_GET_BY_NAME(node_id, name) \
198 .dev = DEVICE_DT_GET(DT_PWMS_CTLR_BY_NAME(node_id, name)), \
199 .channel = DT_PWMS_CHANNEL_BY_NAME(node_id, name), \
200 .period = DT_PWMS_PERIOD_BY_NAME(node_id, name), \
201 .flags = DT_PWMS_FLAGS_BY_NAME(node_id, name), \
216#define PWM_DT_SPEC_INST_GET_BY_NAME(inst, name) \
217 PWM_DT_SPEC_GET_BY_NAME(DT_DRV_INST(inst), name)
237#define PWM_DT_SPEC_GET_BY_NAME_OR(node_id, name, default_value) \
238 COND_CODE_1(DT_NODE_HAS_PROP(node_id, pwms), \
239 (PWM_DT_SPEC_GET_BY_NAME(node_id, name)), \
256#define PWM_DT_SPEC_INST_GET_BY_NAME_OR(inst, name, default_value) \
257 PWM_DT_SPEC_GET_BY_NAME_OR(DT_DRV_INST(inst), name, default_value)
301#define PWM_DT_SPEC_GET_BY_IDX(node_id, idx) \
303 .dev = DEVICE_DT_GET(DT_PWMS_CTLR_BY_IDX(node_id, idx)), \
304 .channel = DT_PWMS_CHANNEL_BY_IDX(node_id, idx), \
305 .period = DT_PWMS_PERIOD_BY_IDX(node_id, idx), \
306 .flags = DT_PWMS_FLAGS_BY_IDX(node_id, idx), \
320#define PWM_DT_SPEC_INST_GET_BY_IDX(inst, idx) \
321 PWM_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst), idx)
340#define PWM_DT_SPEC_GET_BY_IDX_OR(node_id, idx, default_value) \
341 COND_CODE_1(DT_NODE_HAS_PROP(node_id, pwms), \
342 (PWM_DT_SPEC_GET_BY_IDX(node_id, idx)), \
358#define PWM_DT_SPEC_INST_GET_BY_IDX_OR(inst, idx, default_value) \
359 PWM_DT_SPEC_GET_BY_IDX_OR(DT_DRV_INST(inst), idx, default_value)
371#define PWM_DT_SPEC_GET(node_id) PWM_DT_SPEC_GET_BY_IDX(node_id, 0)
383#define PWM_DT_SPEC_INST_GET(inst) PWM_DT_SPEC_GET(DT_DRV_INST(inst))
397#define PWM_DT_SPEC_GET_OR(node_id, default_value) \
398 PWM_DT_SPEC_GET_BY_IDX_OR(node_id, 0, default_value)
412#define PWM_DT_SPEC_INST_GET_OR(inst, default_value) \
413 PWM_DT_SPEC_GET_OR(DT_DRV_INST(inst), default_value)
438 int status,
void *user_data);
506#if defined(CONFIG_PWM_CAPTURE) || defined(__DOXYGEN__)
530#if defined(CONFIG_PWM_EVENT) || defined(__DOXYGEN__)
551#if defined(CONFIG_PWM_CAPTURE) || defined(__DOXYGEN__)
568#if defined(CONFIG_PWM_EVENT) || defined(__DOXYGEN__)
615static inline int z_impl_pwm_set_cycles(
const struct device *dev,
622 if (pulse > period) {
626 return api->set_cycles(dev, channel, period, pulse,
flags);
643static inline int z_impl_pwm_get_cycles_per_sec(
const struct device *dev,
650 return api->get_cycles_per_sec(dev, channel, cycles);
682 period_cycles = (period * cycles_per_sec) /
NSEC_PER_SEC;
771 *usec = temp / cycles_per_sec;
804 *nsec = temp / cycles_per_sec;
809#if defined(CONFIG_PWM_CAPTURE) || defined(__DOXYGEN__)
874#ifdef CONFIG_PWM_CAPTURE
875static inline int z_impl_pwm_enable_capture(
const struct device *dev,
881 if (api->enable_capture ==
NULL) {
885 return api->enable_capture(dev, channel);
904#ifdef CONFIG_PWM_CAPTURE
905static inline int z_impl_pwm_disable_capture(
const struct device *dev,
911 if (api->disable_capture ==
NULL) {
915 return api->disable_capture(dev, channel);
985 &pulse_cycles, timeout);
1039 &pulse_cycles, timeout);
1057#if defined(CONFIG_PWM_EVENT) || defined(__DOXYGEN__)
1072 __ASSERT_NO_MSG(callback !=
NULL);
1073 __ASSERT_NO_MSG(handler !=
NULL);
1152#include <zephyr/syscalls/pwm.h>
#define NSEC_PER_SEC
number of nanoseconds per second
Definition clock.h:113
#define USEC_PER_SEC
number of microseconds per second
Definition clock.h:110
bool device_is_ready(const struct device *dev)
Verify that a device is ready for use.
int(* pwm_set_cycles_t)(const struct device *dev, uint32_t channel, uint32_t period_cycles, uint32_t pulse_cycles, pwm_flags_t flags)
Callback API to configure PWM pin period and pulse width.
Definition pwm.h:495
int(* pwm_disable_capture_t)(const struct device *dev, uint32_t channel)
Callback API to disable PWM capture.
Definition pwm.h:526
int(* pwm_get_cycles_per_sec_t)(const struct device *dev, uint32_t channel, uint64_t *cycles)
Callback API to obtain PWM cycles per second (frequency).
Definition pwm.h:503
int(* pwm_manage_event_callback_t)(const struct device *dev, struct pwm_event_callback *callback, bool set)
Callback API to manage event callbacks.
Definition pwm.h:535
int(* pwm_configure_capture_t)(const struct device *dev, uint32_t channel, pwm_flags_t flags, pwm_capture_callback_handler_t cb, void *user_data)
Callback API to configure PWM capture.
Definition pwm.h:511
int(* pwm_enable_capture_t)(const struct device *dev, uint32_t channel)
Callback API to enable PWM capture.
Definition pwm.h:520
int pwm_capture_cycles(const struct device *dev, uint32_t channel, pwm_flags_t flags, uint32_t *period, uint32_t *pulse, k_timeout_t timeout)
Capture a single PWM period/pulse width in clock cycles for a single PWM input.
static int pwm_add_event_callback(const struct device *dev, struct pwm_event_callback *callback)
Add an application event callback.
Definition pwm.h:1094
int pwm_disable_capture(const struct device *dev, uint32_t channel)
Disable PWM period/pulse width capture for a single PWM input.
static int pwm_set_dt(const struct pwm_dt_spec *spec, uint32_t period, uint32_t pulse)
Set the period and pulse width in nanoseconds from a struct pwm_dt_spec (with custom period).
Definition pwm.h:715
void(* pwm_capture_callback_handler_t)(const struct device *dev, uint32_t channel, uint32_t period_cycles, uint32_t pulse_cycles, int status, void *user_data)
PWM capture callback handler function signature.
Definition pwm.h:434
int pwm_get_cycles_per_sec(const struct device *dev, uint32_t channel, uint64_t *cycles)
Get the clock rate (cycles per second) for a single PWM output.
static int pwm_capture_usec(const struct device *dev, uint32_t channel, pwm_flags_t flags, uint64_t *period, uint64_t *pulse, k_timeout_t timeout)
Capture a single PWM period/pulse width in microseconds for a single PWM input.
Definition pwm.h:976
uint16_t pwm_events_t
Provides a type to hold PWM events.
Definition pwm.h:124
static int pwm_capture_nsec(const struct device *dev, uint32_t channel, pwm_flags_t flags, uint64_t *period, uint64_t *pulse, k_timeout_t timeout)
Capture a single PWM period/pulse width in nanoseconds for a single PWM input.
Definition pwm.h:1030
static int pwm_cycles_to_nsec(const struct device *dev, uint32_t channel, uint32_t cycles, uint64_t *nsec)
Convert from PWM cycles to nanoseconds.
Definition pwm.h:788
static bool pwm_is_ready_dt(const struct pwm_dt_spec *spec)
Validate that the PWM device is ready.
Definition pwm.h:1139
static int pwm_remove_event_callback(const struct device *dev, struct pwm_event_callback *callback)
Remove an application event callback.
Definition pwm.h:1118
static int pwm_set_pulse_dt(const struct pwm_dt_spec *spec, uint32_t pulse)
Set the period and pulse width in nanoseconds from a struct pwm_dt_spec.
Definition pwm.h:736
static int pwm_configure_capture(const struct device *dev, uint32_t channel, pwm_flags_t flags, pwm_capture_callback_handler_t cb, void *user_data)
Configure PWM period/pulse width capture for a single PWM input.
Definition pwm.h:837
int pwm_enable_capture(const struct device *dev, uint32_t channel)
Enable PWM period/pulse width capture for a single PWM input.
static int pwm_set(const struct device *dev, uint32_t channel, uint32_t period, uint32_t pulse, pwm_flags_t flags)
Set the period and pulse width in nanoseconds for a single PWM output.
Definition pwm.h:669
uint16_t pwm_flags_t
Provides a type to hold PWM configuration flags.
Definition pwm.h:116
static int pwm_cycles_to_usec(const struct device *dev, uint32_t channel, uint32_t cycles, uint64_t *usec)
Convert from PWM cycles to microseconds.
Definition pwm.h:755
void(* pwm_event_callback_handler_t)(const struct device *dev, struct pwm_event_callback *callback, uint32_t channel, pwm_events_t events)
PWM event callback handler function signature.
Definition pwm.h:456
static void pwm_init_event_callback(struct pwm_event_callback *callback, pwm_event_callback_handler_t handler, uint32_t channel, pwm_events_t event_mask)
Helper to initialize a struct pwm_event_callback properly.
Definition pwm.h:1068
int pwm_set_cycles(const struct device *dev, uint32_t channel, uint32_t period, uint32_t pulse, pwm_flags_t flags)
Set the period and pulse width for a single PWM output.
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
#define EINVAL
Invalid argument.
Definition errno.h:60
#define ENOSYS
Function not implemented.
Definition errno.h:82
#define ENOTSUP
Unsupported value.
Definition errno.h:114
#define ERANGE
Result too large.
Definition errno.h:72
#define NULL
Definition iar_missing_defs.h:20
flags
Definition parser.h:97
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
#define UINT32_MAX
Definition stdint.h:29
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:519
Kernel timeout type.
Definition clock.h:65
<span class="mlabel">Driver Operations</span> PWM driver operations
Definition pwm.h:542
pwm_get_cycles_per_sec_t get_cycles_per_sec
<span class="op-badge op-req" title="This operation MUST be implemented by the driver....
Definition pwm.h:550
pwm_configure_capture_t configure_capture
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition pwm.h:556
pwm_set_cycles_t set_cycles
<span class="op-badge op-req" title="This operation MUST be implemented by the driver....
Definition pwm.h:546
pwm_disable_capture_t disable_capture
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition pwm.h:566
pwm_manage_event_callback_t manage_event_callback
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition pwm.h:573
pwm_enable_capture_t enable_capture
<span class="op-badge op-opt" title="This operation MAY optionally be implemented by the driver....
Definition pwm.h:561
Container for PWM information specified in devicetree.
Definition pwm.h:141
pwm_flags_t flags
Flags.
Definition pwm.h:149
uint32_t channel
Channel number.
Definition pwm.h:145
uint32_t period
Period in nanoseconds.
Definition pwm.h:147
const struct device * dev
PWM device instance.
Definition pwm.h:143
PWM event callback structure.
Definition pwm.h:471
uint32_t channel
Channel the callback is interested in.
Definition pwm.h:480
pwm_events_t event_mask
A mask of events the callback is interested in.
Definition pwm.h:483
pwm_event_callback_handler_t handler
Actual callback function being called when relevant.
Definition pwm.h:477