1 /** 2 * \file 3 * 4 * \brief Sleep mode access 5 * 6 * Copyright (c) 2012-2015 Atmel Corporation. All rights reserved. 7 * 8 * \asf_license_start 9 * 10 * \page License 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions are met: 14 * 15 * 1. Redistributions of source code must retain the above copyright notice, 16 * this list of conditions and the following disclaimer. 17 * 18 * 2. Redistributions in binary form must reproduce the above copyright notice, 19 * this list of conditions and the following disclaimer in the documentation 20 * and/or other materials provided with the distribution. 21 * 22 * 3. The name of Atmel may not be used to endorse or promote products derived 23 * from this software without specific prior written permission. 24 * 25 * 4. This software may only be redistributed and used in connection with an 26 * Atmel microcontroller product. 27 * 28 * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED 29 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 30 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE 31 * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR 32 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 36 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 37 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 38 * POSSIBILITY OF SUCH DAMAGE. 39 * 40 * \asf_license_stop 41 * 42 */ 43 /* 44 * Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a> 45 */ 46 47 #ifndef SLEEP_H 48 #define SLEEP_H 49 50 #ifdef __cplusplus 51 extern "C" { 52 #endif 53 54 #include <compiler.h> 55 56 /** 57 * \defgroup sleep_group Power Manager (PM) 58 * 59 * This is a stub on the SAM Power Manager Control (PMC) for the sleepmgr 60 * service. 61 * 62 * \note To minimize the code overhead, these functions do not feature 63 * interrupt-protected access since they are likely to be called inside 64 * interrupt handlers or in applications where such protection is not 65 * necessary. If such protection is needed, it must be ensured by the calling 66 * code. 67 * 68 * @{ 69 */ 70 71 #if defined(__DOXYGEN__) 72 /** 73 * \brief Sets the MCU in the specified sleep mode 74 * \param sleep_mode Sleep mode to set. 75 */ 76 #endif 77 /* SAM3 and SAM4 series */ 78 #if (SAM3S || SAM3N || SAM3XA || SAM3U || SAM4S || SAM4E || SAM4N || SAM4C || \ 79 SAM4CM || SAM4CP || SAMG || SAMV71) 80 81 #if (SAM3S || SAM3N || SAM3XA || SAM3U || SAM4S || SAM4E || SAM4N || SAM4C || \ 82 SAM4CM || SAM4CP || SAMG55 || SAMV71) 83 # define SAM_PM_SMODE_ACTIVE 0 /**< Active */ 84 # define SAM_PM_SMODE_SLEEP_WFE 1 /**< Wait for Events */ 85 # define SAM_PM_SMODE_SLEEP_WFI 2 /**< Wait for Interrupts */ 86 # define SAM_PM_SMODE_WAIT_FAST 3 /**< Wait Mode, startup fast (in 3ms) */ 87 # define SAM_PM_SMODE_WAIT 4 /**< Wait Mode */ 88 # define SAM_PM_SMODE_BACKUP 5 /**< Backup Mode */ 89 #else 90 # define SAM_PM_SMODE_ACTIVE 0 /**< Active */ 91 # define SAM_PM_SMODE_WAIT_FAST 1 /**< Wait Mode, startup fast (in 3ms) */ 92 # define SAM_PM_SMODE_WAIT 2 /**< Wait Mode */ 93 #endif 94 95 /** (SCR) Sleep deep bit */ 96 #define SCR_SLEEPDEEP (0x1 << 2) 97 98 /** 99 * Clocks restored callback function type. 100 * Registered by routine pmc_wait_wakeup_clocks_restore() 101 * Callback called when all clocks are restored. 102 */ 103 typedef void (*pmc_callback_wakeup_clocks_restored_t) (void); 104 105 /** 106 * Enter sleep mode 107 * \param sleep_mode Sleep mode to enter 108 */ 109 void pmc_sleep(int sleep_mode); 110 111 /** 112 * Check if clocks are restored after wakeup 113 * (For WAIT mode. In WAIT mode, clocks are switched to FASTRC. 114 * After wakeup clocks should be restored, before that some of the 115 * ISR should not be served, otherwise there may be timing or clock issue.) 116 */ 117 bool pmc_is_wakeup_clocks_restored(void); 118 119 /** 120 * \return true if start waiting 121 */ 122 void pmc_wait_wakeup_clocks_restore( 123 pmc_callback_wakeup_clocks_restored_t callback); 124 125 #endif 126 127 //! @} 128 129 #ifdef __cplusplus 130 } 131 #endif 132 133 #endif /* SLEEP_H */ 134