Zephyr API Documentation 4.0.0
A Scalable Open Source RTOS
|
PWM Interface . More...
Data Structures | |
struct | pwm_dt_spec |
Container for PWM information specified in devicetree. More... | |
Macros | |
#define | PWM_DT_SPEC_GET_BY_NAME(node_id, name) |
Static initializer for a struct pwm_dt_spec. | |
#define | PWM_DT_SPEC_INST_GET_BY_NAME(inst, name) |
Static initializer for a struct pwm_dt_spec from a DT_DRV_COMPAT instance. | |
#define | PWM_DT_SPEC_GET_BY_NAME_OR(node_id, name, default_value) |
Like PWM_DT_SPEC_GET_BY_NAME(), with a fallback to a default value. | |
#define | PWM_DT_SPEC_INST_GET_BY_NAME_OR(inst, name, default_value) |
Like PWM_DT_SPEC_INST_GET_BY_NAME(), with a fallback to a default value. | |
#define | PWM_DT_SPEC_GET_BY_IDX(node_id, idx) |
Static initializer for a struct pwm_dt_spec. | |
#define | PWM_DT_SPEC_INST_GET_BY_IDX(inst, idx) |
Static initializer for a struct pwm_dt_spec from a DT_DRV_COMPAT instance. | |
#define | PWM_DT_SPEC_GET_BY_IDX_OR(node_id, idx, default_value) |
Like PWM_DT_SPEC_GET_BY_IDX(), with a fallback to a default value. | |
#define | PWM_DT_SPEC_INST_GET_BY_IDX_OR(inst, idx, default_value) |
Like PWM_DT_SPEC_INST_GET_BY_IDX(), with a fallback to a default value. | |
#define | PWM_DT_SPEC_GET(node_id) |
Equivalent to PWM_DT_SPEC_GET_BY_IDX(node_id, 0) . | |
#define | PWM_DT_SPEC_INST_GET(inst) |
Equivalent to PWM_DT_SPEC_INST_GET_BY_IDX(inst, 0) . | |
#define | PWM_DT_SPEC_GET_OR(node_id, default_value) |
Equivalent to PWM_DT_SPEC_GET_BY_IDX_OR(node_id, 0, default_value) . | |
#define | PWM_DT_SPEC_INST_GET_OR(inst, default_value) |
Equivalent to PWM_DT_SPEC_INST_GET_BY_IDX_OR(inst, 0, default_value) . | |
Typedefs | |
typedef uint16_t | pwm_flags_t |
Provides a type to hold PWM configuration flags. | |
typedef 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. | |
Functions | |
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. | |
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_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. | |
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). | |
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. | |
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. | |
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. | |
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. | |
int | pwm_enable_capture (const struct device *dev, uint32_t channel) |
Enable PWM period/pulse width capture 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. | |
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_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. | |
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. | |
static bool | pwm_is_ready_dt (const struct pwm_dt_spec *spec) |
Validate that the PWM device is ready. | |
PWM capture configuration flags | |
#define | PWM_CAPTURE_TYPE_PERIOD (1U << PWM_CAPTURE_TYPE_SHIFT) |
PWM pin capture captures period. | |
#define | PWM_CAPTURE_TYPE_PULSE (2U << PWM_CAPTURE_TYPE_SHIFT) |
PWM pin capture captures pulse width. | |
#define | PWM_CAPTURE_TYPE_BOTH |
PWM pin capture captures both period and pulse width. | |
#define | PWM_CAPTURE_MODE_SINGLE (0U << PWM_CAPTURE_MODE_SHIFT) |
PWM pin capture captures a single period/pulse width. | |
#define | PWM_CAPTURE_MODE_CONTINUOUS (1U << PWM_CAPTURE_MODE_SHIFT) |
PWM pin capture captures period/pulse width continuously. | |
PWM period set helpers | |
The period cell in the PWM specifier needs to be provided in nanoseconds. However, in some applications it is more convenient to use another scale. | |
#define | PWM_NSEC(x) |
Specify PWM period in nanoseconds. | |
#define | PWM_USEC(x) |
Specify PWM period in microseconds. | |
#define | PWM_MSEC(x) |
Specify PWM period in milliseconds. | |
#define | PWM_SEC(x) |
Specify PWM period in seconds. | |
#define | PWM_HZ(x) |
Specify PWM frequency in hertz. | |
#define | PWM_KHZ(x) |
Specify PWM frequency in kilohertz. | |
PWM polarity flags | |
The The flags are on the lower 8bits of the pwm_flags_t | |
#define | PWM_POLARITY_NORMAL (0 << 0) |
PWM pin normal polarity (active-high pulse). | |
#define | PWM_POLARITY_INVERTED (1 << 0) |
PWM pin inverted polarity (active-low pulse). | |
PWM Interface .
PWM Interface .
#define PWM_CAPTURE_MODE_CONTINUOUS (1U << PWM_CAPTURE_MODE_SHIFT) |
#include <zephyr/drivers/pwm.h>
PWM pin capture captures period/pulse width continuously.
#define PWM_CAPTURE_MODE_SINGLE (0U << PWM_CAPTURE_MODE_SHIFT) |
#include <zephyr/drivers/pwm.h>
PWM pin capture captures a single period/pulse width.
#define PWM_CAPTURE_TYPE_BOTH |
#include <zephyr/drivers/pwm.h>
PWM pin capture captures both period and pulse width.
#define PWM_CAPTURE_TYPE_PERIOD (1U << PWM_CAPTURE_TYPE_SHIFT) |
#include <zephyr/drivers/pwm.h>
PWM pin capture captures period.
#define PWM_CAPTURE_TYPE_PULSE (2U << PWM_CAPTURE_TYPE_SHIFT) |
#include <zephyr/drivers/pwm.h>
PWM pin capture captures pulse width.
#define PWM_DT_SPEC_GET | ( | node_id | ) |
#include <zephyr/drivers/pwm.h>
Equivalent to PWM_DT_SPEC_GET_BY_IDX(node_id, 0)
.
node_id | Devicetree node identifier. |
#define PWM_DT_SPEC_GET_BY_IDX | ( | node_id, | |
idx ) |
#include <zephyr/drivers/pwm.h>
Static initializer for a struct pwm_dt_spec.
This returns a static initializer for a struct pwm_dt_spec given a devicetree node identifier and an index.
Example devicetree fragment:
Example usage:
The device (dev) must still be checked for readiness, e.g. using device_is_ready(). It is an error to use this macro unless the node exists, has the 'pwms' property, and that 'pwms' property specifies a PWM controller, a channel, a period in nanoseconds and optionally flags.
node_id | Devicetree node identifier. |
idx | Logical index into 'pwms' property. |
#define PWM_DT_SPEC_GET_BY_IDX_OR | ( | node_id, | |
idx, | |||
default_value ) |
#include <zephyr/drivers/pwm.h>
Like PWM_DT_SPEC_GET_BY_IDX(), with a fallback to a default value.
If the devicetree node identifier 'node_id' refers to a node with a property 'pwms', this expands to PWM_DT_SPEC_GET_BY_IDX(node_id, idx)
. The default_value
parameter is not expanded in this case. Otherwise, this expands to default_value
.
node_id | Devicetree node identifier. |
idx | Logical index into 'pwms' property. |
default_value | Fallback value to expand to. |
default_value
if the node or property do not exist.#define PWM_DT_SPEC_GET_BY_NAME | ( | node_id, | |
name ) |
#include <zephyr/drivers/pwm.h>
Static initializer for a struct pwm_dt_spec.
This returns a static initializer for a struct pwm_dt_spec given a devicetree node identifier and an index.
Example devicetree fragment:
Example usage:
The device (dev) must still be checked for readiness, e.g. using device_is_ready(). It is an error to use this macro unless the node exists, has the 'pwms' property, and that 'pwms' property specifies a PWM controller, a channel, a period in nanoseconds and optionally flags.
node_id | Devicetree node identifier. |
name | Lowercase-and-underscores name of a pwms element as defined by the node's pwm-names property. |
#define PWM_DT_SPEC_GET_BY_NAME_OR | ( | node_id, | |
name, | |||
default_value ) |
#include <zephyr/drivers/pwm.h>
Like PWM_DT_SPEC_GET_BY_NAME(), with a fallback to a default value.
If the devicetree node identifier 'node_id' refers to a node with a property 'pwms', this expands to PWM_DT_SPEC_GET_BY_NAME(node_id, name)
. The default_value
parameter is not expanded in this case. Otherwise, this expands to default_value
.
node_id | Devicetree node identifier. |
name | Lowercase-and-underscores name of a pwms element as defined by the node's pwm-names property |
default_value | Fallback value to expand to. |
default_value
if the node or property do not exist.#define PWM_DT_SPEC_GET_OR | ( | node_id, | |
default_value ) |
#include <zephyr/drivers/pwm.h>
Equivalent to PWM_DT_SPEC_GET_BY_IDX_OR(node_id, 0, default_value)
.
node_id | Devicetree node identifier. |
default_value | Fallback value to expand to. |
#define PWM_DT_SPEC_INST_GET | ( | inst | ) |
#include <zephyr/drivers/pwm.h>
Equivalent to PWM_DT_SPEC_INST_GET_BY_IDX(inst, 0)
.
inst | DT_DRV_COMPAT instance number |
#define PWM_DT_SPEC_INST_GET_BY_IDX | ( | inst, | |
idx ) |
#include <zephyr/drivers/pwm.h>
Static initializer for a struct pwm_dt_spec from a DT_DRV_COMPAT instance.
inst | DT_DRV_COMPAT instance number |
idx | Logical index into 'pwms' property. |
#define PWM_DT_SPEC_INST_GET_BY_IDX_OR | ( | inst, | |
idx, | |||
default_value ) |
#include <zephyr/drivers/pwm.h>
Like PWM_DT_SPEC_INST_GET_BY_IDX(), with a fallback to a default value.
inst | DT_DRV_COMPAT instance number |
idx | Logical index into 'pwms' property. |
default_value | Fallback value to expand to. |
default_value
if the node or property do not exist.#define PWM_DT_SPEC_INST_GET_BY_NAME | ( | inst, | |
name ) |
#include <zephyr/drivers/pwm.h>
Static initializer for a struct pwm_dt_spec from a DT_DRV_COMPAT instance.
inst | DT_DRV_COMPAT instance number |
name | Lowercase-and-underscores name of a pwms element as defined by the node's pwm-names property. |
#define PWM_DT_SPEC_INST_GET_BY_NAME_OR | ( | inst, | |
name, | |||
default_value ) |
#include <zephyr/drivers/pwm.h>
Like PWM_DT_SPEC_INST_GET_BY_NAME(), with a fallback to a default value.
inst | DT_DRV_COMPAT instance number |
name | Lowercase-and-underscores name of a pwms element as defined by the node's pwm-names property. |
default_value | Fallback value to expand to. |
default_value
if the node or property do not exist.#define PWM_DT_SPEC_INST_GET_OR | ( | inst, | |
default_value ) |
#include <zephyr/drivers/pwm.h>
Equivalent to PWM_DT_SPEC_INST_GET_BY_IDX_OR(inst, 0, default_value)
.
inst | DT_DRV_COMPAT instance number |
default_value | Fallback value to expand to. |
#define PWM_HZ | ( | x | ) |
#include <zephyr/dt-bindings/pwm/pwm.h>
Specify PWM frequency in hertz.
#define PWM_KHZ | ( | x | ) |
#include <zephyr/dt-bindings/pwm/pwm.h>
Specify PWM frequency in kilohertz.
#define PWM_MSEC | ( | x | ) |
#include <zephyr/dt-bindings/pwm/pwm.h>
Specify PWM period in milliseconds.
#define PWM_NSEC | ( | x | ) |
#define PWM_POLARITY_INVERTED (1 << 0) |
#include <zephyr/dt-bindings/pwm/pwm.h>
PWM pin inverted polarity (active-low pulse).
#define PWM_POLARITY_NORMAL (0 << 0) |
#include <zephyr/dt-bindings/pwm/pwm.h>
PWM pin normal polarity (active-high pulse).
#define PWM_SEC | ( | x | ) |
#define PWM_USEC | ( | x | ) |
#include <zephyr/dt-bindings/pwm/pwm.h>
Specify PWM period in microseconds.
typedef 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) |
#include <zephyr/drivers/pwm.h>
PWM capture callback handler function signature.
CONFIG_PWM_CAPTUREmust be selected to enable PWM capture support.
[in] | dev | PWM device instance. |
channel | PWM channel. | |
period_cycles | Captured PWM period width (in clock cycles). HW specific. | |
pulse_cycles | Captured PWM pulse width (in clock cycles). HW specific. | |
status | Status for the PWM capture (0 if no error, negative errno otherwise. See pwm_capture_cycles() return value descriptions for details). | |
user_data | User data passed to pwm_configure_capture() |
typedef uint16_t pwm_flags_t |
#include <zephyr/drivers/pwm.h>
Provides a type to hold PWM configuration flags.
The lower 8 bits are used for standard flags. The upper 8 bits are reserved for SoC specific flags.
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 ) |
#include <zephyr/drivers/pwm.h>
Capture a single PWM period/pulse width in clock cycles for a single PWM input.
This API function wraps calls to pwm_configure_capture(), pwm_enable_capture(), and pwm_disable_capture() and passes the capture result to the caller. The function is blocking until either the PWM capture is completed or a timeout occurs.
CONFIG_PWM_CAPTUREmust be selected for this function to be available.
[in] | dev | PWM device instance. |
channel | PWM channel. | |
flags | PWM capture flags. | |
[out] | period | Pointer to the memory to store the captured PWM period width (in clock cycles). HW specific. |
[out] | pulse | Pointer to the memory to store the captured PWM pulse width (in clock cycles). HW specific. |
timeout | Waiting period for the capture to complete. |
0 | If successful. |
-EBUSY | PWM capture already in progress. |
-EAGAIN | Waiting period timed out. |
-EIO | IO error while capturing. |
-ERANGE | If result is too large. |
|
inlinestatic |
#include <zephyr/drivers/pwm.h>
Capture a single PWM period/pulse width in nanoseconds for a single PWM input.
This API function wraps calls to pwm_capture_cycles() and pwm_cycles_to_nsec() and passes the capture result to the caller. The function is blocking until either the PWM capture is completed or a timeout occurs.
CONFIG_PWM_CAPTUREmust be selected for this function to be available.
[in] | dev | PWM device instance. |
channel | PWM channel. | |
flags | PWM capture flags. | |
[out] | period | Pointer to the memory to store the captured PWM period width (in nsec). |
[out] | pulse | Pointer to the memory to store the captured PWM pulse width (in nsec). |
timeout | Waiting period for the capture to complete. |
0 | If successful. |
-EBUSY | PWM capture already in progress. |
-EAGAIN | Waiting period timed out. |
-EIO | IO error while capturing. |
-ERANGE | If result is too large. |
-errno | Other negative errno code on failure. |
|
inlinestatic |
#include <zephyr/drivers/pwm.h>
Capture a single PWM period/pulse width in microseconds for a single PWM input.
This API function wraps calls to pwm_capture_cycles() and pwm_cycles_to_usec() and passes the capture result to the caller. The function is blocking until either the PWM capture is completed or a timeout occurs.
CONFIG_PWM_CAPTUREmust be selected for this function to be available.
[in] | dev | PWM device instance. |
channel | PWM channel. | |
flags | PWM capture flags. | |
[out] | period | Pointer to the memory to store the captured PWM period width (in usec). |
[out] | pulse | Pointer to the memory to store the captured PWM pulse width (in usec). |
timeout | Waiting period for the capture to complete. |
0 | If successful. |
-EBUSY | PWM capture already in progress. |
-EAGAIN | Waiting period timed out. |
-EIO | IO error while capturing. |
-ERANGE | If result is too large. |
-errno | Other negative errno code on failure. |
|
inlinestatic |
#include <zephyr/drivers/pwm.h>
Configure PWM period/pulse width capture for a single PWM input.
After configuring PWM capture using this function, the capture can be enabled/disabled using pwm_enable_capture() and pwm_disable_capture().
CONFIG_PWM_CAPTUREmust be selected for this function to be available.
[in] | dev | PWM device instance. |
channel | PWM channel. | |
flags | PWM capture flags | |
[in] | cb | Application callback handler function to be called upon capture |
[in] | user_data | User data to pass to the application callback handler function |
-EINVAL | if invalid function parameters were given |
-ENOSYS | if PWM capture is not supported or the given flags are not supported |
-EIO | if IO error occurred while configuring |
-EBUSY | if PWM capture is already in progress |
|
inlinestatic |
#include <zephyr/drivers/pwm.h>
Convert from PWM cycles to nanoseconds.
[in] | dev | PWM device instance. |
channel | PWM channel. | |
cycles | Cycles to be converted. | |
[out] | nsec | Pointer to the memory to store the calculated nsec. |
0 | If successful. |
-ERANGE | If result is too large. |
-errno | Other negative errno code on failure. |
|
inlinestatic |
#include <zephyr/drivers/pwm.h>
Convert from PWM cycles to microseconds.
[in] | dev | PWM device instance. |
channel | PWM channel. | |
cycles | Cycles to be converted. | |
[out] | usec | Pointer to the memory to store calculated usec. |
0 | If successful. |
-ERANGE | If result is too large. |
-errno | Other negative errno code on failure. |
#include <zephyr/drivers/pwm.h>
Disable PWM period/pulse width capture for a single PWM input.
CONFIG_PWM_CAPTUREmust be selected for this function to be available.
[in] | dev | PWM device instance. |
channel | PWM channel. |
0 | If successful. |
-EINVAL | if invalid function parameters were given |
-ENOSYS | if PWM capture is not supported |
-EIO | if IO error occurred while disabling PWM capture |
#include <zephyr/drivers/pwm.h>
Enable PWM period/pulse width capture for a single PWM input.
The PWM pin must be configured using pwm_configure_capture() prior to calling this function.
CONFIG_PWM_CAPTUREmust be selected for this function to be available.
[in] | dev | PWM device instance. |
channel | PWM channel. |
0 | If successful. |
-EINVAL | if invalid function parameters were given |
-ENOSYS | if PWM capture is not supported |
-EIO | if IO error occurred while enabling PWM capture |
-EBUSY | if PWM capture is already in progress |
#include <zephyr/drivers/pwm.h>
Get the clock rate (cycles per second) for a single PWM output.
[in] | dev | PWM device instance. |
channel | PWM channel. | |
[out] | cycles | Pointer to the memory to store clock rate (cycles per sec). HW specific. |
0 | If successful. |
-errno | Negative errno code on failure. |
|
inlinestatic |
#include <zephyr/drivers/pwm.h>
Validate that the PWM device is ready.
spec | PWM specification from devicetree |
true | If the PWM device is ready for use |
false | If the PWM device is not ready for use |
|
inlinestatic |
#include <zephyr/drivers/pwm.h>
Set the period and pulse width in nanoseconds for a single PWM output.
[in] | dev | PWM device instance. |
channel | PWM channel. | |
period | Period (in nanoseconds) set to the PWM. | |
pulse | Pulse width (in nanoseconds) set to the PWM. | |
flags | Flags for pin configuration (polarity). |
0 | If successful. |
-ENOTSUP | If requested period or pulse cycles are not supported. |
-errno | Other negative errno code on failure. |
int pwm_set_cycles | ( | const struct device * | dev, |
uint32_t | channel, | ||
uint32_t | period, | ||
uint32_t | pulse, | ||
pwm_flags_t | flags ) |
#include <zephyr/drivers/pwm.h>
Set the period and pulse width for a single PWM output.
The PWM period and pulse width will synchronously be set to the new values without glitches in the PWM signal, but the call will not block for the change to take effect.
Passing 0 as pulse
will cause the pin to be driven to a constant inactive level. Passing a non-zero pulse
equal to period
will cause the pin to be driven to a constant active level.
[in] | dev | PWM device instance. |
channel | PWM channel. | |
period | Period (in clock cycles) set to the PWM. HW specific. | |
pulse | Pulse width (in clock cycles) set to the PWM. HW specific. | |
flags | Flags for pin configuration. |
0 | If successful. |
-EINVAL | If pulse > period. |
-errno | Negative errno code on failure. |
|
inlinestatic |
#include <zephyr/drivers/pwm.h>
Set the period and pulse width in nanoseconds from a struct pwm_dt_spec (with custom period).
This is equivalent to:
pwm_set(spec->dev, spec->channel, period, pulse, spec->flags)
The period specified in spec
is ignored. This API call can be used when the period specified in Devicetree needs to be changed at runtime.
[in] | spec | PWM specification from devicetree. |
period | Period (in nanoseconds) set to the PWM. | |
pulse | Pulse width (in nanoseconds) set to the PWM. |
|
inlinestatic |
#include <zephyr/drivers/pwm.h>
Set the period and pulse width in nanoseconds from a struct pwm_dt_spec.
This is equivalent to:
pwm_set(spec->dev, spec->channel, spec->period, pulse, spec->flags)
[in] | spec | PWM specification from devicetree. |
pulse | Pulse width (in nanoseconds) set to the PWM. |