wdt.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. /* Copyright 2018 Canaan Inc.
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. #ifndef _DRIVER_WDT_H
  16. #define _DRIVER_WDT_H
  17. #include <plic.h>
  18. #include <stddef.h>
  19. #include <stdint.h>
  20. #ifdef __cplusplus
  21. extern "C" {
  22. #endif
  23. /* clang-format off */
  24. typedef struct _wdt
  25. {
  26. /* WDT Control Register (0x00) */
  27. volatile uint32_t cr;
  28. /* WDT Timeout Range Register (0x04) */
  29. volatile uint32_t torr;
  30. /* WDT Current Counter Value Register (0x08) */
  31. volatile uint32_t ccvr;
  32. /* WDT Counter Restart Register (0x0c) */
  33. volatile uint32_t crr;
  34. /* WDT Interrupt Status Register (0x10) */
  35. volatile uint32_t stat;
  36. /* WDT Interrupt Clear Register (0x14) */
  37. volatile uint32_t eoi;
  38. /* reserverd (0x18) */
  39. volatile uint32_t resv1;
  40. /* WDT Protection level Register (0x1c) */
  41. volatile uint32_t prot_level;
  42. /* reserved (0x20-0xe0) */
  43. volatile uint32_t resv4[49];
  44. /* WDT Component Parameters Register 5 (0xe4) */
  45. volatile uint32_t comp_param_5;
  46. /* WDT Component Parameters Register 4 (0xe8) */
  47. volatile uint32_t comp_param_4;
  48. /* WDT Component Parameters Register 3 (0xec) */
  49. volatile uint32_t comp_param_3;
  50. /* WDT Component Parameters Register 2 (0xf0) */
  51. volatile uint32_t comp_param_2;
  52. /* WDT Component Parameters Register 1 (0xf4) */
  53. volatile uint32_t comp_param_1;
  54. /* WDT Component Version Register (0xf8) */
  55. volatile uint32_t comp_version;
  56. /* WDT Component Type Register (0xfc) */
  57. volatile uint32_t comp_type;
  58. } __attribute__((packed, aligned(4))) wdt_t;
  59. typedef enum _wdt_device_number
  60. {
  61. WDT_DEVICE_0,
  62. WDT_DEVICE_1,
  63. WDT_DEVICE_MAX,
  64. } wdt_device_number_t;
  65. #define WDT_RESET_ALL 0x00000000U
  66. #define WDT_RESET_CPU 0x00000001U
  67. /* WDT Control Register */
  68. #define WDT_CR_ENABLE 0x00000001U
  69. #define WDT_CR_RMOD_MASK 0x00000002U
  70. #define WDT_CR_RMOD_RESET 0x00000000U
  71. #define WDT_CR_RMOD_INTERRUPT 0x00000002U
  72. #define WDT_CR_RPL_MASK 0x0000001CU
  73. #define WDT_CR_RPL(x) ((x) << 2)
  74. /* WDT Timeout Range Register */
  75. #define WDT_TORR_TOP_MASK 0x000000FFU
  76. #define WDT_TORR_TOP(x) ((x) << 4 | (x) << 0)
  77. /* WDT Current Counter Value Register */
  78. #define WDT_CCVR_MASK 0xFFFFFFFFU
  79. /* WDT Counter Restart Register */
  80. #define WDT_CRR_MASK 0x00000076U
  81. /* WDT Interrupt Status Register */
  82. #define WDT_STAT_MASK 0x00000001U
  83. /* WDT Interrupt Clear Register */
  84. #define WDT_EOI_MASK 0x00000001U
  85. /* WDT Protection level Register */
  86. #define WDT_PROT_LEVEL_MASK 0x00000007U
  87. /* WDT Component Parameter Register 5 */
  88. #define WDT_COMP_PARAM_5_CP_WDT_USER_TOP_MAX_MASK 0xFFFFFFFFU
  89. /* WDT Component Parameter Register 4 */
  90. #define WDT_COMP_PARAM_4_CP_WDT_USER_TOP_INIT_MAX_MASK 0xFFFFFFFFU
  91. /* WDT Component Parameter Register 3 */
  92. #define WDT_COMP_PARAM_3_CD_WDT_TOP_RST_MASK 0xFFFFFFFFU
  93. /* WDT Component Parameter Register 2 */
  94. #define WDT_COMP_PARAM_3_CP_WDT_CNT_RST_MASK 0xFFFFFFFFU
  95. /* WDT Component Parameter Register 1 */
  96. #define WDT_COMP_PARAM_1_WDT_ALWAYS_EN_MASK 0x00000001U
  97. #define WDT_COMP_PARAM_1_WDT_DFLT_RMOD_MASK 0x00000002U
  98. #define WDT_COMP_PARAM_1_WDT_DUAL_TOP_MASK 0x00000004U
  99. #define WDT_COMP_PARAM_1_WDT_HC_RMOD_MASK 0x00000008U
  100. #define WDT_COMP_PARAM_1_WDT_HC_RPL_MASK 0x00000010U
  101. #define WDT_COMP_PARAM_1_WDT_HC_TOP_MASK 0x00000020U
  102. #define WDT_COMP_PARAM_1_WDT_USE_FIX_TOP_MASK 0x00000040U
  103. #define WDT_COMP_PARAM_1_WDT_PAUSE_MASK 0x00000080U
  104. #define WDT_COMP_PARAM_1_APB_DATA_WIDTH_MASK 0x00000300U
  105. #define WDT_COMP_PARAM_1_WDT_DFLT_RPL_MASK 0x00001C00U
  106. #define WDT_COMP_PARAM_1_WDT_DFLT_TOP_MASK 0x000F0000U
  107. #define WDT_COMP_PARAM_1_WDT_DFLT_TOP_INIT_MASK 0x00F00000U
  108. #define WDT_COMP_PARAM_1_WDT_CNT_WIDTH_MASK 0x1F000000U
  109. /* WDT Component Version Register */
  110. #define WDT_COMP_VERSION_MASK 0xFFFFFFFFU
  111. /* WDT Component Type Register */
  112. #define WDT_COMP_TYPE_MASK 0xFFFFFFFFU
  113. /* clang-format on */
  114. /**
  115. * @brief Feed wdt
  116. */
  117. void wdt_feed(wdt_device_number_t id);
  118. /**
  119. * @brief Start wdt
  120. *
  121. * @param[in] id Wdt id 0 or 1
  122. * @param[in] time_out_ms Wdt trigger time
  123. * @param[in] on_irq Wdt interrupt callback
  124. *
  125. */
  126. void wdt_start(wdt_device_number_t id, uint64_t time_out_ms, plic_irq_callback_t on_irq);
  127. /**
  128. * @brief Start wdt
  129. *
  130. * @param[in] id Wdt id 0 or 1
  131. * @param[in] time_out_ms Wdt trigger time
  132. * @param[in] on_irq Wdt interrupt callback
  133. * @param[in] ctx Param of callback
  134. *
  135. * @return Wdt time
  136. *
  137. */
  138. uint32_t wdt_init(wdt_device_number_t id, uint64_t time_out_ms, plic_irq_callback_t on_irq, void *ctx);
  139. /**
  140. * @brief Stop wdt
  141. *
  142. * @param[in] id Wdt id 0 or 1
  143. *
  144. */
  145. void wdt_stop(wdt_device_number_t id);
  146. /**
  147. * @brief Clear wdt interrupt
  148. *
  149. * @param[in] id Wdt id 0 or 1
  150. *
  151. */
  152. void wdt_clear_interrupt(wdt_device_number_t id);
  153. #ifdef __cplusplus
  154. }
  155. #endif
  156. #endif /* _DRIVER_WDT_H */