149 lines
4.3 KiB
C
149 lines
4.3 KiB
C
|
||
/* Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
|
||
|
||
* Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
|
||
* the the People's Republic of China and other countries.
|
||
* All Allwinner Technology Co.,Ltd. trademarks are used with permission.
|
||
|
||
* DISCLAIMER
|
||
* THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
|
||
* IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
|
||
* IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
|
||
* ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
|
||
* ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
|
||
* COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
|
||
* YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
|
||
|
||
|
||
* THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
|
||
* PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
|
||
* WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
|
||
* THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
|
||
* OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||
* IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
* LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
|
||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
||
*/
|
||
|
||
#ifndef __SUNXI_HAL_PWM_H__
|
||
#define __SUNXI_HAL_PWM_H__
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
#include <hal_clk.h>
|
||
#include <hal_reset.h>
|
||
#include <sunxi_hal_common.h>
|
||
// #include <init.h>
|
||
#include <pwm/platform_pwm.h>
|
||
|
||
//#define CONFIG_DRIVERS_PWM_DEBUG
|
||
#ifdef CONFIG_DRIVERS_PWM_DEBUG
|
||
#define PWM_INFO(fmt, arg...) hal_log_info(fmt, ##arg)
|
||
#else
|
||
#define PWM_INFO(fmt, arg...) do {}while(0)
|
||
#endif
|
||
|
||
#define PWM_ERR(fmt, arg...) hal_log_err(fmt, ##arg)
|
||
|
||
#undef readl
|
||
#undef writel
|
||
#define readl(addr) (*((volatile unsigned long *)(addr)))
|
||
#define writel(v, addr) (*((volatile unsigned long *)(addr)) = (unsigned long)(v))
|
||
|
||
#define PRESCALE_MAX 256
|
||
|
||
/*************
|
||
*SET_BITS set
|
||
* **********/
|
||
#define SETMASK(width, shift) ((width?((-1U) >> (32-width)):0) << (shift))
|
||
#define CLRMASK(width, shift) (~(SETMASK(width, shift)))
|
||
#define GET_BITS(shift, width, reg) \
|
||
(((reg) & SETMASK(width, shift)) >> (shift))
|
||
#define SET_BITS(shift, width, reg, val) \
|
||
(((reg) & CLRMASK(width, shift)) | (val << (shift)))
|
||
|
||
/* define shift and width */
|
||
#define PWM_CLK_SRC_SHIFT 0x7
|
||
#define PWM_CLK_SRC_WIDTH 0x2
|
||
|
||
#define PWM_DIV_M_SHIFT 0x0
|
||
#define PWM_DIV_M_WIDTH 0x4
|
||
|
||
#define PWM_PRESCAL_SHIFT 0x0
|
||
#define PWM_PRESCAL_WIDTH 0x8
|
||
|
||
#define PWM_ACT_CYCLES_SHIFT 0x0
|
||
#define PWM_ACT_CYCLES_WIDTH 0x10
|
||
|
||
#define PWM_PERIOD_CYCLES_SHIFT 0x10
|
||
#define PWM_PERIOD_CYCLES_WIDTH 0x10
|
||
|
||
/*****************************************************************************
|
||
* Enums
|
||
*****************************************************************************/
|
||
typedef unsigned long pwm_status_t;
|
||
|
||
typedef enum
|
||
{
|
||
PWM_CLK_OSC,
|
||
PWM_CLK_APB,
|
||
} hal_pwm_clk_src;
|
||
|
||
typedef enum
|
||
{
|
||
PWM_POLARITY_INVERSED = 0,
|
||
PWM_POLARITY_NORMAL = 1,
|
||
} hal_pwm_polarity;
|
||
|
||
typedef enum
|
||
{
|
||
PWM_CONTROL = 0,
|
||
PWM_CHANNEL_INT = 1,
|
||
PWM_CHANNEL_UNINT = 2,
|
||
} hal_pwm_cmd_t;
|
||
|
||
typedef struct pwm_config
|
||
{
|
||
uint32_t duty_ns;
|
||
uint32_t period_ns;
|
||
hal_pwm_polarity polarity;
|
||
} pwm_config_t;
|
||
|
||
typedef struct
|
||
{
|
||
hal_clk_type_t pwm_clk_type;
|
||
hal_clk_id_t pwm_bus_clk_id;
|
||
hal_clk_t pwm_bus_clk;
|
||
hal_reset_type_t pwm_reset_type;
|
||
hal_reset_id_t pwm_reset_id;
|
||
struct reset_control *pwm_reset;
|
||
|
||
gpio_pin_t pin[8];
|
||
gpio_muxsel_t enable_muxsel[8];
|
||
} hal_pwm_t;
|
||
|
||
pwm_status_t hal_pwm_init(void);
|
||
pwm_status_t hal_pwm_control(int channel, struct pwm_config *config_pwm);
|
||
void hal_pwm_enable_controller(uint32_t channel_in);
|
||
void hal_pwm_disable_controller(uint32_t channel_in);
|
||
pwm_status_t hal_pwm_deinit(void);
|
||
|
||
pwm_status_t hal_pwm_resume(void);
|
||
pwm_status_t hal_pwm_suspend(void);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif /* __SUNXI_HAL_PWM_H__ */
|
||
|
||
|