drv_wdt.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. * Copyright (c) 2020-2021, Bluetrum Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-11-30 greedyhao first version
  9. */
  10. #include <board.h>
  11. #ifdef RT_USING_WDT
  12. // #define DRV_DEBUG
  13. #define LOG_TAG "drv.wdt"
  14. #include <drv_log.h>
  15. struct ab32_wdt_obj
  16. {
  17. rt_watchdog_t watchdog;
  18. };
  19. static struct ab32_wdt_obj ab32_wdt;
  20. static struct rt_watchdog_ops ops;
  21. static rt_err_t wdt_init(rt_watchdog_t *wdt)
  22. {
  23. return RT_EOK;
  24. }
  25. static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
  26. {
  27. rt_uint32_t tmp = 0;
  28. switch (cmd)
  29. {
  30. /* feed the watchdog */
  31. case RT_DEVICE_CTRL_WDT_KEEPALIVE:
  32. WDTCON = 0xa;
  33. break;
  34. /* set watchdog timeout */
  35. case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
  36. if (arg == RT_NULL) {
  37. LOG_E("The watchdog timeout argument cannot be NULL!");
  38. break;
  39. }
  40. tmp = WDTCON & ~(0x7 << 20);
  41. switch (*((rt_uint32_t *)arg))
  42. {
  43. case 0:
  44. LOG_I("The watchdog timeout is set to 1ms");
  45. tmp |= (0xa << 24) | (0x00 << 20);
  46. break;
  47. case 1:
  48. LOG_I("The watchdog timeout is set to 256ms");
  49. tmp |= (0xa << 24) | (0x01 << 20);
  50. break;
  51. case 2:
  52. LOG_I("The watchdog timeout is set to 512ms");
  53. tmp |= (0xa << 24) | (0x02 << 20);
  54. break;
  55. case 3:
  56. LOG_I("The watchdog timeout is set to 1024ms");
  57. tmp |= (0xa << 24) | (0x03 << 20);
  58. break;
  59. case 4:
  60. LOG_I("The watchdog timeout is set to 2048ms");
  61. tmp |= (0xa << 24) | (0x04 << 20);
  62. break;
  63. case 5:
  64. LOG_I("The watchdog timeout is set to 4096ms");
  65. tmp |= (0xa << 24) | (0x05 << 20);
  66. break;
  67. case 6:
  68. LOG_I("The watchdog timeout is set to 8192ms");
  69. tmp |= (0xa << 24) | (0x06 << 20);
  70. break;
  71. case 7:
  72. LOG_I("The watchdog timeout is set to 16384ms");
  73. tmp |= (0xa << 24) | (0x07 << 20);
  74. break;
  75. default:
  76. LOG_W("The watchdog timeout argument range from 0 to 7!");
  77. tmp = WDTCON;
  78. break;
  79. }
  80. WDTCON = tmp;
  81. LOG_D("WDTCON=%X", WDTCON);
  82. break;
  83. case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
  84. switch ((WDTCON >> 20) & 0x7)
  85. {
  86. case 0:
  87. LOG_D("The watchdog timeout is set to 1ms");
  88. break;
  89. case 1:
  90. LOG_D("The watchdog timeout is set to 256ms");
  91. break;
  92. case 2:
  93. LOG_D("The watchdog timeout is set to 512ms");
  94. break;
  95. case 3:
  96. LOG_D("The watchdog timeout is set to 1024ms");
  97. break;
  98. case 4:
  99. LOG_D("The watchdog timeout is set to 2048ms");
  100. break;
  101. case 5:
  102. LOG_D("The watchdog timeout is set to 4096ms");
  103. break;
  104. case 6:
  105. LOG_D("The watchdog timeout is set to 8192ms");
  106. break;
  107. case 7:
  108. LOG_D("The watchdog timeout is set to 16384ms");
  109. break;
  110. default:
  111. break;
  112. }
  113. break;
  114. case RT_DEVICE_CTRL_WDT_START:
  115. WDTCON = 0x110;
  116. break;
  117. default:
  118. LOG_W("This command is not supported.");
  119. return -RT_ERROR;
  120. }
  121. return RT_EOK;
  122. }
  123. int rt_wdt_init(void)
  124. {
  125. ops.init = &wdt_init;
  126. ops.control = &wdt_control;
  127. ab32_wdt.watchdog.ops = &ops;
  128. /* register watchdog device */
  129. if (rt_hw_watchdog_register(&ab32_wdt.watchdog, "wdt", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK)
  130. {
  131. LOG_E("wdt device register failed.");
  132. return -RT_ERROR;
  133. }
  134. LOG_D("wdt device register success.");
  135. return RT_EOK;
  136. }
  137. INIT_BOARD_EXPORT(rt_wdt_init);
  138. #endif /* RT_USING_WDT */