123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848 |
- #ifndef ZEPHYR_INCLUDE_DRIVERS_PWM_H_
- #define ZEPHYR_INCLUDE_DRIVERS_PWM_H_
- #include <errno.h>
- #include <zephyr/types.h>
- #include <stddef.h>
- #include <sys/math_extras.h>
- #include <device.h>
- #include <dt-bindings/pwm/pwm.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- #define PWM_CAPTURE_TYPE_SHIFT 1U
- #define PWM_CAPTURE_TYPE_MASK (3U << PWM_CAPTURE_TYPE_SHIFT)
- #define PWM_CAPTURE_MODE_SHIFT 3U
- #define PWM_CAPTURE_MODE_MASK (1U << PWM_CAPTURE_MODE_SHIFT)
- #define PWM_CAPTURE_TYPE_PERIOD (1U << PWM_CAPTURE_TYPE_SHIFT)
- #define PWM_CAPTURE_TYPE_PULSE (2U << PWM_CAPTURE_TYPE_SHIFT)
- #define PWM_CAPTURE_TYPE_BOTH (PWM_CAPTURE_TYPE_PERIOD | \
- PWM_CAPTURE_TYPE_PULSE)
- #define PWM_CAPTURE_MODE_SINGLE (0U << PWM_CAPTURE_MODE_SHIFT)
- #define PWM_CAPTURE_MODE_CONTINUOUS (1U << PWM_CAPTURE_MODE_SHIFT)
- typedef struct {
- #define PWM_BREATH_RISE_TIME_DEFAULT (500)
- #define PWM_BREATH_DOWN_TIME_DEFAULT (500)
- #define PWM_BREATH_HIGH_TIME_DEFAULT (500)
- #define PWM_BREATH_LOW_TIME_DEFAULT (2000)
- u16_t rise_time_ms;
- u16_t down_time_ms;
- u16_t high_time_ms;
- u16_t low_time_ms;
- u16_t pwm_count_max;
- u8_t stage_high_wait;
- u8_t stage_low_wait;
- u8_t stage_a_step;
- u8_t stage_b_step;
- u8_t stage_c_step;
- u8_t stage_d_step;
- u8_t stage_e_step;
- u8_t stage_f_step;
- u8_t stage_a_repeat;
- u8_t stage_b_repeat;
- u8_t stage_c_repeat;
- u8_t stage_d_repeat;
- u8_t stage_e_repeat;
- u8_t stage_f_repeat;
- u8_t stage_a_pwm;
- u8_t stage_b_pwm;
- u8_t stage_c_pwm;
- u8_t stage_d_pwm;
- u8_t stage_e_pwm;
- u8_t stage_f_pwm;
- u8_t start_pwm;
- u8_t start_dir;
- } pwm_breath_ctrl_t;
- typedef struct {
- #define PWM_PROGRAM_DMA_IRQ_HF (1 << 0)
- #define PWM_PROGRAM_DMA_IRQ_TC (1 << 1)
- u32_t period_cycles;
- u16_t *ram_buf;
- u32_t ram_buf_len;
- int (*program_callback)(void *cb_data, u8_t reason);
- void *cb_data;
- u8_t reload_en : 1;
- u16_t repeat;
- u16_t cntmax;
- } pwm_program_ctrl_t;
- typedef struct {
- volatile u32_t ir_period;
- volatile u32_t ir_duty;
- volatile u32_t ir_lc;
- volatile u32_t ir_pl0_pre;
- volatile u32_t ir_pl0_post;
- volatile u32_t ir_pl1_pre;
- volatile u32_t ir_pl1_post;
- volatile u32_t ir_ll;
- volatile u32_t ir_ld;
- volatile u32_t ir_pl;
- volatile u32_t ir_pd0;
- volatile u32_t ir_pd1;
- volatile u32_t ir_sl;
- volatile u32_t ir_asc;
- volatile u32_t buf_num;
- u16_t mode;
- } pwm_ir_ctrl_t;
- typedef uint8_t pwm_flags_t;
- typedef int (*pwm_pin_set_t)(const struct device *dev, uint32_t pwm,
- uint32_t period_cycles, uint32_t pulse_cycles,
- pwm_flags_t flags);
- typedef int (*pwm_set_breath_t)(const struct device *dev, u32_t pwm, pwm_breath_ctrl_t *ctrl);
- typedef int (*pwm_set_program_t)(const struct device *dev, u32_t pwm, pwm_program_ctrl_t *ctrl);
- typedef int (*pwm_ir_transfer_t)(const struct device *dev, u32_t pwm, pwm_ir_ctrl_t *ctrl);
- typedef int (*pwm_pin_stop_t)(const struct device *dev, u32_t pwm);
- typedef int (*pwm_pin_mfp_set_t)(const struct device *dev, u32_t pwm, u32_t pin);
- typedef int (*pwm_pin_freq_duty_set_t)(const struct device *dev, uint32_t pwm,
- uint32_t freq, uint8_t duty, pwm_flags_t flags);
- typedef void (*pwm_capture_callback_handler_t)(const struct device *dev,
- uint32_t pwm,
- uint32_t period_cycles,
- uint32_t pulse_cycles,
- int status,
- void *user_data);
- typedef int (*pwm_pin_configure_capture_t)(const struct device *dev,
- uint32_t pwm,
- pwm_flags_t flags,
- pwm_capture_callback_handler_t cb,
- void *user_data);
- typedef int (*pwm_pin_enable_capture_t)(const struct device *dev,
- uint32_t pwm);
- typedef int (*pwm_pin_disable_capture_t)(const struct device *dev,
- uint32_t pwm);
- typedef int (*pwm_get_cycles_per_sec_t)(const struct device *dev,
- uint32_t pwm,
- uint64_t *cycles);
- __subsystem struct pwm_driver_api {
- pwm_pin_set_t pin_set;
- pwm_set_breath_t set_breath;
- pwm_set_program_t set_program;
- pwm_ir_transfer_t ir_transfer;
- pwm_pin_stop_t pin_stop;
- pwm_pin_mfp_set_t pin_mfp;
- pwm_pin_freq_duty_set_t pin_set_freq_duty;
- #ifdef CONFIG_PWM_CAPTURE
- pwm_pin_configure_capture_t pin_configure_capture;
- pwm_pin_enable_capture_t pin_enable_capture;
- pwm_pin_disable_capture_t pin_disable_capture;
- #endif
- pwm_get_cycles_per_sec_t get_cycles_per_sec;
- };
- __syscall int pwm_pin_set_cycles(const struct device *dev, uint32_t pwm,
- uint32_t period, uint32_t pulse, pwm_flags_t flags);
- static inline int z_impl_pwm_pin_set_cycles(const struct device *dev,
- uint32_t pwm,
- uint32_t period, uint32_t pulse,
- pwm_flags_t flags)
- {
- struct pwm_driver_api *api;
- api = (struct pwm_driver_api *)dev->api;
- return api->pin_set(dev, pwm, period, pulse, flags);
- }
- static inline int pwm_set_breath_mode(const struct device *dev, u32_t pwm, pwm_breath_ctrl_t *ctrl)
- {
- struct pwm_driver_api *api;
- api = (struct pwm_driver_api *)dev->api;
- return api->set_breath(dev, pwm, ctrl);
- }
- static inline int pwm_set_program_mode(const struct device *dev, u32_t pwm, pwm_program_ctrl_t *ctrl)
- {
- struct pwm_driver_api *api;
- api = (struct pwm_driver_api *)dev->api;
- return api->set_program(dev, pwm, ctrl);
- }
- static inline int pwm_ir_transfer(const struct device *dev, u32_t pwm, pwm_ir_ctrl_t *ctrl)
- {
- struct pwm_driver_api *api;
- api = (struct pwm_driver_api *)dev->api;
- return api->ir_transfer(dev, pwm, ctrl);
- }
- static inline int pwm_pin_stop(const struct device *dev, u32_t pwm)
- {
- struct pwm_driver_api *api;
- api = (struct pwm_driver_api *)dev->api;
- return api->pin_stop(dev, pwm);
- }
- static inline int pwm_pin_mfp_set(const struct device *dev, u32_t pwm, u32_t pin)
- {
- struct pwm_driver_api *api;
- api = (struct pwm_driver_api *)dev->api;
- return api->pin_mfp(dev, pwm, pin);
- }
- static inline int pwm_pin_set_freq_duty(const struct device *dev,
- uint32_t pwm, uint32_t freq, uint8_t duty, pwm_flags_t flags)
- {
- struct pwm_driver_api *api;
- api = (struct pwm_driver_api *)dev->api;
- return api->pin_set_freq_duty(dev, pwm, freq, duty, flags);
- }
- #ifdef CONFIG_PWM_CAPTURE
- static inline int pwm_pin_configure_capture(const struct device *dev,
- uint32_t pwm,
- pwm_flags_t flags,
- pwm_capture_callback_handler_t cb,
- void *user_data)
- {
- const struct pwm_driver_api *api = (struct pwm_driver_api *)dev->api;
- if (api->pin_configure_capture == NULL) {
- return -ENOSYS;
- }
- return api->pin_configure_capture(dev, pwm, flags, cb, user_data);
- }
- #endif
- __syscall int pwm_pin_enable_capture(const struct device *dev, uint32_t pwm);
- #ifdef CONFIG_PWM_CAPTURE
- static inline int z_impl_pwm_pin_enable_capture(const struct device *dev,
- uint32_t pwm)
- {
- const struct pwm_driver_api *api = (struct pwm_driver_api *)dev->api;
- if (api->pin_enable_capture == NULL) {
- return -ENOSYS;
- }
- return api->pin_enable_capture(dev, pwm);
- }
- #endif
- __syscall int pwm_pin_disable_capture(const struct device *dev, uint32_t pwm);
- #ifdef CONFIG_PWM_CAPTURE
- static inline int z_impl_pwm_pin_disable_capture(const struct device *dev,
- uint32_t pwm)
- {
- const struct pwm_driver_api *api = (struct pwm_driver_api *)dev->api;
- if (api->pin_disable_capture == NULL) {
- return -ENOSYS;
- }
- return api->pin_disable_capture(dev, pwm);
- }
- #endif
- __syscall int pwm_pin_capture_cycles(const struct device *dev, uint32_t pwm,
- pwm_flags_t flags,
- uint32_t *period,
- uint32_t *pulse,
- k_timeout_t timeout);
- __syscall int pwm_get_cycles_per_sec(const struct device *dev, uint32_t pwm,
- uint64_t *cycles);
- static inline int z_impl_pwm_get_cycles_per_sec(const struct device *dev,
- uint32_t pwm,
- uint64_t *cycles)
- {
- struct pwm_driver_api *api;
- api = (struct pwm_driver_api *)dev->api;
- return api->get_cycles_per_sec(dev, pwm, cycles);
- }
- static inline int pwm_pin_set_usec(const struct device *dev, uint32_t pwm,
- uint32_t period, uint32_t pulse,
- pwm_flags_t flags)
- {
- uint64_t period_cycles, pulse_cycles, cycles_per_sec;
- if (pwm_get_cycles_per_sec(dev, pwm, &cycles_per_sec) != 0) {
- return -EIO;
- }
- period_cycles = (period * cycles_per_sec) / USEC_PER_SEC;
- if (period_cycles >= ((uint64_t)1 << 32)) {
- return -ENOTSUP;
- }
- pulse_cycles = (pulse * cycles_per_sec) / USEC_PER_SEC;
- if (pulse_cycles >= ((uint64_t)1 << 32)) {
- return -ENOTSUP;
- }
- return pwm_pin_set_cycles(dev, pwm, (uint32_t)period_cycles,
- (uint32_t)pulse_cycles, flags);
- }
- static inline int pwm_pin_set_nsec(const struct device *dev, uint32_t pwm,
- uint32_t period, uint32_t pulse,
- pwm_flags_t flags)
- {
- uint64_t period_cycles, pulse_cycles, cycles_per_sec;
- if (pwm_get_cycles_per_sec(dev, pwm, &cycles_per_sec) != 0) {
- return -EIO;
- }
- period_cycles = (period * cycles_per_sec) / NSEC_PER_SEC;
- if (period_cycles >= ((uint64_t)1 << 32)) {
- return -ENOTSUP;
- }
- pulse_cycles = (pulse * cycles_per_sec) / NSEC_PER_SEC;
- if (pulse_cycles >= ((uint64_t)1 << 32)) {
- return -ENOTSUP;
- }
- return pwm_pin_set_cycles(dev, pwm, (uint32_t)period_cycles,
- (uint32_t)pulse_cycles, flags);
- }
- static inline int pwm_pin_cycles_to_usec(const struct device *dev, uint32_t pwm,
- uint32_t cycles, uint64_t *usec)
- {
- uint64_t cycles_per_sec;
- uint64_t temp;
- if (pwm_get_cycles_per_sec(dev, pwm, &cycles_per_sec) != 0) {
- return -EIO;
- }
- if (u64_mul_overflow(cycles, (uint64_t)USEC_PER_SEC, &temp)) {
- return -ERANGE;
- }
- *usec = temp / cycles_per_sec;
- return 0;
- }
- static inline int pwm_pin_cycles_to_nsec(const struct device *dev, uint32_t pwm,
- uint32_t cycles, uint64_t *nsec)
- {
- uint64_t cycles_per_sec;
- uint64_t temp;
- if (pwm_get_cycles_per_sec(dev, pwm, &cycles_per_sec) != 0) {
- return -EIO;
- }
- if (u64_mul_overflow(cycles, (uint64_t)NSEC_PER_SEC, &temp)) {
- return -ERANGE;
- }
- *nsec = temp / cycles_per_sec;
- return 0;
- }
- static inline int pwm_pin_capture_usec(const struct device *dev, uint32_t pwm,
- pwm_flags_t flags,
- uint64_t *period,
- uint64_t *pulse,
- k_timeout_t timeout)
- {
- uint32_t period_cycles;
- uint32_t pulse_cycles;
- int err;
- err = pwm_pin_capture_cycles(dev, pwm, flags, &period_cycles,
- &pulse_cycles, timeout);
- if (err) {
- return err;
- }
- err = pwm_pin_cycles_to_usec(dev, pwm, period_cycles, period);
- if (err) {
- return err;
- }
- err = pwm_pin_cycles_to_usec(dev, pwm, pulse_cycles, pulse);
- if (err) {
- return err;
- }
- return 0;
- }
- static inline int pwm_pin_capture_nsec(const struct device *dev, uint32_t pwm,
- pwm_flags_t flags,
- uint64_t *period,
- uint64_t *pulse,
- k_timeout_t timeout)
- {
- uint32_t period_cycles;
- uint32_t pulse_cycles;
- int err;
- err = pwm_pin_capture_cycles(dev, pwm, flags, &period_cycles,
- &pulse_cycles, timeout);
- if (err) {
- return err;
- }
- err = pwm_pin_cycles_to_nsec(dev, pwm, period_cycles, period);
- if (err) {
- return err;
- }
- err = pwm_pin_cycles_to_nsec(dev, pwm, pulse_cycles, pulse);
- if (err) {
- return err;
- }
- return 0;
- }
- #ifdef __cplusplus
- }
- #endif
- #include <syscalls/pwm.h>
- #endif
|