220 lines
6.6 KiB
C
220 lines
6.6 KiB
C
|
/*
|
|||
|
* Copyright : (C) 2022 Phytium Information Technology, Inc.
|
|||
|
* All Rights Reserved.
|
|||
|
*
|
|||
|
* This program is OPEN SOURCE software: you can redistribute it and/or modify it
|
|||
|
* under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
|
|||
|
* either version 1.0 of the License, or (at your option) any later version.
|
|||
|
*
|
|||
|
* This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
|
|||
|
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|||
|
* See the Phytium Public License for more details.
|
|||
|
*
|
|||
|
*
|
|||
|
* FilePath: fpwm.h
|
|||
|
* Date: 2022-02-10 14:53:42
|
|||
|
* LastEditTime: 2022-02-25 11:45:05
|
|||
|
* Description: This files is for
|
|||
|
*
|
|||
|
* Modify History:
|
|||
|
* Ver Who Date Changes
|
|||
|
* ----- ------ -------- --------------------------------------
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef BSP_DRIVERS_FPWM_H
|
|||
|
#define BSP_DRIVERS_FPWM_H
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
extern "C"
|
|||
|
{
|
|||
|
#endif
|
|||
|
|
|||
|
#include "ftypes.h"
|
|||
|
#include "fdebug.h"
|
|||
|
#include "ferror_code.h"
|
|||
|
#include "fkernel.h"
|
|||
|
#include "fassert.h"
|
|||
|
#include "fparameters.h"
|
|||
|
|
|||
|
#define FPWM_SUCCESS FT_SUCCESS
|
|||
|
#define FPWM_ERR_INVAL_PARM FT_MAKE_ERRCODE(ErrModBsp, ErrBspPwm, 1)
|
|||
|
#define FPWM_ERR_NOT_READY FT_MAKE_ERRCODE(ErrModBsp, ErrBspPwm, 2)
|
|||
|
#define FPWM_ERR_TIMEOUT FT_MAKE_ERRCODE(ErrModBsp, ErrBspPwm, 3)
|
|||
|
#define FPWM_ERR_NOT_SUPPORT FT_MAKE_ERRCODE(ErrModBsp, ErrBspPwm, 4)
|
|||
|
#define FPWM_ERR_CMD_FAILED FT_MAKE_ERRCODE(ErrModBsp, ErrBspPwm, 5)
|
|||
|
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
FPWM_INTR_EVENT_COUNTER = 0, /**< Handler type for counter interrupt */
|
|||
|
FPWM_INTR_EVENT_FIFO_EMPTY = 1, /**< Handler type for fifo empty interrupt*/
|
|||
|
FPWM_INTR_EVENT_NUM
|
|||
|
} FPwmIntrEventType;
|
|||
|
|
|||
|
/* duty sel */
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
FPWM_DUTY_CCR = 0, /* duty value from pwm ccr register */
|
|||
|
FPWM_DUTY_FIFO = 1, /* duty value from fifo */
|
|||
|
FPWM_DUTY_SEL_MODE_NUM
|
|||
|
} FPwmDutySourceMode;
|
|||
|
|
|||
|
/* tim_ctrl mode, counter mode */
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
FPWM_MODULO = 0, /* count from 0~period */
|
|||
|
FPWM_UP_DOWN = 1, /* count from 0~period~0 */
|
|||
|
FPWM_TIM_CTRL_MODE_NUM
|
|||
|
} FPwmTimCtrlMode;
|
|||
|
|
|||
|
/* pwm mode, only the compare output mode is supported currently*/
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
FPWM_NONE_MODE = 0,/* no mode */
|
|||
|
FPWM_OUTPUT_COMPARE = 1,/* compare output mode */
|
|||
|
FPWM_CTRL_MODE_NUM
|
|||
|
} FPwmCtrlMode;
|
|||
|
|
|||
|
/**
|
|||
|
* enum pwm_polarity - polarity of a PWM compare signal
|
|||
|
* @FPWM_POLARITY_NORMAL: a high signal for the duration of the duty-
|
|||
|
* cycle, followed by a low signal for the remainder of the pulse
|
|||
|
* period
|
|||
|
* @FPWM_POLARITY_INVERSED: a low signal for the duration of the duty-
|
|||
|
* cycle, followed by a high signal for the remainder of the pulse
|
|||
|
* period
|
|||
|
*/
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
FPWM_POLARITY_OUTPUT_HIGH = 0b000,
|
|||
|
FPWM_POLARITY_OUTPUT_LOW = 0b001,
|
|||
|
FPWM_POLARITY_OUTPUT_FLIP = 0b010,
|
|||
|
FPWM_POLARITY_INVERSED = 0b011,
|
|||
|
FPWM_POLARITY_NORMAL = 0b100,
|
|||
|
FPWM_POLARITY_CCR_LOW = 0b101,
|
|||
|
FPWM_POLARITY_CCR_HIGH = 0b110,
|
|||
|
FPWM_POLARITY_INIT = 0b111,
|
|||
|
FPWM_POLARITY_NUM
|
|||
|
} FPwmPolarity;
|
|||
|
|
|||
|
|
|||
|
/* db polarity select */
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
FPWM_DB_AH = 0, /* no flip */
|
|||
|
FPWM_DB_ALC = 1,/* pwm0 flip */
|
|||
|
FPWM_DB_AHC, /* pwm1 flip */
|
|||
|
FPWM_DB_AL, /* pwm0 and pwm1 flip */
|
|||
|
FPWM_DB_POLARITY_NUM
|
|||
|
} FPwmDbPolarity;
|
|||
|
|
|||
|
/* db out mode */
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
FPWM_DB_OUT_MODE_BYPASS = 0b00, /* by pass */
|
|||
|
FPWM_DB_OUT_MODE_FORBID_RISE = 0b01,/* forbid rise delay */
|
|||
|
FPWM_DB_OUT_MODE_FORBID_FALL = 0b10,/* forbid fall delay */
|
|||
|
FPWM_DB_OUT_MODE_ENABLE_RISE_FALL = 0b11,/* enable rise and fall delay */
|
|||
|
FPWM_DB_OUT_MODE_NUM
|
|||
|
} FPwmDbOutMode;
|
|||
|
|
|||
|
/* db input source select, channel 0 or 1 */
|
|||
|
typedef enum
|
|||
|
{
|
|||
|
FPWM_DB_IN_MODE_PWM0 = 0,/* db input source choose pwm0 */
|
|||
|
FPWM_DB_IN_MODE_PWM1 = 1,/* db input source choose pwm1 */
|
|||
|
FPWM_DB_IN_MODE_NUM
|
|||
|
} FPwmDbInMode;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
FPwmDbPolarity db_polarity_sel;/* db polarity select*/
|
|||
|
FPwmDbOutMode db_out_mode;/* db output mode*/
|
|||
|
FPwmDbInMode db_in_mode;/* db input source*/
|
|||
|
u16 db_fall_cycle;/* db falling edge delay cycle */
|
|||
|
u16 db_rise_cycle;/* db rising edge delay cycle */
|
|||
|
} FPwmDbVariableConfig;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
FPwmTimCtrlMode tim_ctrl_mode;/* tim_ctrl mode, counter mode */
|
|||
|
u16 tim_ctrl_div;/* pwm divider */
|
|||
|
u16 pwm_period;/* pwm period value */
|
|||
|
FPwmCtrlMode pwm_mode;/* pwm mode, compare output */
|
|||
|
FPwmPolarity pwm_polarity;/* pwm compare output polarity */
|
|||
|
FPwmDutySourceMode pwm_duty_source_mode;/* pwm duty value source */
|
|||
|
u16 pwm_pulse;/* pwm pulse value */
|
|||
|
|
|||
|
} FPwmVariableConfig;
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
u8 instance_id;/* pwm id */
|
|||
|
uintptr db_base_addr;
|
|||
|
uintptr pwm_base_addr;
|
|||
|
|
|||
|
u64 base_clk;
|
|||
|
u32 irq_num[FPWM_CHANNEL_NUM]; /* pwm irq num */
|
|||
|
u32 irq_prority[FPWM_CHANNEL_NUM]; /* pwm irq priority */
|
|||
|
const char *instance_name;/* instance name */
|
|||
|
|
|||
|
} FPwmConfig; /* Pwm配置 */
|
|||
|
|
|||
|
typedef void (*FPwmIntrEventHandler)(void *param);
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
FPwmConfig config;/* Pwm配置 */
|
|||
|
u32 is_ready;/* Pwm初始化完成标志 */
|
|||
|
|
|||
|
u8 channel_ctrl_enable[FPWM_CHANNEL_NUM]; /* pwm channel ctrl enable state */
|
|||
|
|
|||
|
FPwmIntrEventHandler event_handler[FPWM_INTR_EVENT_NUM]; /* event handler for interrupt */
|
|||
|
void *event_param[FPWM_INTR_EVENT_NUM]; /* parameters ptr of event handler */
|
|||
|
|
|||
|
} FPwmCtrl;
|
|||
|
|
|||
|
|
|||
|
/* interrupt handler function */
|
|||
|
void FPwmIntrHandler(s32 vector, void *args);
|
|||
|
|
|||
|
/* register the handler function */
|
|||
|
void FPwmRegisterInterruptHandler(FPwmCtrl *instance_p, FPwmIntrEventType event_type, FPwmIntrEventHandler handler, void *param);
|
|||
|
|
|||
|
/* get pwm configs by id */
|
|||
|
const FPwmConfig *FPwmLookupConfig(FPwmInstance instance_id);
|
|||
|
|
|||
|
/* DeInitialization function for the device instance */
|
|||
|
void FPwmDeInitialize(FPwmCtrl *pctrl);
|
|||
|
|
|||
|
/*Initializes a specific instance such that it is ready to be used*/
|
|||
|
FError FPwmCfgInitialize(FPwmCtrl *pctrl, const FPwmConfig *input_config_p);
|
|||
|
|
|||
|
/* set pwm db configuration */
|
|||
|
FError FPwmDbVariableSet(FPwmCtrl *pctrl, FPwmDbVariableConfig *db_cfg_p);
|
|||
|
|
|||
|
/* get pwm db configuration */
|
|||
|
FError FPwmDbVariableGet(FPwmCtrl *pctrl, FPwmDbVariableConfig *db_cfg_p);
|
|||
|
|
|||
|
/* set pwm channel configuration */
|
|||
|
FError FPwmVariableSet(FPwmCtrl *pctrl, u32 channel, FPwmVariableConfig *pwm_cfg_p);
|
|||
|
|
|||
|
/* get pwm channel configuration */
|
|||
|
FError FPwmVariableGet(FPwmCtrl *pctrl, u32 channel, FPwmVariableConfig *pwm_cfg_p);
|
|||
|
|
|||
|
/* config pwm pulse, pwm_ccr is less than pwm_period */
|
|||
|
FError FPwmPulseSet(FPwmCtrl *pctrl, u32 channel, u16 pwm_ccr);
|
|||
|
|
|||
|
/* disable pwm */
|
|||
|
void FPwmDisable(FPwmCtrl *pctrl, u32 channel);
|
|||
|
|
|||
|
/* enable pwm */
|
|||
|
void FPwmEnable(FPwmCtrl *pctrl, u32 channel);
|
|||
|
|
|||
|
/* dump some pwm registers value */
|
|||
|
void FPwmDump(uintptr base_addr);
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
#endif
|