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