]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_M4_ATSAM4L_Atmel_Studio/src/asf/sam/drivers/bpm/sleep.h
168ac7c93e5b68155d3e157b4a09b93524c2954e
[freertos] / FreeRTOS / Demo / CORTEX_M4_ATSAM4L_Atmel_Studio / src / asf / sam / drivers / bpm / sleep.h
1 /**\r
2  * \file\r
3  *\r
4  * \brief Sleep mode access\r
5  *\r
6  * Copyright (c) 2012 Atmel Corporation. All rights reserved.\r
7  *\r
8  * \asf_license_start\r
9  *\r
10  * \page License\r
11  *\r
12  * Redistribution and use in source and binary forms, with or without\r
13  * modification, are permitted provided that the following conditions are met:\r
14  *\r
15  * 1. Redistributions of source code must retain the above copyright notice,\r
16  *    this list of conditions and the following disclaimer.\r
17  *\r
18  * 2. Redistributions in binary form must reproduce the above copyright notice,\r
19  *    this list of conditions and the following disclaimer in the documentation\r
20  *    and/or other materials provided with the distribution.\r
21  *\r
22  * 3. The name of Atmel may not be used to endorse or promote products derived\r
23  *    from this software without specific prior written permission.\r
24  *\r
25  * 4. This software may only be redistributed and used in connection with an\r
26  *    Atmel microcontroller product.\r
27  *\r
28  * THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED\r
29  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
30  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
31  * EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR\r
32  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\r
36  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r
37  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r
38  * POSSIBILITY OF SUCH DAMAGE.\r
39  *\r
40  * \asf_license_stop\r
41  *\r
42  */\r
43 \r
44 #ifndef SLEEP_H\r
45 #define SLEEP_H\r
46 \r
47 #ifdef __cplusplus\r
48 extern "C" {\r
49 #endif\r
50 \r
51 #include <compiler.h>\r
52 \r
53 /**\r
54  * \defgroup sleep_group Backup Power Manager (BPM)\r
55  *\r
56  * This is a stub on the SAM4L Backup Power Manager(BPM) for the sleepmgr service.\r
57  *\r
58  * \note To minimize the code overhead, these functions do not feature\r
59  * interrupt-protected access since they are likely to be called inside\r
60  * interrupt handlers or in applications where such protection is not\r
61  * necessary. If such protection is needed, it must be ensured by the calling\r
62  * code.\r
63  *\r
64  * @{\r
65  */\r
66 \r
67 #if defined(__DOXYGEN__)\r
68 /**\r
69  * \brief Sets the MCU in the specified sleep mode\r
70  * \param sleep_mode Sleep mode to set.\r
71  */\r
72 #endif\r
73 \r
74 #include "bpm.h"\r
75 \r
76 static inline void bpm_sleep(Bpm *bpm, uint32_t sleep_mode)\r
77 {\r
78         uint32_t pmcon;\r
79 \r
80         /* Read PMCON register */\r
81         pmcon = bpm->BPM_PMCON;\r
82         pmcon &= ~BPM_PMCON_BKUP;\r
83         pmcon &= ~BPM_PMCON_RET;\r
84         pmcon &= ~BPM_PMCON_SLEEP_Msk;\r
85 \r
86         /* Unlock PMCON register */\r
87         BPM_UNLOCK(PMCON);\r
88 \r
89         if (sleep_mode == BPM_SM_SLEEP_0) {\r
90                 pmcon |= BPM_PMCON_SLEEP(0);\r
91                 bpm->BPM_PMCON = pmcon;\r
92                 SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;\r
93         } else if (sleep_mode == BPM_SM_SLEEP_1) {\r
94                 pmcon |= BPM_PMCON_SLEEP(1);\r
95                 bpm->BPM_PMCON = pmcon;\r
96                 SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;\r
97         } else if (sleep_mode == BPM_SM_SLEEP_2) {\r
98                 pmcon |= BPM_PMCON_SLEEP(2);\r
99                 bpm->BPM_PMCON = pmcon;\r
100                 SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;\r
101         } else if (sleep_mode == BPM_SM_SLEEP_3) {\r
102                 pmcon |= BPM_PMCON_SLEEP(3);\r
103                 bpm->BPM_PMCON = pmcon;\r
104                 SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;\r
105         } else if (sleep_mode == BPM_SM_WAIT) {\r
106                 bpm->BPM_PMCON = pmcon;\r
107                 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;\r
108         } else if (sleep_mode == BPM_SM_RET) {\r
109                 pmcon |= BPM_PMCON_RET;\r
110                 bpm->BPM_PMCON = pmcon;\r
111                 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;\r
112         } else { /* if (sleep_mode == BPM_SM_BACKUP) */\r
113                 pmcon |= BPM_PMCON_BKUP;\r
114                 bpm->BPM_PMCON = pmcon;\r
115                 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;\r
116         }\r
117 \r
118         /* Wait until vreg is ok. */\r
119         while(!(BSCIF->BSCIF_PCLKSR & BSCIF_PCLKSR_VREGOK));\r
120         asm volatile ("wfi");\r
121         /* ensure sleep request propagation to flash. */\r
122         asm volatile ("nop");\r
123 \r
124         /* The interrupts wake-up from the previous wfi, but there are still\r
125          * masked since we are in the critical section thanks to the previous\r
126          * set_pri_mask(1). Thus, we need to leave the critical section.\r
127          * Please note that we should probably use something like\r
128          * cpu_leave_critical(), using set_pri_mask(0)\r
129          */\r
130         cpu_irq_enable();\r
131 }\r
132 \r
133 \r
134 //! @}\r
135 \r
136 #ifdef __cplusplus\r
137 }\r
138 #endif\r
139 \r
140 #endif /* SLEEP_H */\r
141 \r