mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 17:11:45 +01:00 
			
		
		
		
	
		
			
	
	
		
			118 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			118 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2016-2017 Espressif Systems (Shanghai) PTE LTD
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Licensed under the Apache License, Version 2.0 (the "License");
							 | 
						||
| 
								 | 
							
								// you may not use this file except in compliance with the License.
							 | 
						||
| 
								 | 
							
								// You may obtain a copy of the License at
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//     http://www.apache.org/licenses/LICENSE-2.0
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Unless required by applicable law or agreed to in writing, software
							 | 
						||
| 
								 | 
							
								// distributed under the License is distributed on an "AS IS" BASIS,
							 | 
						||
| 
								 | 
							
								// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
							 | 
						||
| 
								 | 
							
								// See the License for the specific language governing permissions and
							 | 
						||
| 
								 | 
							
								// limitations under the License.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @file pm_impl.h
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This header file defines interface between PM lock functions (pm_locks.c)
							 | 
						||
| 
								 | 
							
								 * and the chip-specific power management (DFS/light sleep) implementation.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "soc/rtc.h"
							 | 
						||
| 
								 | 
							
								#include "esp_pm.h"
							 | 
						||
| 
								 | 
							
								#include "esp_timer.h"
							 | 
						||
| 
								 | 
							
								#include "sdkconfig.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * This is an enum of possible power modes supported by the implementation
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef enum {
							 | 
						||
| 
								 | 
							
								    PM_MODE_LIGHT_SLEEP,//!< Light sleep
							 | 
						||
| 
								 | 
							
								    PM_MODE_APB_MIN,    //!< Idle (no CPU frequency or APB frequency locks)
							 | 
						||
| 
								 | 
							
								    PM_MODE_APB_MAX,    //!< Maximum APB frequency mode
							 | 
						||
| 
								 | 
							
								    PM_MODE_CPU_MAX,    //!< Maximum CPU frequency mode
							 | 
						||
| 
								 | 
							
								    PM_MODE_COUNT       //!< Number of items
							 | 
						||
| 
								 | 
							
								} pm_mode_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief Get the mode corresponding to a certain lock
							 | 
						||
| 
								 | 
							
								 * @param type lock type
							 | 
						||
| 
								 | 
							
								 * @param arg argument value for this lock (passed to esp_pm_lock_create)
							 | 
						||
| 
								 | 
							
								 * @return lowest power consumption mode which meets the constraints of the lock
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								pm_mode_t esp_pm_impl_get_mode(esp_pm_lock_type_t type, int arg);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * If profiling is enabled, this data type will be used to store microsecond
							 | 
						||
| 
								 | 
							
								 * timestamps.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef int64_t pm_time_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * See \ref esp_pm_impl_switch_mode
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								typedef enum {
							 | 
						||
| 
								 | 
							
								    MODE_LOCK,
							 | 
						||
| 
								 | 
							
								    MODE_UNLOCK
							 | 
						||
| 
								 | 
							
								} pm_mode_switch_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief Switch between power modes when lock is taken or released
							 | 
						||
| 
								 | 
							
								 * @param mode pm_mode_t corresponding to the lock being taken or released,
							 | 
						||
| 
								 | 
							
								 *             as returned by \ref esp_pm_impl_get_mode
							 | 
						||
| 
								 | 
							
								 * @param lock_or_unlock
							 | 
						||
| 
								 | 
							
								 *              - MODE_LOCK: lock was taken. Implementation needs to make sure
							 | 
						||
| 
								 | 
							
								 *                that the constraints of the lock are met by switching to the
							 | 
						||
| 
								 | 
							
								 *                given 'mode' or any of the higher power ones.
							 | 
						||
| 
								 | 
							
								 *              - MODE_UNLOCK: lock was released. If all the locks for given
							 | 
						||
| 
								 | 
							
								 *                mode are released, and no locks for higher power modes are
							 | 
						||
| 
								 | 
							
								 *                taken, implementation can switch to one of lower power modes.
							 | 
						||
| 
								 | 
							
								 * @param now timestamp when the lock was taken or released. Passed as
							 | 
						||
| 
								 | 
							
								 *            a minor optimization, so that the implementation does not need to
							 | 
						||
| 
								 | 
							
								 *            call pm_get_time again.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void esp_pm_impl_switch_mode(pm_mode_t mode, pm_mode_switch_t lock_or_unlock, pm_time_t now);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief Call once at startup to initialize pm implementation
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void esp_pm_impl_init();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief Hook function for the idle task
							 | 
						||
| 
								 | 
							
								 * Must be called from the IDLE task on each CPU before entering waiti state.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void esp_pm_impl_idle_hook();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief Hook function for the interrupt dispatcher
							 | 
						||
| 
								 | 
							
								 * Must be called soon after entering the ISR
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void esp_pm_impl_isr_hook();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @brief Dump the information about time spent in each of the pm modes.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Prints three columns:
							 | 
						||
| 
								 | 
							
								 * mode name, total time in mode (in microseconds), percentage of time in mode
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param out stream to dump the information to
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								void esp_pm_impl_dump_stats(FILE* out);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef CONFIG_PM_PROFILING
							 | 
						||
| 
								 | 
							
								#define WITH_PROFILING
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef WITH_PROFILING
							 | 
						||
| 
								 | 
							
								static inline pm_time_t IRAM_ATTR pm_get_time()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    return esp_timer_get_time();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif // WITH_PROFILING
							 |