1*1b2596b5SMatthias Ringwald /** 2*1b2596b5SMatthias Ringwald * \file 3*1b2596b5SMatthias Ringwald * 4*1b2596b5SMatthias Ringwald * \brief Power Management Controller (PMC) driver for SAM. 5*1b2596b5SMatthias Ringwald * 6*1b2596b5SMatthias Ringwald * Copyright (c) 2011-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 PMC_H_INCLUDED 48*1b2596b5SMatthias Ringwald #define PMC_H_INCLUDED 49*1b2596b5SMatthias Ringwald 50*1b2596b5SMatthias Ringwald #include "compiler.h" 51*1b2596b5SMatthias Ringwald 52*1b2596b5SMatthias Ringwald /// @cond 0 53*1b2596b5SMatthias Ringwald /**INDENT-OFF**/ 54*1b2596b5SMatthias Ringwald #ifdef __cplusplus 55*1b2596b5SMatthias Ringwald extern "C" { 56*1b2596b5SMatthias Ringwald #endif 57*1b2596b5SMatthias Ringwald /**INDENT-ON**/ 58*1b2596b5SMatthias Ringwald /// @endcond 59*1b2596b5SMatthias Ringwald 60*1b2596b5SMatthias Ringwald /** Bit mask for peripheral clocks (PCER0) */ 61*1b2596b5SMatthias Ringwald #define PMC_MASK_STATUS0 (0xFFFFFFFC) 62*1b2596b5SMatthias Ringwald 63*1b2596b5SMatthias Ringwald /** Bit mask for peripheral clocks (PCER1) */ 64*1b2596b5SMatthias Ringwald #define PMC_MASK_STATUS1 (0xFFFFFFFF) 65*1b2596b5SMatthias Ringwald 66*1b2596b5SMatthias Ringwald /** Loop counter timeout value */ 67*1b2596b5SMatthias Ringwald #define PMC_TIMEOUT (2048) 68*1b2596b5SMatthias Ringwald 69*1b2596b5SMatthias Ringwald /** Key to unlock CKGR_MOR register */ 70*1b2596b5SMatthias Ringwald #ifndef CKGR_MOR_KEY_PASSWD 71*1b2596b5SMatthias Ringwald #define CKGR_MOR_KEY_PASSWD CKGR_MOR_KEY(0x37U) 72*1b2596b5SMatthias Ringwald #endif 73*1b2596b5SMatthias Ringwald 74*1b2596b5SMatthias Ringwald /** Key used to write SUPC registers */ 75*1b2596b5SMatthias Ringwald #ifndef SUPC_CR_KEY_PASSWD 76*1b2596b5SMatthias Ringwald #define SUPC_CR_KEY_PASSWD SUPC_CR_KEY(0xA5U) 77*1b2596b5SMatthias Ringwald #endif 78*1b2596b5SMatthias Ringwald 79*1b2596b5SMatthias Ringwald #ifndef SUPC_MR_KEY_PASSWD 80*1b2596b5SMatthias Ringwald #define SUPC_MR_KEY_PASSWD SUPC_MR_KEY(0xA5U) 81*1b2596b5SMatthias Ringwald #endif 82*1b2596b5SMatthias Ringwald 83*1b2596b5SMatthias Ringwald /** Mask to access fast startup input */ 84*1b2596b5SMatthias Ringwald #define PMC_FAST_STARTUP_Msk (0x7FFFFu) 85*1b2596b5SMatthias Ringwald 86*1b2596b5SMatthias Ringwald /** PMC_WPMR Write Protect KEY, unlock it */ 87*1b2596b5SMatthias Ringwald #ifndef PMC_WPMR_WPKEY_PASSWD 88*1b2596b5SMatthias Ringwald #define PMC_WPMR_WPKEY_PASSWD PMC_WPMR_WPKEY((uint32_t) 0x504D43) 89*1b2596b5SMatthias Ringwald #endif 90*1b2596b5SMatthias Ringwald 91*1b2596b5SMatthias Ringwald /** Using external oscillator */ 92*1b2596b5SMatthias Ringwald #define PMC_OSC_XTAL 0 93*1b2596b5SMatthias Ringwald 94*1b2596b5SMatthias Ringwald /** Oscillator in bypass mode */ 95*1b2596b5SMatthias Ringwald #define PMC_OSC_BYPASS 1 96*1b2596b5SMatthias Ringwald 97*1b2596b5SMatthias Ringwald #define PMC_PCK_0 0 /* PCK0 ID */ 98*1b2596b5SMatthias Ringwald #define PMC_PCK_1 1 /* PCK1 ID */ 99*1b2596b5SMatthias Ringwald #define PMC_PCK_2 2 /* PCK2 ID */ 100*1b2596b5SMatthias Ringwald #if SAMG55 101*1b2596b5SMatthias Ringwald #define PMC_PCK_3 3 /* PCK3 ID */ 102*1b2596b5SMatthias Ringwald #define PMC_PCK_4 4 /* PCK4 ID */ 103*1b2596b5SMatthias Ringwald #define PMC_PCK_5 5 /* PCK5 ID */ 104*1b2596b5SMatthias Ringwald #define PMC_PCK_6 6 /* PCK6 ID */ 105*1b2596b5SMatthias Ringwald #define PMC_PCK_7 7 /* PCK7 ID */ 106*1b2596b5SMatthias Ringwald #endif 107*1b2596b5SMatthias Ringwald 108*1b2596b5SMatthias Ringwald #if (SAM4S || SAM4E || SAM4N || SAM4C || SAM4CM || SAMG || SAM4CP || SAMV71 || SAMV70 || SAME70 || SAMS70) 109*1b2596b5SMatthias Ringwald /** Flash state in Wait Mode */ 110*1b2596b5SMatthias Ringwald #define PMC_WAIT_MODE_FLASH_STANDBY PMC_FSMR_FLPM_FLASH_STANDBY 111*1b2596b5SMatthias Ringwald #define PMC_WAIT_MODE_FLASH_DEEP_POWERDOWN PMC_FSMR_FLPM_FLASH_DEEP_POWERDOWN 112*1b2596b5SMatthias Ringwald #define PMC_WAIT_MODE_FLASH_IDLE PMC_FSMR_FLPM_FLASH_IDLE 113*1b2596b5SMatthias Ringwald #endif 114*1b2596b5SMatthias Ringwald 115*1b2596b5SMatthias Ringwald /** Convert startup time from us to MOSCXTST */ 116*1b2596b5SMatthias Ringwald #define pmc_us_to_moscxtst(startup_us, slowck_freq) \ 117*1b2596b5SMatthias Ringwald ((startup_us * slowck_freq / 8 / 1000000) < 0x100 ? \ 118*1b2596b5SMatthias Ringwald (startup_us * slowck_freq / 8 / 1000000) : 0xFF) 119*1b2596b5SMatthias Ringwald 120*1b2596b5SMatthias Ringwald /** 121*1b2596b5SMatthias Ringwald * \name Master clock (MCK) Source and Prescaler configuration 122*1b2596b5SMatthias Ringwald * 123*1b2596b5SMatthias Ringwald * \note The following functions may be used to select the clock source and 124*1b2596b5SMatthias Ringwald * prescaler for the master clock. 125*1b2596b5SMatthias Ringwald */ 126*1b2596b5SMatthias Ringwald //@{ 127*1b2596b5SMatthias Ringwald 128*1b2596b5SMatthias Ringwald void pmc_mck_set_prescaler(uint32_t ul_pres); 129*1b2596b5SMatthias Ringwald #if SAMV71 || SAMV70 || SAME70 || SAMS70 130*1b2596b5SMatthias Ringwald void pmc_mck_set_division(uint32_t ul_div); 131*1b2596b5SMatthias Ringwald #endif 132*1b2596b5SMatthias Ringwald void pmc_mck_set_source(uint32_t ul_source); 133*1b2596b5SMatthias Ringwald uint32_t pmc_switch_mck_to_sclk(uint32_t ul_pres); 134*1b2596b5SMatthias Ringwald uint32_t pmc_switch_mck_to_mainck(uint32_t ul_pres); 135*1b2596b5SMatthias Ringwald uint32_t pmc_switch_mck_to_pllack(uint32_t ul_pres); 136*1b2596b5SMatthias Ringwald #if (SAM3S || SAM4S || SAM4C || SAM4CM || SAM4CP || SAMG55) 137*1b2596b5SMatthias Ringwald uint32_t pmc_switch_mck_to_pllbck(uint32_t ul_pres); 138*1b2596b5SMatthias Ringwald #endif 139*1b2596b5SMatthias Ringwald #if (SAM3XA || SAM3U || SAMV71 || SAMV70 || SAME70 || SAMS70) 140*1b2596b5SMatthias Ringwald uint32_t pmc_switch_mck_to_upllck(uint32_t ul_pres); 141*1b2596b5SMatthias Ringwald #endif 142*1b2596b5SMatthias Ringwald #if (SAM4S || SAM4E || SAM4N || SAM4C || SAM4CM || SAMG || SAM4CP || SAMV71 || SAMV70 || SAME70 || SAMS70) 143*1b2596b5SMatthias Ringwald void pmc_set_flash_in_wait_mode(uint32_t ul_flash_state); 144*1b2596b5SMatthias Ringwald #endif 145*1b2596b5SMatthias Ringwald 146*1b2596b5SMatthias Ringwald 147*1b2596b5SMatthias Ringwald //@} 148*1b2596b5SMatthias Ringwald 149*1b2596b5SMatthias Ringwald /** 150*1b2596b5SMatthias Ringwald * \name Slow clock (SLCK) oscillator and configuration 151*1b2596b5SMatthias Ringwald * 152*1b2596b5SMatthias Ringwald */ 153*1b2596b5SMatthias Ringwald //@{ 154*1b2596b5SMatthias Ringwald 155*1b2596b5SMatthias Ringwald void pmc_switch_sclk_to_32kxtal(uint32_t ul_bypass); 156*1b2596b5SMatthias Ringwald uint32_t pmc_osc_is_ready_32kxtal(void); 157*1b2596b5SMatthias Ringwald 158*1b2596b5SMatthias Ringwald //@} 159*1b2596b5SMatthias Ringwald 160*1b2596b5SMatthias Ringwald /** 161*1b2596b5SMatthias Ringwald * \name Main Clock (MAINCK) oscillator and configuration 162*1b2596b5SMatthias Ringwald * 163*1b2596b5SMatthias Ringwald */ 164*1b2596b5SMatthias Ringwald //@{ 165*1b2596b5SMatthias Ringwald 166*1b2596b5SMatthias Ringwald void pmc_switch_mainck_to_fastrc(uint32_t ul_moscrcf); 167*1b2596b5SMatthias Ringwald void pmc_osc_enable_fastrc(uint32_t ul_rc); 168*1b2596b5SMatthias Ringwald void pmc_osc_disable_fastrc(void); 169*1b2596b5SMatthias Ringwald uint32_t pmc_osc_is_ready_fastrc(void); 170*1b2596b5SMatthias Ringwald void pmc_osc_enable_main_xtal(uint32_t ul_xtal_startup_time); 171*1b2596b5SMatthias Ringwald void pmc_osc_bypass_main_xtal(void); 172*1b2596b5SMatthias Ringwald void pmc_osc_disable_main_xtal(void); 173*1b2596b5SMatthias Ringwald uint32_t pmc_osc_is_bypassed_main_xtal(void); 174*1b2596b5SMatthias Ringwald uint32_t pmc_osc_is_ready_main_xtal(void); 175*1b2596b5SMatthias Ringwald void pmc_switch_mainck_to_xtal(uint32_t ul_bypass, 176*1b2596b5SMatthias Ringwald uint32_t ul_xtal_startup_time); 177*1b2596b5SMatthias Ringwald void pmc_osc_disable_xtal(uint32_t ul_bypass); 178*1b2596b5SMatthias Ringwald uint32_t pmc_osc_is_ready_mainck(void); 179*1b2596b5SMatthias Ringwald void pmc_mainck_osc_select(uint32_t ul_xtal_rc); 180*1b2596b5SMatthias Ringwald 181*1b2596b5SMatthias Ringwald //@} 182*1b2596b5SMatthias Ringwald 183*1b2596b5SMatthias Ringwald /** 184*1b2596b5SMatthias Ringwald * \name PLL oscillator and configuration 185*1b2596b5SMatthias Ringwald * 186*1b2596b5SMatthias Ringwald */ 187*1b2596b5SMatthias Ringwald //@{ 188*1b2596b5SMatthias Ringwald 189*1b2596b5SMatthias Ringwald void pmc_enable_pllack(uint32_t mula, uint32_t pllacount, uint32_t diva); 190*1b2596b5SMatthias Ringwald void pmc_disable_pllack(void); 191*1b2596b5SMatthias Ringwald uint32_t pmc_is_locked_pllack(void); 192*1b2596b5SMatthias Ringwald 193*1b2596b5SMatthias Ringwald #if (SAM3S || SAM4S || SAM4C || SAM4CM || SAM4CP || SAMG55) 194*1b2596b5SMatthias Ringwald void pmc_enable_pllbck(uint32_t mulb, uint32_t pllbcount, uint32_t divb); 195*1b2596b5SMatthias Ringwald void pmc_disable_pllbck(void); 196*1b2596b5SMatthias Ringwald uint32_t pmc_is_locked_pllbck(void); 197*1b2596b5SMatthias Ringwald #endif 198*1b2596b5SMatthias Ringwald 199*1b2596b5SMatthias Ringwald #if (SAM3XA || SAM3U || SAMV71 || SAMV70 || SAME70 || SAMS70) 200*1b2596b5SMatthias Ringwald void pmc_enable_upll_clock(void); 201*1b2596b5SMatthias Ringwald void pmc_disable_upll_clock(void); 202*1b2596b5SMatthias Ringwald uint32_t pmc_is_locked_upll(void); 203*1b2596b5SMatthias Ringwald #endif 204*1b2596b5SMatthias Ringwald 205*1b2596b5SMatthias Ringwald //@} 206*1b2596b5SMatthias Ringwald 207*1b2596b5SMatthias Ringwald /** 208*1b2596b5SMatthias Ringwald * \name Peripherals clock configuration 209*1b2596b5SMatthias Ringwald * 210*1b2596b5SMatthias Ringwald */ 211*1b2596b5SMatthias Ringwald //@{ 212*1b2596b5SMatthias Ringwald 213*1b2596b5SMatthias Ringwald uint32_t pmc_enable_periph_clk(uint32_t ul_id); 214*1b2596b5SMatthias Ringwald uint32_t pmc_disable_periph_clk(uint32_t ul_id); 215*1b2596b5SMatthias Ringwald void pmc_enable_all_periph_clk(void); 216*1b2596b5SMatthias Ringwald void pmc_disable_all_periph_clk(void); 217*1b2596b5SMatthias Ringwald uint32_t pmc_is_periph_clk_enabled(uint32_t ul_id); 218*1b2596b5SMatthias Ringwald 219*1b2596b5SMatthias Ringwald //@} 220*1b2596b5SMatthias Ringwald 221*1b2596b5SMatthias Ringwald /** 222*1b2596b5SMatthias Ringwald * \name Programmable clock Source and Prescaler configuration 223*1b2596b5SMatthias Ringwald * 224*1b2596b5SMatthias Ringwald * The following functions may be used to select the clock source and 225*1b2596b5SMatthias Ringwald * prescaler for the specified programmable clock. 226*1b2596b5SMatthias Ringwald */ 227*1b2596b5SMatthias Ringwald //@{ 228*1b2596b5SMatthias Ringwald 229*1b2596b5SMatthias Ringwald void pmc_pck_set_prescaler(uint32_t ul_id, uint32_t ul_pres); 230*1b2596b5SMatthias Ringwald void pmc_pck_set_source(uint32_t ul_id, uint32_t ul_source); 231*1b2596b5SMatthias Ringwald uint32_t pmc_switch_pck_to_sclk(uint32_t ul_id, uint32_t ul_pres); 232*1b2596b5SMatthias Ringwald uint32_t pmc_switch_pck_to_mainck(uint32_t ul_id, uint32_t ul_pres); 233*1b2596b5SMatthias Ringwald uint32_t pmc_switch_pck_to_pllack(uint32_t ul_id, uint32_t ul_pres); 234*1b2596b5SMatthias Ringwald #if (SAM4C || SAM4CM || SAM4CP) 235*1b2596b5SMatthias Ringwald void pmc_enable_cpck(void); 236*1b2596b5SMatthias Ringwald void pmc_disable_cpck(void); 237*1b2596b5SMatthias Ringwald bool pmc_is_cpck_enabled(void); 238*1b2596b5SMatthias Ringwald void pmc_enable_cpbmck(void); 239*1b2596b5SMatthias Ringwald void pmc_disable_cpbmck(void); 240*1b2596b5SMatthias Ringwald bool pmc_is_cpbmck_enabled(void); 241*1b2596b5SMatthias Ringwald void pmc_cpck_set_prescaler(uint32_t ul_pres); 242*1b2596b5SMatthias Ringwald void pmc_cpck_set_source(uint32_t ul_source); 243*1b2596b5SMatthias Ringwald #endif 244*1b2596b5SMatthias Ringwald #if (SAM3S || SAM4S || SAM4C || SAM4CM || SAM4CP || SAMG55) 245*1b2596b5SMatthias Ringwald uint32_t pmc_switch_pck_to_pllbck(uint32_t ul_id, uint32_t ul_pres); 246*1b2596b5SMatthias Ringwald #endif 247*1b2596b5SMatthias Ringwald #if (SAM3XA || SAM3U || SAMV71 || SAMV70 || SAME70 || SAMS70) 248*1b2596b5SMatthias Ringwald uint32_t pmc_switch_pck_to_upllck(uint32_t ul_id, uint32_t ul_pres); 249*1b2596b5SMatthias Ringwald #endif 250*1b2596b5SMatthias Ringwald uint32_t pmc_switch_pck_to_mck(uint32_t ul_id, uint32_t ul_pres); 251*1b2596b5SMatthias Ringwald void pmc_enable_pck(uint32_t ul_id); 252*1b2596b5SMatthias Ringwald void pmc_disable_pck(uint32_t ul_id); 253*1b2596b5SMatthias Ringwald void pmc_enable_all_pck(void); 254*1b2596b5SMatthias Ringwald void pmc_disable_all_pck(void); 255*1b2596b5SMatthias Ringwald uint32_t pmc_is_pck_enabled(uint32_t ul_id); 256*1b2596b5SMatthias Ringwald 257*1b2596b5SMatthias Ringwald //@} 258*1b2596b5SMatthias Ringwald 259*1b2596b5SMatthias Ringwald /** 260*1b2596b5SMatthias Ringwald * \name USB clock configuration 261*1b2596b5SMatthias Ringwald * 262*1b2596b5SMatthias Ringwald */ 263*1b2596b5SMatthias Ringwald //@{ 264*1b2596b5SMatthias Ringwald 265*1b2596b5SMatthias Ringwald #if (SAM3S || SAM3XA || SAM4S || SAM4E || SAMG55 || SAMV71 || SAMV70 || SAME70 || SAMS70) 266*1b2596b5SMatthias Ringwald void pmc_switch_udpck_to_pllack(uint32_t ul_usbdiv); 267*1b2596b5SMatthias Ringwald #endif 268*1b2596b5SMatthias Ringwald #if (SAM3S || SAM4S || SAMG55) 269*1b2596b5SMatthias Ringwald void pmc_switch_udpck_to_pllbck(uint32_t ul_usbdiv); 270*1b2596b5SMatthias Ringwald #endif 271*1b2596b5SMatthias Ringwald #if (SAM3XA || SAMV71 || SAMV70 || SAME70 || SAMS70) 272*1b2596b5SMatthias Ringwald void pmc_switch_udpck_to_upllck(uint32_t ul_usbdiv); 273*1b2596b5SMatthias Ringwald #endif 274*1b2596b5SMatthias Ringwald #if (SAM3S || SAM3XA || SAM4S || SAM4E || SAMG55 || SAMV71 || SAMV70 || SAME70 || SAMS70) 275*1b2596b5SMatthias Ringwald void pmc_enable_udpck(void); 276*1b2596b5SMatthias Ringwald void pmc_disable_udpck(void); 277*1b2596b5SMatthias Ringwald #endif 278*1b2596b5SMatthias Ringwald #if SAMG55 279*1b2596b5SMatthias Ringwald void pmc_switch_uhpck_to_pllack(uint32_t ul_usbdiv); 280*1b2596b5SMatthias Ringwald void pmc_switch_uhpck_to_pllbck(uint32_t ul_usbdiv); 281*1b2596b5SMatthias Ringwald void pmc_enable_uhpck(void); 282*1b2596b5SMatthias Ringwald #endif 283*1b2596b5SMatthias Ringwald 284*1b2596b5SMatthias Ringwald //@} 285*1b2596b5SMatthias Ringwald 286*1b2596b5SMatthias Ringwald /** 287*1b2596b5SMatthias Ringwald * \name Interrupt and status management 288*1b2596b5SMatthias Ringwald * 289*1b2596b5SMatthias Ringwald */ 290*1b2596b5SMatthias Ringwald //@{ 291*1b2596b5SMatthias Ringwald 292*1b2596b5SMatthias Ringwald void pmc_enable_interrupt(uint32_t ul_sources); 293*1b2596b5SMatthias Ringwald void pmc_disable_interrupt(uint32_t ul_sources); 294*1b2596b5SMatthias Ringwald uint32_t pmc_get_interrupt_mask(void); 295*1b2596b5SMatthias Ringwald uint32_t pmc_get_status(void); 296*1b2596b5SMatthias Ringwald 297*1b2596b5SMatthias Ringwald //@} 298*1b2596b5SMatthias Ringwald 299*1b2596b5SMatthias Ringwald /** 300*1b2596b5SMatthias Ringwald * \name Power management 301*1b2596b5SMatthias Ringwald * 302*1b2596b5SMatthias Ringwald * The following functions are used to configure sleep mode and additional 303*1b2596b5SMatthias Ringwald * wake up inputs. 304*1b2596b5SMatthias Ringwald */ 305*1b2596b5SMatthias Ringwald //@{ 306*1b2596b5SMatthias Ringwald 307*1b2596b5SMatthias Ringwald void pmc_set_fast_startup_input(uint32_t ul_inputs); 308*1b2596b5SMatthias Ringwald void pmc_clr_fast_startup_input(uint32_t ul_inputs); 309*1b2596b5SMatthias Ringwald #if (SAM4C || SAM4CM || SAM4CP) 310*1b2596b5SMatthias Ringwald void pmc_cp_set_fast_startup_input(uint32_t ul_inputs); 311*1b2596b5SMatthias Ringwald void pmc_cp_clr_fast_startup_input(uint32_t ul_inputs); 312*1b2596b5SMatthias Ringwald #endif 313*1b2596b5SMatthias Ringwald #if (!(SAMG51 || SAMG53 || SAMG54)) 314*1b2596b5SMatthias Ringwald void pmc_enable_sleepmode(uint8_t uc_type); 315*1b2596b5SMatthias Ringwald #endif 316*1b2596b5SMatthias Ringwald void pmc_enable_waitmode(void); 317*1b2596b5SMatthias Ringwald #if (!(SAMG51 || SAMG53 || SAMG54)) 318*1b2596b5SMatthias Ringwald void pmc_enable_backupmode(void); 319*1b2596b5SMatthias Ringwald #endif 320*1b2596b5SMatthias Ringwald //@} 321*1b2596b5SMatthias Ringwald 322*1b2596b5SMatthias Ringwald /** 323*1b2596b5SMatthias Ringwald * \name Failure detector 324*1b2596b5SMatthias Ringwald * 325*1b2596b5SMatthias Ringwald */ 326*1b2596b5SMatthias Ringwald //@{ 327*1b2596b5SMatthias Ringwald 328*1b2596b5SMatthias Ringwald void pmc_enable_clock_failure_detector(void); 329*1b2596b5SMatthias Ringwald void pmc_disable_clock_failure_detector(void); 330*1b2596b5SMatthias Ringwald 331*1b2596b5SMatthias Ringwald //@} 332*1b2596b5SMatthias Ringwald 333*1b2596b5SMatthias Ringwald #if (SAM4N || SAM4C || SAM4CM || SAM4CP || SAMV71 || SAMV70 || SAME70 || SAMS70) 334*1b2596b5SMatthias Ringwald /** 335*1b2596b5SMatthias Ringwald * \name Slow Crystal Oscillator Frequency Monitoring 336*1b2596b5SMatthias Ringwald * 337*1b2596b5SMatthias Ringwald */ 338*1b2596b5SMatthias Ringwald //@{ 339*1b2596b5SMatthias Ringwald 340*1b2596b5SMatthias Ringwald void pmc_enable_sclk_osc_freq_monitor(void); 341*1b2596b5SMatthias Ringwald void pmc_disable_sclk_osc_freq_monitor(void); 342*1b2596b5SMatthias Ringwald 343*1b2596b5SMatthias Ringwald //@} 344*1b2596b5SMatthias Ringwald #endif 345*1b2596b5SMatthias Ringwald 346*1b2596b5SMatthias Ringwald /** 347*1b2596b5SMatthias Ringwald * \name Write protection 348*1b2596b5SMatthias Ringwald * 349*1b2596b5SMatthias Ringwald */ 350*1b2596b5SMatthias Ringwald //@{ 351*1b2596b5SMatthias Ringwald 352*1b2596b5SMatthias Ringwald void pmc_set_writeprotect(uint32_t ul_enable); 353*1b2596b5SMatthias Ringwald uint32_t pmc_get_writeprotect_status(void); 354*1b2596b5SMatthias Ringwald 355*1b2596b5SMatthias Ringwald //@} 356*1b2596b5SMatthias Ringwald 357*1b2596b5SMatthias Ringwald #if (SAMG53 || SAMG54 || SAMG55 || SAMV71 || SAMV70 || SAME70 || SAMS70) 358*1b2596b5SMatthias Ringwald /** 359*1b2596b5SMatthias Ringwald * \name Sleepwalking configuration 360*1b2596b5SMatthias Ringwald * 361*1b2596b5SMatthias Ringwald */ 362*1b2596b5SMatthias Ringwald //@{ 363*1b2596b5SMatthias Ringwald 364*1b2596b5SMatthias Ringwald uint32_t pmc_enable_sleepwalking(uint32_t ul_id); 365*1b2596b5SMatthias Ringwald uint32_t pmc_disable_sleepwalking(uint32_t ul_id); 366*1b2596b5SMatthias Ringwald uint32_t pmc_get_sleepwalking_status0(void); 367*1b2596b5SMatthias Ringwald uint32_t pmc_get_active_status0(void); 368*1b2596b5SMatthias Ringwald #if (SAMV71 || SAMV70 || SAME70 || SAMS70) 369*1b2596b5SMatthias Ringwald uint32_t pmc_get_sleepwalking_status1(void); 370*1b2596b5SMatthias Ringwald uint32_t pmc_get_active_status1(void); 371*1b2596b5SMatthias Ringwald #endif 372*1b2596b5SMatthias Ringwald //@} 373*1b2596b5SMatthias Ringwald #endif 374*1b2596b5SMatthias Ringwald 375*1b2596b5SMatthias Ringwald /// @cond 0 376*1b2596b5SMatthias Ringwald /**INDENT-OFF**/ 377*1b2596b5SMatthias Ringwald #ifdef __cplusplus 378*1b2596b5SMatthias Ringwald } 379*1b2596b5SMatthias Ringwald #endif 380*1b2596b5SMatthias Ringwald /**INDENT-ON**/ 381*1b2596b5SMatthias Ringwald /// @endcond 382*1b2596b5SMatthias Ringwald 383*1b2596b5SMatthias Ringwald //! @} 384*1b2596b5SMatthias Ringwald 385*1b2596b5SMatthias Ringwald /** 386*1b2596b5SMatthias Ringwald * \page sam_pmc_quickstart Quick start guide for the SAM PMC module 387*1b2596b5SMatthias Ringwald * 388*1b2596b5SMatthias Ringwald * This is the quick start guide for the \ref sam_drivers_pmc_group "PMC module", 389*1b2596b5SMatthias Ringwald * with step-by-step instructions on how to configure and use the driver in a 390*1b2596b5SMatthias Ringwald * selection of use cases. 391*1b2596b5SMatthias Ringwald * 392*1b2596b5SMatthias Ringwald * The use cases contain several code fragments. The code fragments in the 393*1b2596b5SMatthias Ringwald * steps for setup can be copied into a custom initialization function, while 394*1b2596b5SMatthias Ringwald * the steps for usage can be copied into, e.g., the main application function. 395*1b2596b5SMatthias Ringwald * 396*1b2596b5SMatthias Ringwald * \section pmc_use_cases PMC use cases 397*1b2596b5SMatthias Ringwald * - \ref pmc_basic_use_case Basic use case - Switch Main Clock sources 398*1b2596b5SMatthias Ringwald * - \ref pmc_use_case_2 Advanced use case - Configure Programmable Clocks 399*1b2596b5SMatthias Ringwald * 400*1b2596b5SMatthias Ringwald * \section pmc_basic_use_case Basic use case - Switch Main Clock sources 401*1b2596b5SMatthias Ringwald * In this use case, the PMC module is configured for a variety of system clock 402*1b2596b5SMatthias Ringwald * sources and speeds. A LED is used to visually indicate the current clock 403*1b2596b5SMatthias Ringwald * speed as the source is switched. 404*1b2596b5SMatthias Ringwald * 405*1b2596b5SMatthias Ringwald * \section pmc_basic_use_case_setup Setup 406*1b2596b5SMatthias Ringwald * 407*1b2596b5SMatthias Ringwald * \subsection pmc_basic_use_case_setup_prereq Prerequisites 408*1b2596b5SMatthias Ringwald * -# \ref gpio_group "General Purpose I/O Management (gpio)" 409*1b2596b5SMatthias Ringwald * 410*1b2596b5SMatthias Ringwald * \subsection pmc_basic_use_case_setup_code Code 411*1b2596b5SMatthias Ringwald * The following function needs to be added to the user application, to flash a 412*1b2596b5SMatthias Ringwald * board LED a variable number of times at a rate given in CPU ticks. 413*1b2596b5SMatthias Ringwald * 414*1b2596b5SMatthias Ringwald * \code 415*1b2596b5SMatthias Ringwald #define FLASH_TICK_COUNT 0x00012345 416*1b2596b5SMatthias Ringwald 417*1b2596b5SMatthias Ringwald void flash_led(uint32_t tick_count, uint8_t flash_count) 418*1b2596b5SMatthias Ringwald { 419*1b2596b5SMatthias Ringwald SysTick->CTRL = SysTick_CTRL_ENABLE_Msk; 420*1b2596b5SMatthias Ringwald SysTick->LOAD = tick_count; 421*1b2596b5SMatthias Ringwald 422*1b2596b5SMatthias Ringwald while (flash_count--) 423*1b2596b5SMatthias Ringwald { 424*1b2596b5SMatthias Ringwald gpio_toggle_pin(LED0_GPIO); 425*1b2596b5SMatthias Ringwald while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); 426*1b2596b5SMatthias Ringwald gpio_toggle_pin(LED0_GPIO); 427*1b2596b5SMatthias Ringwald while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); 428*1b2596b5SMatthias Ringwald } 429*1b2596b5SMatthias Ringwald } 430*1b2596b5SMatthias Ringwald \endcode 431*1b2596b5SMatthias Ringwald * 432*1b2596b5SMatthias Ringwald * \section pmc_basic_use_case_usage Use case 433*1b2596b5SMatthias Ringwald * 434*1b2596b5SMatthias Ringwald * \subsection pmc_basic_use_case_usage_code Example code 435*1b2596b5SMatthias Ringwald * Add to application C-file: 436*1b2596b5SMatthias Ringwald * \code 437*1b2596b5SMatthias Ringwald for (;;) 438*1b2596b5SMatthias Ringwald { 439*1b2596b5SMatthias Ringwald pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz); 440*1b2596b5SMatthias Ringwald flash_led(FLASH_TICK_COUNT, 5); 441*1b2596b5SMatthias Ringwald pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_8_MHz); 442*1b2596b5SMatthias Ringwald flash_led(FLASH_TICK_COUNT, 5); 443*1b2596b5SMatthias Ringwald pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_4_MHz); 444*1b2596b5SMatthias Ringwald flash_led(FLASH_TICK_COUNT, 5); 445*1b2596b5SMatthias Ringwald pmc_switch_mainck_to_xtal(0); 446*1b2596b5SMatthias Ringwald flash_led(FLASH_TICK_COUNT, 5); 447*1b2596b5SMatthias Ringwald } 448*1b2596b5SMatthias Ringwald \endcode 449*1b2596b5SMatthias Ringwald * 450*1b2596b5SMatthias Ringwald * \subsection pmc_basic_use_case_usage_flow Workflow 451*1b2596b5SMatthias Ringwald * -# Wrap the code in an infinite loop: 452*1b2596b5SMatthias Ringwald * \code 453*1b2596b5SMatthias Ringwald for (;;) 454*1b2596b5SMatthias Ringwald \endcode 455*1b2596b5SMatthias Ringwald * -# Switch the Master CPU frequency to the internal 12MHz RC oscillator, flash 456*1b2596b5SMatthias Ringwald * a LED on the board several times: 457*1b2596b5SMatthias Ringwald * \code 458*1b2596b5SMatthias Ringwald pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_12_MHz); 459*1b2596b5SMatthias Ringwald flash_led(FLASH_TICK_COUNT, 5); 460*1b2596b5SMatthias Ringwald \endcode 461*1b2596b5SMatthias Ringwald * -# Switch the Master CPU frequency to the internal 8MHz RC oscillator, flash 462*1b2596b5SMatthias Ringwald * a LED on the board several times: 463*1b2596b5SMatthias Ringwald * \code 464*1b2596b5SMatthias Ringwald pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_8_MHz); 465*1b2596b5SMatthias Ringwald flash_led(FLASH_TICK_COUNT, 5); 466*1b2596b5SMatthias Ringwald \endcode 467*1b2596b5SMatthias Ringwald * -# Switch the Master CPU frequency to the internal 4MHz RC oscillator, flash 468*1b2596b5SMatthias Ringwald * a LED on the board several times: 469*1b2596b5SMatthias Ringwald * \code 470*1b2596b5SMatthias Ringwald pmc_switch_mainck_to_fastrc(CKGR_MOR_MOSCRCF_4_MHz); 471*1b2596b5SMatthias Ringwald flash_led(FLASH_TICK_COUNT, 5); 472*1b2596b5SMatthias Ringwald \endcode 473*1b2596b5SMatthias Ringwald * -# Switch the Master CPU frequency to the external crystal oscillator, flash 474*1b2596b5SMatthias Ringwald * a LED on the board several times: 475*1b2596b5SMatthias Ringwald * \code 476*1b2596b5SMatthias Ringwald pmc_switch_mainck_to_xtal(0, BOARD_OSC_STARTUP_US); 477*1b2596b5SMatthias Ringwald flash_led(FLASH_TICK_COUNT, 5); 478*1b2596b5SMatthias Ringwald \endcode 479*1b2596b5SMatthias Ringwald * 480*1b2596b5SMatthias Ringwald * \section pmc_use_case_2 Use case #2 - Configure Programmable Clocks 481*1b2596b5SMatthias Ringwald * In this use case, the PMC module is configured to start the Slow Clock from 482*1b2596b5SMatthias Ringwald * an attached 32KHz crystal, and start one of the Programmable Clock modules 483*1b2596b5SMatthias Ringwald * sourced from the Slow Clock divided down with a prescale factor of 64. 484*1b2596b5SMatthias Ringwald * 485*1b2596b5SMatthias Ringwald * \section pmc_use_case_2_setup Setup 486*1b2596b5SMatthias Ringwald * 487*1b2596b5SMatthias Ringwald * \subsection pmc_use_case_2_setup_prereq Prerequisites 488*1b2596b5SMatthias Ringwald * -# \ref pio_group "Parallel Input/Output Controller (pio)" 489*1b2596b5SMatthias Ringwald * 490*1b2596b5SMatthias Ringwald * \subsection pmc_use_case_2_setup_code Code 491*1b2596b5SMatthias Ringwald * The following code must be added to the user application: 492*1b2596b5SMatthias Ringwald * \code 493*1b2596b5SMatthias Ringwald pio_set_peripheral(PIOA, PIO_PERIPH_B, PIO_PA17); 494*1b2596b5SMatthias Ringwald \endcode 495*1b2596b5SMatthias Ringwald * 496*1b2596b5SMatthias Ringwald * \subsection pmc_use_case_2_setup_code_workflow Workflow 497*1b2596b5SMatthias Ringwald * -# Configure the PCK1 pin to output on a specific port pin (in this case, 498*1b2596b5SMatthias Ringwald * PIOA pin 17) of the microcontroller. 499*1b2596b5SMatthias Ringwald * \code 500*1b2596b5SMatthias Ringwald pio_set_peripheral(PIOA, PIO_PERIPH_B, PIO_PA17); 501*1b2596b5SMatthias Ringwald \endcode 502*1b2596b5SMatthias Ringwald * \note The peripheral selection and pin will vary according to your selected 503*1b2596b5SMatthias Ringwald * SAM device model. Refer to the "Peripheral Signal Multiplexing on I/O 504*1b2596b5SMatthias Ringwald * Lines" of your device's datasheet. 505*1b2596b5SMatthias Ringwald * 506*1b2596b5SMatthias Ringwald * \section pmc_use_case_2_usage Use case 507*1b2596b5SMatthias Ringwald * The generated PCK1 clock output can be viewed on an oscilloscope attached to 508*1b2596b5SMatthias Ringwald * the correct pin of the microcontroller. 509*1b2596b5SMatthias Ringwald * 510*1b2596b5SMatthias Ringwald * \subsection pmc_use_case_2_usage_code Example code 511*1b2596b5SMatthias Ringwald * Add to application C-file: 512*1b2596b5SMatthias Ringwald * \code 513*1b2596b5SMatthias Ringwald pmc_switch_sclk_to_32kxtal(PMC_OSC_XTAL); 514*1b2596b5SMatthias Ringwald pmc_switch_pck_to_sclk(PMC_PCK_1, PMC_PCK_PRES_CLK_64); 515*1b2596b5SMatthias Ringwald pmc_enable_pck(PMC_PCK_1); 516*1b2596b5SMatthias Ringwald 517*1b2596b5SMatthias Ringwald for (;;) 518*1b2596b5SMatthias Ringwald { 519*1b2596b5SMatthias Ringwald // Do Nothing 520*1b2596b5SMatthias Ringwald } 521*1b2596b5SMatthias Ringwald \endcode 522*1b2596b5SMatthias Ringwald * 523*1b2596b5SMatthias Ringwald * \subsection pmc_use_case_2_usage_flow Workflow 524*1b2596b5SMatthias Ringwald * -# Switch the Slow Clock source input to an external 32KHz crystal: 525*1b2596b5SMatthias Ringwald * \code 526*1b2596b5SMatthias Ringwald pmc_switch_sclk_to_32kxtal(PMC_OSC_XTAL); 527*1b2596b5SMatthias Ringwald \endcode 528*1b2596b5SMatthias Ringwald * -# Switch the Programmable Clock module PCK1 source clock to the Slow Clock, 529*1b2596b5SMatthias Ringwald * with a prescaler of 64: 530*1b2596b5SMatthias Ringwald * \code 531*1b2596b5SMatthias Ringwald pmc_switch_pck_to_sclk(PMC_PCK_1, PMC_PCK_PRES_CLK_64); 532*1b2596b5SMatthias Ringwald \endcode 533*1b2596b5SMatthias Ringwald * -# Enable Programmable Clock module PCK1: 534*1b2596b5SMatthias Ringwald * \code 535*1b2596b5SMatthias Ringwald pmc_enable_pck(PMC_PCK_1); 536*1b2596b5SMatthias Ringwald \endcode 537*1b2596b5SMatthias Ringwald * -# Enter an infinite loop: 538*1b2596b5SMatthias Ringwald * \code 539*1b2596b5SMatthias Ringwald for (;;) 540*1b2596b5SMatthias Ringwald { 541*1b2596b5SMatthias Ringwald // Do Nothing 542*1b2596b5SMatthias Ringwald } 543*1b2596b5SMatthias Ringwald \endcode 544*1b2596b5SMatthias Ringwald */ 545*1b2596b5SMatthias Ringwald 546*1b2596b5SMatthias Ringwald #endif /* PMC_H_INCLUDED */ 547