hal_cru.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /* SPDX-License-Identifier: BSD-3-Clause */
  2. /*
  3. * Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd.
  4. */
  5. #include "hal_conf.h"
  6. #ifdef HAL_CRU_MODULE_ENABLED
  7. /** @addtogroup RK_HAL_Driver
  8. * @{
  9. */
  10. /** @addtogroup CRU
  11. * @{
  12. */
  13. #ifndef _HAL_CRU_H_
  14. #define _HAL_CRU_H_
  15. #include "hal_def.h"
  16. /*************************** MACRO Definition ****************************/
  17. /** @defgroup CRU_Exported_Definition_Group1 Basic Definition
  18. * @{
  19. */
  20. #define MHZ 1000000
  21. #define KHZ 1000
  22. #ifndef PLL_INPUT_OSC_RATE
  23. #define PLL_INPUT_OSC_RATE (24 * MHZ)
  24. #endif
  25. #define CLK_RESET_GET_REG_OFFSET(x) ((uint32_t)((x) / 16))
  26. #define CLK_RESET_GET_BITS_SHIFT(x) ((uint32_t)((x) % 16))
  27. #define CLK_GATE_GET_REG_OFFSET(x) ((uint32_t)((x) / 16))
  28. #define CLK_GATE_GET_BITS_SHIFT(x) ((uint32_t)((x) % 16))
  29. #define CLK_GET_MUX(x) ((x) & 0x0F0F00FFU)
  30. #define CLK_GET_DIV(x) ((((x) & 0xFF00U) >> 8) | (((x) & 0xF0F00000U) >> 4))
  31. #define WIDTH_TO_MASK(width) ((1 << (width)) - 1)
  32. #define CLK_MUX_REG_OFFSET_SHIFT 0U
  33. #define CLK_MUX_REG_OFFSET_MASK 0x0000FFFFU
  34. #define CLK_MUX_SHIFT_SHIFT 16U
  35. #define CLK_MUX_SHIFT_MASK 0x00FF0000U
  36. #define CLK_MUX_WIDTH_SHIFT 24U
  37. #define CLK_MUX_WIDTH_MASK 0xFF000000U
  38. #define CLK_MUX_GET_REG_OFFSET(x) \
  39. (((uint32_t)(x) & CLK_MUX_REG_OFFSET_MASK) >> CLK_MUX_REG_OFFSET_SHIFT)
  40. #define CLK_MUX_GET_BITS_SHIFT(x) \
  41. (((uint32_t)(x) & CLK_MUX_SHIFT_MASK) >> CLK_MUX_SHIFT_SHIFT)
  42. #define CLK_MUX_GET_MASK(x) \
  43. WIDTH_TO_MASK((((uint32_t)(x) & CLK_MUX_WIDTH_MASK) >> CLK_MUX_WIDTH_SHIFT)) \
  44. << CLK_MUX_GET_BITS_SHIFT(x)
  45. #define CLK_DIV_REG_OFFSET_SHIFT 0U
  46. #define CLK_DIV_REG_OFFSET_MASK 0x0000FFFFU
  47. #define CLK_DIV_SHIFT_SHIFT 16U
  48. #define CLK_DIV_SHIFT_MASK 0x00FF0000U
  49. #define CLK_DIV_WIDTH_SHIFT 24U
  50. #define CLK_DIV_WIDTH_MASK 0xFF000000U
  51. #define CLK_DIV_GET_REG_OFFSET(x) \
  52. (((uint32_t)(x) & CLK_DIV_REG_OFFSET_MASK) >> CLK_DIV_REG_OFFSET_SHIFT)
  53. #define CLK_DIV_GET_BITS_SHIFT(x) \
  54. (((uint32_t)(x) & CLK_DIV_SHIFT_MASK) >> CLK_DIV_SHIFT_SHIFT)
  55. #define CLK_DIV_GET_MASK(x) \
  56. WIDTH_TO_MASK((((uint32_t)(x) & CLK_DIV_WIDTH_MASK) >> CLK_DIV_WIDTH_SHIFT)) \
  57. << CLK_DIV_GET_BITS_SHIFT(x)
  58. #define RK_PLL_RATE(_rate, _refdiv, _fbdiv, _postdiv1, _postdiv2, _dsmpd, \
  59. _frac) \
  60. { \
  61. .rate = _rate##U, .fbDiv = _fbdiv, .postDiv1 = _postdiv1, \
  62. .refDiv = _refdiv, .postDiv2 = _postdiv2, .dsmpd = _dsmpd, \
  63. .frac = _frac, \
  64. }
  65. struct PLL_CONFIG {
  66. uint32_t rate;
  67. uint32_t fbDiv;
  68. uint32_t postDiv1;
  69. uint32_t refDiv;
  70. uint32_t postDiv2;
  71. uint32_t dsmpd;
  72. uint32_t frac;
  73. };
  74. struct PLL_SETUP {
  75. __IO uint32_t *conOffset0;
  76. __IO uint32_t *conOffset1;
  77. __IO uint32_t *conOffset2;
  78. __IO uint32_t *conOffset3;
  79. __IO uint32_t *modeOffset;
  80. __I uint32_t *stat0;
  81. uint32_t modeShift;
  82. uint32_t lockShift;
  83. uint32_t modeMask;
  84. const struct PLL_CONFIG *rateTable;
  85. };
  86. typedef enum {
  87. GLB_SRST_FST = 0xfdb9,
  88. GLB_SRST_SND = 0xeca8,
  89. } eCRU_GlbSrstType;
  90. typedef enum {
  91. GLB_RST_FST_WDT0 = 0U,
  92. GLB_RST_SND_WDT0,
  93. GLB_RST_FST_WDT1,
  94. GLB_RST_SND_WDT1,
  95. GLB_RST_FST_WDT2,
  96. GLB_RST_SND_WDT2,
  97. } eCRU_WdtRstType;
  98. /***************************** Structure Definition **************************/
  99. /** @} */
  100. /***************************** Function Declare ******************************/
  101. /** @defgroup CRU_Public_Function_Declare Public Function Declare
  102. * @{
  103. */
  104. uint32_t HAL_CRU_GetPllFreq(struct PLL_SETUP *pSetup);
  105. HAL_Status HAL_CRU_SetPllFreq(struct PLL_SETUP *pSetup, uint32_t rate);
  106. HAL_Status HAL_CRU_SetPllPowerUp(struct PLL_SETUP *pSetup);
  107. HAL_Status HAL_CRU_SetPllPowerDown(struct PLL_SETUP *pSetup);
  108. HAL_Check HAL_CRU_ClkIsEnabled(uint32_t clk);
  109. HAL_Status HAL_CRU_ClkEnable(uint32_t clk);
  110. HAL_Status HAL_CRU_ClkDisable(uint32_t clk);
  111. HAL_Check HAL_CRU_ClkIsReset(uint32_t clk);
  112. HAL_Status HAL_CRU_ClkResetAssert(uint32_t clk);
  113. HAL_Status HAL_CRU_ClkResetDeassert(uint32_t clk);
  114. HAL_Status HAL_CRU_ClkSetDiv(uint32_t divName, uint32_t divValue);
  115. uint32_t HAL_CRU_ClkGetDiv(uint32_t divName);
  116. HAL_Status HAL_CRU_ClkSetMux(uint32_t muxName, uint32_t muxValue);
  117. uint32_t HAL_CRU_ClkGetMux(uint32_t muxName);
  118. HAL_Status HAL_CRU_FracdivGetConfig(uint32_t rateOut, uint32_t rate,
  119. uint32_t *numerator,
  120. uint32_t *denominator);
  121. uint32_t HAL_CRU_ClkGetFreq(eCLOCK_Name clockName);
  122. HAL_Status HAL_CRU_ClkSetFreq(eCLOCK_Name clockName, uint32_t rate);
  123. HAL_Status HAL_CRU_VopDclkEnable(uint32_t gateId);
  124. HAL_Status HAL_CRU_VopDclkDisable(uint32_t gateId);
  125. HAL_Status HAL_CRU_ClkNp5BestDiv(eCLOCK_Name clockName, uint32_t rate, uint32_t pRate, uint32_t *bestdiv);
  126. HAL_Status HAL_CRU_SetGlbSrst(eCRU_GlbSrstType type);
  127. HAL_Status HAL_CRU_WdtGlbRstEnable(eCRU_WdtRstType wdtType);
  128. HAL_Status HAL_CRU_PllCompensation(eCLOCK_Name clockName, int ppm);
  129. #ifdef HAL_CRU_AS_FEATURE_ENABLED
  130. /**
  131. * @brief it is for AS init.
  132. */
  133. void HAL_CRU_AsInit(void);
  134. /**
  135. * @brief it is for AS enable.
  136. * @param ch: channel
  137. * @param en: 1 is enable, 0 is disable.
  138. */
  139. void HAL_CRU_AsEnable(uint8_t ch, uint8_t en);
  140. #endif
  141. /** @} */
  142. #endif
  143. /** @} */
  144. /** @} */
  145. #endif /* HAL_CRU_MODULE_ENABLED */