sunxi_hal_pwm.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /* Copyright (c) 2019-2025 Allwinner Technology Co., Ltd. ALL rights reserved.
  2. * Allwinner is a trademark of Allwinner Technology Co.,Ltd., registered in
  3. * the the People's Republic of China and other countries.
  4. * All Allwinner Technology Co.,Ltd. trademarks are used with permission.
  5. * DISCLAIMER
  6. * THIRD PARTY LICENCES MAY BE REQUIRED TO IMPLEMENT THE SOLUTION/PRODUCT.
  7. * IF YOU NEED TO INTEGRATE THIRD PARTY’S TECHNOLOGY (SONY, DTS, DOLBY, AVS OR MPEGLA, ETC.)
  8. * IN ALLWINNERS’SDK OR PRODUCTS, YOU SHALL BE SOLELY RESPONSIBLE TO OBTAIN
  9. * ALL APPROPRIATELY REQUIRED THIRD PARTY LICENCES.
  10. * ALLWINNER SHALL HAVE NO WARRANTY, INDEMNITY OR OTHER OBLIGATIONS WITH RESPECT TO MATTERS
  11. * COVERED UNDER ANY REQUIRED THIRD PARTY LICENSE.
  12. * YOU ARE SOLELY RESPONSIBLE FOR YOUR USAGE OF THIRD PARTY’S TECHNOLOGY.
  13. * THIS SOFTWARE IS PROVIDED BY ALLWINNER"AS IS" AND TO THE MAXIMUM EXTENT
  14. * PERMITTED BY LAW, ALLWINNER EXPRESSLY DISCLAIMS ALL WARRANTIES OF ANY KIND,
  15. * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION REGARDING
  16. * THE TITLE, NON-INFRINGEMENT, ACCURACY, CONDITION, COMPLETENESS, PERFORMANCE
  17. * OR MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18. * IN NO EVENT SHALL ALLWINNER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  19. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  20. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  21. * LOSS OF USE, DATA, OR PROFITS, OR BUSINESS INTERRUPTION)
  22. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  23. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  24. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  25. * OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. #ifndef __SUNXI_HAL_PWM_H__
  28. #define __SUNXI_HAL_PWM_H__
  29. #ifdef __cplusplus
  30. extern "C" {
  31. #endif
  32. #include <hal_clk.h>
  33. #include <hal_reset.h>
  34. #include <sunxi_hal_common.h>
  35. // #include <init.h>
  36. #include <pwm/platform_pwm.h>
  37. //#define CONFIG_DRIVERS_PWM_DEBUG
  38. #ifdef CONFIG_DRIVERS_PWM_DEBUG
  39. #define PWM_INFO(fmt, arg...) hal_log_info(fmt, ##arg)
  40. #else
  41. #define PWM_INFO(fmt, arg...) do {}while(0)
  42. #endif
  43. #define PWM_ERR(fmt, arg...) hal_log_err(fmt, ##arg)
  44. #undef readl
  45. #undef writel
  46. #define readl(addr) (*((volatile unsigned long *)(addr)))
  47. #define writel(v, addr) (*((volatile unsigned long *)(addr)) = (unsigned long)(v))
  48. #define PRESCALE_MAX 256
  49. /*************
  50. *SET_BITS set
  51. * **********/
  52. #define SETMASK(width, shift) ((width?((-1U) >> (32-width)):0) << (shift))
  53. #define CLRMASK(width, shift) (~(SETMASK(width, shift)))
  54. #define GET_BITS(shift, width, reg) \
  55. (((reg) & SETMASK(width, shift)) >> (shift))
  56. #define SET_BITS(shift, width, reg, val) \
  57. (((reg) & CLRMASK(width, shift)) | (val << (shift)))
  58. /* define shift and width */
  59. #define PWM_CLK_SRC_SHIFT 0x7
  60. #define PWM_CLK_SRC_WIDTH 0x2
  61. #define PWM_DIV_M_SHIFT 0x0
  62. #define PWM_DIV_M_WIDTH 0x4
  63. #define PWM_PRESCAL_SHIFT 0x0
  64. #define PWM_PRESCAL_WIDTH 0x8
  65. #define PWM_ACT_CYCLES_SHIFT 0x0
  66. #define PWM_ACT_CYCLES_WIDTH 0x10
  67. #define PWM_PERIOD_CYCLES_SHIFT 0x10
  68. #define PWM_PERIOD_CYCLES_WIDTH 0x10
  69. /*****************************************************************************
  70. * Enums
  71. *****************************************************************************/
  72. typedef unsigned long pwm_status_t;
  73. typedef enum
  74. {
  75. PWM_CLK_OSC,
  76. PWM_CLK_APB,
  77. } hal_pwm_clk_src;
  78. typedef enum
  79. {
  80. PWM_POLARITY_INVERSED = 0,
  81. PWM_POLARITY_NORMAL = 1,
  82. } hal_pwm_polarity;
  83. typedef enum
  84. {
  85. PWM_CONTROL = 0,
  86. PWM_CHANNEL_INT = 1,
  87. PWM_CHANNEL_UNINT = 2,
  88. } hal_pwm_cmd_t;
  89. typedef struct pwm_config
  90. {
  91. uint32_t duty_ns;
  92. uint32_t period_ns;
  93. hal_pwm_polarity polarity;
  94. } pwm_config_t;
  95. typedef struct
  96. {
  97. hal_clk_type_t pwm_clk_type;
  98. hal_clk_id_t pwm_bus_clk_id;
  99. hal_clk_t pwm_bus_clk;
  100. hal_reset_type_t pwm_reset_type;
  101. hal_reset_id_t pwm_reset_id;
  102. struct reset_control *pwm_reset;
  103. gpio_pin_t pin[8];
  104. gpio_muxsel_t enable_muxsel[8];
  105. } hal_pwm_t;
  106. pwm_status_t hal_pwm_init(void);
  107. pwm_status_t hal_pwm_control(int channel, struct pwm_config *config_pwm);
  108. void hal_pwm_enable_controller(uint32_t channel_in);
  109. void hal_pwm_disable_controller(uint32_t channel_in);
  110. pwm_status_t hal_pwm_deinit(void);
  111. pwm_status_t hal_pwm_resume(void);
  112. pwm_status_t hal_pwm_suspend(void);
  113. #ifdef __cplusplus
  114. }
  115. #endif
  116. #endif /* __SUNXI_HAL_PWM_H__ */