wdt_hal_iram.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. // Copyright 2015-2019 Espressif Systems (Shanghai) PTE LTD
  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. #include <string.h>
  15. #include <stdbool.h>
  16. #include "hal/wdt_types.h"
  17. #include "hal/wdt_hal.h"
  18. /* ---------------------------- Init and Config ----------------------------- */
  19. void wdt_hal_init(wdt_hal_context_t *hal, wdt_inst_t wdt_inst, uint32_t prescaler, bool enable_intr)
  20. {
  21. //Initialize HAL context
  22. memset(hal, 0, sizeof(wdt_hal_context_t));
  23. if (wdt_inst == WDT_MWDT0) {
  24. hal->mwdt_dev = &TIMERG0;
  25. } else if (wdt_inst == WDT_MWDT1) {
  26. hal->mwdt_dev = &TIMERG1;
  27. } else {
  28. hal->rwdt_dev = &RTCCNTL;
  29. }
  30. hal->inst = wdt_inst;
  31. if (hal->inst == WDT_RWDT) {
  32. //Unlock RTC WDT
  33. rwdt_ll_write_protect_disable(hal->rwdt_dev);
  34. //Disable RTC WDT, all stages, and all interrupts.
  35. rwdt_ll_disable(hal->rwdt_dev);
  36. rwdt_ll_disable_stage(hal->rwdt_dev, WDT_STAGE0);
  37. rwdt_ll_disable_stage(hal->rwdt_dev, WDT_STAGE1);
  38. rwdt_ll_disable_stage(hal->rwdt_dev, WDT_STAGE2);
  39. rwdt_ll_disable_stage(hal->rwdt_dev, WDT_STAGE3);
  40. #ifdef CONFIG_IDF_TARGET_ESP32
  41. //Enable or disable level interrupt. Edge interrupt is always disabled.
  42. rwdt_ll_set_edge_intr(hal->rwdt_dev, false);
  43. rwdt_ll_set_level_intr(hal->rwdt_dev, enable_intr);
  44. #else //CONFIG_IDF_TARGET_ESP32S2BETA
  45. //Enable or disable chip reset on timeout, and length of chip reset signal
  46. rwdt_ll_set_chip_reset_width(hal->rwdt_dev, 0);
  47. rwdt_ll_set_chip_reset_en(hal->rwdt_dev, false);
  48. #endif
  49. rwdt_ll_clear_intr_status(hal->rwdt_dev);
  50. rwdt_ll_set_intr_enable(hal->rwdt_dev, enable_intr);
  51. //Set default values
  52. rwdt_ll_set_appcpu_reset_en(hal->rwdt_dev, true);
  53. rwdt_ll_set_procpu_reset_en(hal->rwdt_dev, true);
  54. rwdt_ll_set_pause_in_sleep_en(hal->rwdt_dev, true);
  55. rwdt_ll_set_cpu_reset_length(hal->rwdt_dev, WDT_RESET_SIG_LENGTH_3_2us);
  56. rwdt_ll_set_sys_reset_length(hal->rwdt_dev, WDT_RESET_SIG_LENGTH_3_2us);
  57. //Lock RTC WDT
  58. rwdt_ll_write_protect_enable(hal->rwdt_dev);
  59. } else {
  60. //Unlock WDT
  61. mwdt_ll_write_protect_disable(hal->mwdt_dev);
  62. //Disable WDT and stages.
  63. mwdt_ll_disable(hal->mwdt_dev);
  64. mwdt_ll_disable_stage(hal->mwdt_dev, 0);
  65. mwdt_ll_disable_stage(hal->mwdt_dev, 1);
  66. mwdt_ll_disable_stage(hal->mwdt_dev, 2);
  67. mwdt_ll_disable_stage(hal->mwdt_dev, 3);
  68. #if !CONFIG_IDF_TARGET_ESP32C3 && !CONFIG_IDF_TARGET_ESP32H2
  69. //Enable or disable level interrupt. Edge interrupt is always disabled.
  70. mwdt_ll_set_edge_intr(hal->mwdt_dev, false);
  71. mwdt_ll_set_level_intr(hal->mwdt_dev, enable_intr);
  72. #endif
  73. mwdt_ll_clear_intr_status(hal->mwdt_dev);
  74. mwdt_ll_set_intr_enable(hal->mwdt_dev, enable_intr);
  75. //Set default values
  76. mwdt_ll_set_cpu_reset_length(hal->mwdt_dev, WDT_RESET_SIG_LENGTH_3_2us);
  77. mwdt_ll_set_sys_reset_length(hal->mwdt_dev, WDT_RESET_SIG_LENGTH_3_2us);
  78. //Set tick period
  79. mwdt_ll_set_prescaler(hal->mwdt_dev, prescaler);
  80. //Lock WDT
  81. mwdt_ll_write_protect_enable(hal->mwdt_dev);
  82. }
  83. }
  84. void wdt_hal_deinit(wdt_hal_context_t *hal)
  85. {
  86. if (hal->inst == WDT_RWDT) {
  87. //Unlock WDT
  88. rwdt_ll_write_protect_disable(hal->rwdt_dev);
  89. //Disable WDT and clear any interrupts
  90. rwdt_ll_feed(hal->rwdt_dev);
  91. rwdt_ll_disable(hal->rwdt_dev);
  92. rwdt_ll_clear_intr_status(hal->rwdt_dev);
  93. rwdt_ll_set_intr_enable(hal->rwdt_dev, false);
  94. //Lock WDT
  95. rwdt_ll_write_protect_enable(hal->rwdt_dev);
  96. } else {
  97. //Unlock WDT
  98. mwdt_ll_write_protect_disable(hal->mwdt_dev);
  99. //Disable WDT and clear/disable any interrupts
  100. mwdt_ll_feed(hal->mwdt_dev);
  101. mwdt_ll_disable(hal->mwdt_dev);
  102. mwdt_ll_clear_intr_status(hal->mwdt_dev);
  103. mwdt_ll_set_intr_enable(hal->mwdt_dev, false);
  104. //Lock WDT
  105. mwdt_ll_write_protect_enable(hal->mwdt_dev);
  106. }
  107. //Deinit HAL context
  108. hal->mwdt_dev = NULL;
  109. }
  110. void wdt_hal_config_stage(wdt_hal_context_t *hal, wdt_stage_t stage, uint32_t timeout_ticks, wdt_stage_action_t behavior)
  111. {
  112. if (hal->inst == WDT_RWDT) {
  113. rwdt_ll_config_stage(hal->rwdt_dev, stage, timeout_ticks, behavior);
  114. } else {
  115. mwdt_ll_config_stage(hal->mwdt_dev, stage, timeout_ticks, behavior);
  116. }
  117. }
  118. /* -------------------------------- Runtime --------------------------------- */
  119. void wdt_hal_write_protect_disable(wdt_hal_context_t *hal)
  120. {
  121. if (hal->inst == WDT_RWDT) {
  122. rwdt_ll_write_protect_disable(hal->rwdt_dev);
  123. } else {
  124. mwdt_ll_write_protect_disable(hal->mwdt_dev);
  125. }
  126. }
  127. void wdt_hal_write_protect_enable(wdt_hal_context_t *hal)
  128. {
  129. if (hal->inst == WDT_RWDT) {
  130. rwdt_ll_write_protect_enable(hal->rwdt_dev);
  131. } else {
  132. mwdt_ll_write_protect_enable(hal->mwdt_dev);
  133. }
  134. }
  135. void wdt_hal_enable(wdt_hal_context_t *hal)
  136. {
  137. if (hal->inst == WDT_RWDT) {
  138. rwdt_ll_feed(hal->rwdt_dev);
  139. rwdt_ll_enable(hal->rwdt_dev);
  140. } else {
  141. mwdt_ll_feed(hal->mwdt_dev);
  142. mwdt_ll_enable(hal->mwdt_dev);
  143. }
  144. }
  145. void wdt_hal_disable(wdt_hal_context_t *hal)
  146. {
  147. if (hal->inst == WDT_RWDT) {
  148. rwdt_ll_disable(hal->rwdt_dev);
  149. } else {
  150. mwdt_ll_disable(hal->mwdt_dev);
  151. }
  152. }
  153. void wdt_hal_handle_intr(wdt_hal_context_t *hal)
  154. {
  155. if (hal->inst == WDT_RWDT) {
  156. rwdt_ll_feed(hal->rwdt_dev);
  157. rwdt_ll_clear_intr_status(hal->rwdt_dev);
  158. } else {
  159. mwdt_ll_feed(hal->mwdt_dev);
  160. mwdt_ll_clear_intr_status(hal->mwdt_dev);
  161. }
  162. }
  163. void wdt_hal_feed(wdt_hal_context_t *hal)
  164. {
  165. if (hal->inst == WDT_RWDT) {
  166. rwdt_ll_feed(hal->rwdt_dev);
  167. } else {
  168. mwdt_ll_feed(hal->mwdt_dev);
  169. }
  170. }
  171. void wdt_hal_set_flashboot_en(wdt_hal_context_t *hal, bool enable)
  172. {
  173. if (hal->inst == WDT_RWDT) {
  174. rwdt_ll_set_flashboot_en(hal->rwdt_dev, enable);
  175. } else {
  176. mwdt_ll_set_flashboot_en(hal->mwdt_dev, enable);
  177. }
  178. }
  179. bool wdt_hal_is_enabled(wdt_hal_context_t *hal)
  180. {
  181. if (hal->inst == WDT_RWDT) {
  182. return rwdt_ll_check_if_enabled(hal->rwdt_dev);
  183. } else {
  184. return mwdt_ll_check_if_enabled(hal->mwdt_dev);
  185. }
  186. }