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