drv_wdt.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright (c) 2006-2024, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-09-04 Alex First version for MCXC444
  9. */
  10. #include <rtthread.h>
  11. #include "drv_wdt.h"
  12. #include "fsl_cop.h"
  13. #include "fsl_clock.h"
  14. struct mcx_cop
  15. {
  16. rt_watchdog_t watchdog;
  17. SIM_Type *cop_base;
  18. };
  19. static struct mcx_cop cop_dev;
  20. static rt_err_t cop_init(rt_watchdog_t *wdt)
  21. {
  22. cop_config_t config;
  23. COP_GetDefaultConfig(&config);
  24. config.timeoutMode = kCOP_ShortTimeoutMode;
  25. config.clockSource = kCOP_LpoClock;
  26. config.timeoutCycles = kCOP_2Power10CyclesOr2Power18Cycles;
  27. config.enableStop = true;
  28. config.enableDebug = true;
  29. COP_Init(cop_dev.cop_base, &config);
  30. return RT_EOK;
  31. }
  32. static rt_err_t cop_control(rt_watchdog_t *wdt, int cmd, void *arg)
  33. {
  34. switch (cmd)
  35. {
  36. case RT_DEVICE_CTRL_WDT_START:
  37. {
  38. return RT_EOK;
  39. }
  40. case RT_DEVICE_CTRL_WDT_STOP:
  41. {
  42. COP_Disable(cop_dev.cop_base);
  43. return RT_EOK;
  44. }
  45. case RT_DEVICE_CTRL_WDT_KEEPALIVE:
  46. {
  47. COP_Refresh(cop_dev.cop_base);
  48. return RT_EOK;
  49. }
  50. case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
  51. return -RT_ERROR;
  52. default:
  53. return -RT_ERROR;
  54. }
  55. }
  56. static struct rt_watchdog_ops cop_ops =
  57. {
  58. cop_init,
  59. cop_control,
  60. };
  61. int rt_hw_cop_init(void)
  62. {
  63. cop_dev.cop_base = SIM;
  64. cop_dev.watchdog.ops = &cop_ops;
  65. if (rt_hw_watchdog_register(&cop_dev.watchdog, "cop", RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK)
  66. {
  67. rt_kprintf("cop register failed\n");
  68. return -RT_ERROR;
  69. }
  70. return RT_EOK;
  71. }
  72. INIT_BOARD_EXPORT(rt_hw_cop_init);