drv_pm.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. * Copyright (C) 2018 Shanghai Eastsoft Microelectronics Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2019-04-01 wangyq the first version
  9. */
  10. #include <rthw.h>
  11. #include <rtdevice.h>
  12. #include "board.h"
  13. #include "drv_pm.h"
  14. #include <ald_pmu.h>
  15. #ifdef RT_USING_PM
  16. static void _drv_pm_enter(struct rt_pm *pm)
  17. {
  18. rt_uint32_t mode;
  19. mode = pm->current_mode;
  20. switch (mode)
  21. {
  22. case PM_RUN_MODE_NORMAL:
  23. break;
  24. case PM_SLEEP_MODE_SLEEP:
  25. __WFI();
  26. break;
  27. case PM_SLEEP_MODE_TIMER:
  28. pmu_stop2_enter();
  29. break;
  30. case PM_SLEEP_MODE_SHUTDOWN:
  31. pmu_standby_enter(PMU_STANDBY_PORT_NONE);
  32. break;
  33. default:
  34. RT_ASSERT(0);
  35. break;
  36. }
  37. }
  38. static void _drv_pm_exit(struct rt_pm *pm)
  39. {
  40. rt_uint32_t mode;
  41. RT_ASSERT(pm != RT_NULL);
  42. mode = pm->current_mode;
  43. switch (mode)
  44. {
  45. case PM_RUN_MODE_NORMAL:
  46. break;
  47. case PM_SLEEP_MODE_SLEEP:
  48. break;
  49. case PM_SLEEP_MODE_TIMER:
  50. break;
  51. case PM_SLEEP_MODE_SHUTDOWN:
  52. break;
  53. default:
  54. RT_ASSERT(0);
  55. break;
  56. }
  57. }
  58. #if PM_RUN_MODE_COUNT > 1
  59. static void _drv_pm_frequency_change(struct rt_pm *pm, rt_uint32_t frequency)
  60. {
  61. return;
  62. }
  63. #endif
  64. static int drv_hw_pm_init(void)
  65. {
  66. static const struct rt_pm_ops _ops =
  67. {
  68. _drv_pm_enter,
  69. _drv_pm_exit,
  70. #if PM_RUN_MODE_COUNT > 1
  71. _drv_pm_frequency_change,
  72. #endif
  73. RT_NULL,
  74. RT_NULL,
  75. RT_NULL
  76. };
  77. rt_uint8_t timer_mask;
  78. /* initialize timer mask */
  79. timer_mask = 1UL << PM_SLEEP_MODE_TIMER;
  80. /* initialize system pm module */
  81. rt_system_pm_init(&_ops, timer_mask, RT_NULL);
  82. return 0;
  83. }
  84. INIT_BOARD_EXPORT(drv_hw_pm_init);
  85. #endif