You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
3.7 KiB

/*
* Copyright (c) Hisilicon Technologies Co., Ltd.. 2021-2021. All rights reserved.
* Description:
* Author:
* Create: 2021-05-12
* Note:
*/
#ifndef PWM_COMMON_H
#define PWM_COMMON_H
#include <asm/io.h>
#include "soc_log.h"
#include "osal_ext.h"
#include "drv_pwm_ext.h"
/********************************************************************************************/
/* Defines */
/********************************************************************************************/
#define pwm_check_param(ret, errno, param, cmd) do { \
if ((param)) { \
soc_log_err("%s failed!\n", #param); \
ret = (errno); \
cmd; \
} \
} while (0)
#define pwm_func_call(ret, func, cmd) do { \
(ret) = (func); \
if ((ret) != TD_SUCCESS) { \
soc_log_err("failed!\n"); \
cmd; \
} \
} while (0)
#define pwm_mem_func_call(ret, func, cmd) do { \
(ret) = (func); \
if ((ret) != EOK) { \
soc_log_err("failed!\n"); \
cmd; \
} \
} while (0)
/********************************************************************************************/
/* Enums */
/********************************************************************************************/
typedef enum {
PWM_VERSION_V1 = 1, /* reserved9/reserved13 */
PWM_VERSION_V2, /* reserved5/reserved2 */
PWM_VERSION_V3, /* reserved17/reserved19 */
PWM_VERSION_MAX
} pwm_version;
/********************************************************************************************/
/* Structures */
/********************************************************************************************/
typedef struct {
uintptr_t gpio_pwm_out_en;
uintptr_t gpio_pwm_direction;
uintptr_t cfg;
uintptr_t ctrl;
uintptr_t cnt;
uintptr_t state0;
uintptr_t state1;
uintptr_t state2;
} pwm_reg_s;
typedef struct {
td_u32 pwm_clk_freq;
td_u32 pwm_freq_critical;
td_u32 period_duty_offset;
td_u32 time_us; /* used for moto pwm */
const ext_drv_pwm_attr *pwm_attr;
const pwm_reg_s *pwm_reg;
td_u32 cfg_reg_value;
td_u32 ctrl_reg_value;
td_u32 cnt_reg_value; /* used for moto pwm */
} pwm_info;
/********************************************************************************************
Function Implementation
********************************************************************************************/
pwm_version pwm_get_version(td_void);
td_s32 pwm_gpio_convert(td_u32 gpio_no, td_u16 gpio_pwm_bit_num, td_u32 *group_no, td_u32 *bit_no);
td_s32 pwm_get_attr(td_u32 freq, td_u32 period, td_u32 duty, td_u32 inv, ext_drv_pwm_attr *pwm_attr);
td_s32 pwm_set_attr(pwm_info *attr);
td_s32 pwm_set_enable(td_u32 enable);
td_s32 pwm_get_enable(td_u32 *enable);
td_u32 pwm_get_bit_count(td_u32 value);
td_s32 pwm_check_carrier_signal_duration_us(td_u32 carrier_signal_duration_us);
td_s32 pwm_check_low_level_signal_duration_us(td_u32 low_level_signal_duration_us);
td_s32 pwm_output_carrier_signal(td_u32 carrier_signal_duration_us);
td_s32 pwm_output_low_level_signal(td_u32 low_level_signal_duration_us);
td_s32 ext_drv_pwm_get_enable(td_u32 pwm_no, td_bool *enable);
#endif /* PWM_COMMON_H */