xref: /nrf52832-nimble/rt-thread/components/drivers/include/drivers/pm.h (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero /*
2*10465441SEvalZero  * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero  *
4*10465441SEvalZero  * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero  *
6*10465441SEvalZero  * Change Logs:
7*10465441SEvalZero  * Date           Author       Notes
8*10465441SEvalZero  * 2012-06-02     Bernard      the first version
9*10465441SEvalZero  * 2018-08-02     Tanek        split run and sleep modes, support custom mode
10*10465441SEvalZero  */
11*10465441SEvalZero 
12*10465441SEvalZero #ifndef __PM_H__
13*10465441SEvalZero #define __PM_H__
14*10465441SEvalZero 
15*10465441SEvalZero #include <rtthread.h>
16*10465441SEvalZero 
17*10465441SEvalZero #ifndef PM_HAS_CUSTOM_CONFIG
18*10465441SEvalZero 
19*10465441SEvalZero /* All modes used for rt_pm_request() adn rt_pm_release() */
20*10465441SEvalZero enum
21*10465441SEvalZero {
22*10465441SEvalZero     /* run modes */
23*10465441SEvalZero     PM_RUN_MODE_NORMAL = 0,
24*10465441SEvalZero 
25*10465441SEvalZero     /* sleep modes */
26*10465441SEvalZero     PM_SLEEP_MODE_SLEEP,
27*10465441SEvalZero     PM_SLEEP_MODE_TIMER,
28*10465441SEvalZero     PM_SLEEP_MODE_SHUTDOWN,
29*10465441SEvalZero };
30*10465441SEvalZero 
31*10465441SEvalZero /* The name of all modes used in the msh command "pm_dump" */
32*10465441SEvalZero #define PM_MODE_NAMES           \
33*10465441SEvalZero {                               \
34*10465441SEvalZero     "Running Mode",             \
35*10465441SEvalZero                                 \
36*10465441SEvalZero     "Sleep Mode",               \
37*10465441SEvalZero     "Timer Mode",               \
38*10465441SEvalZero     "Shutdown Mode",            \
39*10465441SEvalZero }
40*10465441SEvalZero 
41*10465441SEvalZero /* run mode count : 1 */
42*10465441SEvalZero #define PM_RUN_MODE_COUNT       1
43*10465441SEvalZero /* sleep mode count : 3 */
44*10465441SEvalZero #define PM_SLEEP_MODE_COUNT     3
45*10465441SEvalZero 
46*10465441SEvalZero /* support redefining default run mode */
47*10465441SEvalZero #ifndef PM_RUN_MODE_DEFAULT
48*10465441SEvalZero #define PM_RUN_MODE_DEFAULT     0
49*10465441SEvalZero #endif
50*10465441SEvalZero 
51*10465441SEvalZero /* support redefining default sleep mode */
52*10465441SEvalZero #ifndef PM_SLEEP_MODE_DEFAULT
53*10465441SEvalZero #define PM_SLEEP_MODE_DEFAULT   (PM_SLEEP_MODE_START)
54*10465441SEvalZero #endif
55*10465441SEvalZero 
56*10465441SEvalZero /* support redefining the minimum tick into sleep mode */
57*10465441SEvalZero #ifndef PM_MIN_ENTER_SLEEP_TICK
58*10465441SEvalZero #define PM_MIN_ENTER_SLEEP_TICK   (1)
59*10465441SEvalZero #endif
60*10465441SEvalZero 
61*10465441SEvalZero #else /* PM_HAS_CUSTOM_CONFIG */
62*10465441SEvalZero 
63*10465441SEvalZero #include <pm_cfg.h>
64*10465441SEvalZero 
65*10465441SEvalZero #ifndef PM_RUN_MODE_COUNT
66*10465441SEvalZero #error  "You must defined PM_RUN_MODE_COUNT on pm_cfg.h"
67*10465441SEvalZero #endif
68*10465441SEvalZero 
69*10465441SEvalZero #ifndef PM_SLEEP_MODE_COUNT
70*10465441SEvalZero #error  "You must defined PM_SLEEP_MODE_COUNT on pm_cfg.h"
71*10465441SEvalZero #endif
72*10465441SEvalZero 
73*10465441SEvalZero #ifndef PM_MODE_DEFAULT
74*10465441SEvalZero #error  "You must defined PM_MODE_DEFAULT on pm_cfg.h"
75*10465441SEvalZero #endif
76*10465441SEvalZero 
77*10465441SEvalZero #ifndef PM_MODE_NAMES
78*10465441SEvalZero #error  "You must defined PM_MODE_NAMES on pm_cfg.h"
79*10465441SEvalZero #endif
80*10465441SEvalZero 
81*10465441SEvalZero #ifndef PM_RUN_MODE_DEFAULT
82*10465441SEvalZero #error  "You must defined PM_RUN_MODE_DEFAULT on pm_cfg.h"
83*10465441SEvalZero #endif
84*10465441SEvalZero 
85*10465441SEvalZero /* The default sleep mode(PM_SLEEP_MODE_DEFAULT) are not required.
86*10465441SEvalZero  * If the default mode is defined, it is requested once in rt_system_pm_init()
87*10465441SEvalZero  */
88*10465441SEvalZero 
89*10465441SEvalZero #endif /* PM_HAS_CUSTOM_CONFIG */
90*10465441SEvalZero 
91*10465441SEvalZero /* run mode must start at 0 */
92*10465441SEvalZero #define PM_RUN_MODE_START       0
93*10465441SEvalZero /* the values of the run modes and sleep mode must be consecutive */
94*10465441SEvalZero #define PM_SLEEP_MODE_START     PM_RUN_MODE_COUNT
95*10465441SEvalZero /* all mode count */
96*10465441SEvalZero #define PM_MODE_COUNT           (PM_RUN_MODE_COUNT + PM_SLEEP_MODE_COUNT)
97*10465441SEvalZero /* The last mode, will be request in rt_system_pm_init() */
98*10465441SEvalZero #define PM_MODE_MAX             (PM_RUN_MODE_COUNT + PM_SLEEP_MODE_COUNT - 1)
99*10465441SEvalZero 
100*10465441SEvalZero #if PM_MODE_COUNT > 32
101*10465441SEvalZero #error "The number of modes cannot exceed 32"
102*10465441SEvalZero #endif
103*10465441SEvalZero 
104*10465441SEvalZero /**
105*10465441SEvalZero  * device control flag to request or release power
106*10465441SEvalZero  */
107*10465441SEvalZero #define RT_PM_DEVICE_CTRL_REQUEST   0x01
108*10465441SEvalZero #define RT_PM_DEVICE_CTRL_RELEASE   0x02
109*10465441SEvalZero 
110*10465441SEvalZero struct rt_pm;
111*10465441SEvalZero 
112*10465441SEvalZero /**
113*10465441SEvalZero  * low power mode operations
114*10465441SEvalZero  */
115*10465441SEvalZero struct rt_pm_ops
116*10465441SEvalZero {
117*10465441SEvalZero     void (*enter)(struct rt_pm *pm);
118*10465441SEvalZero     void (*exit)(struct rt_pm *pm);
119*10465441SEvalZero 
120*10465441SEvalZero #if PM_RUN_MODE_COUNT > 1
121*10465441SEvalZero     void (*frequency_change)(struct rt_pm *pm, rt_uint32_t frequency);
122*10465441SEvalZero #endif
123*10465441SEvalZero 
124*10465441SEvalZero     void (*timer_start)(struct rt_pm *pm, rt_uint32_t timeout);
125*10465441SEvalZero     void (*timer_stop)(struct rt_pm *pm);
126*10465441SEvalZero     rt_tick_t (*timer_get_tick)(struct rt_pm *pm);
127*10465441SEvalZero };
128*10465441SEvalZero 
129*10465441SEvalZero struct rt_device_pm_ops
130*10465441SEvalZero {
131*10465441SEvalZero #if PM_RUN_MODE_COUNT > 1
132*10465441SEvalZero     void (*frequency_change)(const struct rt_device* device);
133*10465441SEvalZero #endif
134*10465441SEvalZero 
135*10465441SEvalZero     void (*suspend)(const struct rt_device* device);
136*10465441SEvalZero     void (*resume) (const struct rt_device* device);
137*10465441SEvalZero };
138*10465441SEvalZero 
139*10465441SEvalZero struct rt_device_pm
140*10465441SEvalZero {
141*10465441SEvalZero     const struct rt_device* device;
142*10465441SEvalZero     const struct rt_device_pm_ops* ops;
143*10465441SEvalZero };
144*10465441SEvalZero 
145*10465441SEvalZero /**
146*10465441SEvalZero  * power management
147*10465441SEvalZero  */
148*10465441SEvalZero struct rt_pm
149*10465441SEvalZero {
150*10465441SEvalZero     struct rt_device parent;
151*10465441SEvalZero 
152*10465441SEvalZero     /* modes */
153*10465441SEvalZero     rt_uint8_t modes[PM_MODE_COUNT];
154*10465441SEvalZero     rt_uint8_t current_mode;    /* current pm mode */
155*10465441SEvalZero     rt_uint8_t exit_count;
156*10465441SEvalZero 
157*10465441SEvalZero     /* the list of device, which has PM feature */
158*10465441SEvalZero     rt_uint8_t device_pm_number;
159*10465441SEvalZero     struct rt_device_pm* device_pm;
160*10465441SEvalZero     struct rt_semaphore  device_lock;
161*10465441SEvalZero 
162*10465441SEvalZero     /* if the mode has timer, the corresponding bit is 1*/
163*10465441SEvalZero     rt_uint32_t timer_mask;
164*10465441SEvalZero 
165*10465441SEvalZero     const struct rt_pm_ops *ops;
166*10465441SEvalZero };
167*10465441SEvalZero 
168*10465441SEvalZero void rt_pm_enter(void);
169*10465441SEvalZero void rt_pm_exit(void);
170*10465441SEvalZero 
171*10465441SEvalZero void rt_pm_request(rt_ubase_t mode);
172*10465441SEvalZero void rt_pm_release(rt_ubase_t mode);
173*10465441SEvalZero 
174*10465441SEvalZero void rt_pm_register_device(struct rt_device* device, const struct rt_device_pm_ops* ops);
175*10465441SEvalZero void rt_pm_unregister_device(struct rt_device* device);
176*10465441SEvalZero 
177*10465441SEvalZero void rt_system_pm_init(const struct rt_pm_ops *ops,
178*10465441SEvalZero                        rt_uint8_t              timer_mask,
179*10465441SEvalZero                        void                   *user_data);
180*10465441SEvalZero 
181*10465441SEvalZero #endif /* __PM_H__ */
182