13#ifndef ZEPHYR_INCLUDE_DRIVERS_PWM_H_ 
   14#define ZEPHYR_INCLUDE_DRIVERS_PWM_H_ 
   46#define PWM_CAPTURE_TYPE_SHIFT          1U 
   47#define PWM_CAPTURE_TYPE_MASK           (3U << PWM_CAPTURE_TYPE_SHIFT) 
   48#define PWM_CAPTURE_MODE_SHIFT          3U 
   49#define PWM_CAPTURE_MODE_MASK           (1U << PWM_CAPTURE_MODE_SHIFT) 
   53#define PWM_CAPTURE_TYPE_PERIOD         (1U << PWM_CAPTURE_TYPE_SHIFT) 
   56#define PWM_CAPTURE_TYPE_PULSE          (2U << PWM_CAPTURE_TYPE_SHIFT) 
   59#define PWM_CAPTURE_TYPE_BOTH           (PWM_CAPTURE_TYPE_PERIOD | \ 
   60                                         PWM_CAPTURE_TYPE_PULSE) 
   63#define PWM_CAPTURE_MODE_SINGLE         (0U << PWM_CAPTURE_MODE_SHIFT) 
   66#define PWM_CAPTURE_MODE_CONTINUOUS     (1U << PWM_CAPTURE_MODE_SHIFT) 
  151#define PWM_DT_SPEC_GET_BY_NAME(node_id, name)                                 \ 
  153                .dev = DEVICE_DT_GET(DT_PWMS_CTLR_BY_NAME(node_id, name)),     \ 
  154                .channel = DT_PWMS_CHANNEL_BY_NAME(node_id, name),             \ 
  155                .period = DT_PWMS_PERIOD_BY_NAME(node_id, name),               \ 
  156                .flags = DT_PWMS_FLAGS_BY_NAME(node_id, name),                 \ 
  171#define PWM_DT_SPEC_INST_GET_BY_NAME(inst, name)                               \ 
  172        PWM_DT_SPEC_GET_BY_NAME(DT_DRV_INST(inst), name) 
  192#define PWM_DT_SPEC_GET_BY_NAME_OR(node_id, name, default_value)               \ 
  193        COND_CODE_1(DT_NODE_HAS_PROP(node_id, pwms),                           \ 
  194                    (PWM_DT_SPEC_GET_BY_NAME(node_id, name)),                  \ 
  211#define PWM_DT_SPEC_INST_GET_BY_NAME_OR(inst, name, default_value)             \ 
  212        PWM_DT_SPEC_GET_BY_NAME_OR(DT_DRV_INST(inst), name, default_value) 
  256#define PWM_DT_SPEC_GET_BY_IDX(node_id, idx)                                   \ 
  258                .dev = DEVICE_DT_GET(DT_PWMS_CTLR_BY_IDX(node_id, idx)),       \ 
  259                .channel = DT_PWMS_CHANNEL_BY_IDX(node_id, idx),               \ 
  260                .period = DT_PWMS_PERIOD_BY_IDX(node_id, idx),                 \ 
  261                .flags = DT_PWMS_FLAGS_BY_IDX(node_id, idx),                   \ 
  275#define PWM_DT_SPEC_INST_GET_BY_IDX(inst, idx)                                 \ 
  276        PWM_DT_SPEC_GET_BY_IDX(DT_DRV_INST(inst), idx) 
  295#define PWM_DT_SPEC_GET_BY_IDX_OR(node_id, idx, default_value)                 \ 
  296        COND_CODE_1(DT_NODE_HAS_PROP(node_id, pwms),                           \ 
  297                    (PWM_DT_SPEC_GET_BY_IDX(node_id, idx)),                    \ 
  313#define PWM_DT_SPEC_INST_GET_BY_IDX_OR(inst, idx, default_value)               \ 
  314        PWM_DT_SPEC_GET_BY_IDX_OR(DT_DRV_INST(inst), idx, default_value) 
  326#define PWM_DT_SPEC_GET(node_id) PWM_DT_SPEC_GET_BY_IDX(node_id, 0) 
  338#define PWM_DT_SPEC_INST_GET(inst) PWM_DT_SPEC_GET(DT_DRV_INST(inst)) 
  352#define PWM_DT_SPEC_GET_OR(node_id, default_value)                             \ 
  353        PWM_DT_SPEC_GET_BY_IDX_OR(node_id, 0, default_value) 
  367#define PWM_DT_SPEC_INST_GET_OR(inst, default_value)                           \ 
  368        PWM_DT_SPEC_GET_OR(DT_DRV_INST(inst), default_value) 
  400typedef int (*pwm_set_cycles_t)(
const struct device *dev, 
uint32_t channel,
 
  408typedef int (*pwm_get_cycles_per_sec_t)(
const struct device *dev,
 
  411#ifdef CONFIG_PWM_CAPTURE 
  416typedef int (*pwm_configure_capture_t)(
const struct device *dev,
 
  425typedef int (*pwm_enable_capture_t)(
const struct device *dev, 
uint32_t channel);
 
  431typedef int (*pwm_disable_capture_t)(
const struct device *dev,
 
  436__subsystem 
struct pwm_driver_api {
 
  437        pwm_set_cycles_t set_cycles;
 
  438        pwm_get_cycles_per_sec_t get_cycles_per_sec;
 
  439#ifdef CONFIG_PWM_CAPTURE 
  440        pwm_configure_capture_t configure_capture;
 
  441        pwm_enable_capture_t enable_capture;
 
  442        pwm_disable_capture_t disable_capture;
 
  481static inline int z_impl_pwm_set_cycles(
const struct device *dev,
 
  485        const struct pwm_driver_api *api =
 
  486                (
const struct pwm_driver_api *)dev->
api;
 
  488        if (pulse > period) {
 
  492        return api->set_cycles(dev, channel, period, pulse, 
flags);
 
  509static inline int z_impl_pwm_get_cycles_per_sec(
const struct device *dev,
 
  513        const struct pwm_driver_api *api =
 
  514                (
const struct pwm_driver_api *)dev->
api;
 
  516        return api->get_cycles_per_sec(dev, channel, cycles);
 
  548        period_cycles = (period * cycles_per_sec) / 
NSEC_PER_SEC;
 
  637        *usec = temp / cycles_per_sec;
 
  670        *nsec = temp / cycles_per_sec;
 
  675#if defined(CONFIG_PWM_CAPTURE) || defined(__DOXYGEN__) 
  709        const struct pwm_driver_api *api =
 
  710                (
const struct pwm_driver_api *)dev->
api;
 
  712        if (api->configure_capture == NULL) {
 
  716        return api->configure_capture(dev, channel, 
flags, cb,
 
  741#ifdef CONFIG_PWM_CAPTURE 
  742static inline int z_impl_pwm_enable_capture(
const struct device *dev,
 
  745        const struct pwm_driver_api *api =
 
  746                (
const struct pwm_driver_api *)dev->
api;
 
  748        if (api->enable_capture == NULL) {
 
  752        return api->enable_capture(dev, channel);
 
  772#ifdef CONFIG_PWM_CAPTURE 
  773static inline int z_impl_pwm_disable_capture(
const struct device *dev,
 
  776        const struct pwm_driver_api *api =
 
  777                (
const struct pwm_driver_api *)dev->
api;
 
  779        if (api->disable_capture == NULL) {
 
  783        return api->disable_capture(dev, channel);
 
  936#include <syscalls/pwm.h> 
ZTEST_BMEM int timeout
Definition: main.c:31
 
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.
 
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:581
 
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:389
 
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:846
 
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:901
 
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:654
 
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:602
 
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:704
 
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:535
 
uint16_t pwm_flags_t
Provides a type to hold PWM configuration flags.
Definition: pwm.h:79
 
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:621
 
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.
 
#define EINVAL
Definition: errno.h:61
 
#define ENOSYS
Definition: errno.h:83
 
#define ENOTSUP
Definition: errno.h:115
 
#define ERANGE
Definition: errno.h:73
 
Variables needed for system clock.
 
#define NSEC_PER_SEC
Definition: sys_clock.h:139
 
#define USEC_PER_SEC
Definition: sys_clock.h:136
 
flags
Definition: parser.h:96
 
__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:380
 
const void * api
Definition: device.h:386
 
Kernel timeout type.
Definition: sys_clock.h:65
 
Container for PWM information specified in devicetree.
Definition: pwm.h:96
 
pwm_flags_t flags
Definition: pwm.h:104
 
uint32_t channel
Definition: pwm.h:100
 
uint32_t period
Definition: pwm.h:102
 
const struct device * dev
Definition: pwm.h:98
 
static const intptr_t user_data[5]
Definition: main.c:588