summaryrefslogblamecommitdiffstats
path: root/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/supc.c
blob: 9c2ef98000da4d1fb4887879ea7ed487cf8ce19f (plain) (tree)
































































































































































































                                                                                       
/* ---------------------------------------------------------------------------- */
/*                  Atmel Microcontroller Software Support                      */
/*                       SAM Software Package License                           */
/* ---------------------------------------------------------------------------- */
/* Copyright (c) 2015, Atmel Corporation                                        */
/*                                                                              */
/* All rights reserved.                                                         */
/*                                                                              */
/* Redistribution and use in source and binary forms, with or without           */
/* modification, are permitted provided that the following condition is met:    */
/*                                                                              */
/* - Redistributions of source code must retain the above copyright notice,     */
/* this list of conditions and the disclaimer below.                            */
/*                                                                              */
/* Atmel's name may not be used to endorse or promote products derived from     */
/* this software without specific prior written permission.                     */
/*                                                                              */
/* DISCLAIMER:  THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR   */
/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE   */
/* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,      */
/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,  */
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF    */
/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING         */
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, */
/* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                           */
/* ---------------------------------------------------------------------------- */

/*----------------------------------------------------------------------------
 *        Headers
 *----------------------------------------------------------------------------*/

#include "chip.h"

#include <assert.h>

/*----------------------------------------------------------------------------
 *        Local functions
 *----------------------------------------------------------------------------*/

/**
 * \brief Select external 32K Crystal.
 *
 */

void SUPC_SelectExtCrystal32K(void)
{
	PMC_EnableXT32KFME();

	/* Select XTAL 32k instead of internal slow RC 32k for slow clock */
	if ((SUPC->SUPC_SR & SUPC_SR_OSCSEL) != SUPC_SR_OSCSEL_CRYST) {
		SUPC->SUPC_CR = SUPC_CR_KEY_PASSWD | SUPC_CR_XTALSEL_CRYSTAL_SEL;

		while (!(SUPC->SUPC_SR & SUPC_SR_OSCSEL));
	}
}

/**
 * \brief VROFF asserts the vddcore_nreset and stops the voltage regulator
 *
 */
void SUPC_DisableVoltageReg(void)
{
	SUPC->SUPC_CR |= SUPC_CR_KEY_PASSWD | SUPC_CR_VROFF;
}

/**
 * \brief Configures supply monitor
 *
 */
void SUPC_ConfigSupplyMonitor(uint32_t Config)
{
	SUPC->SUPC_SMMR = Config;
}


/**
 * \brief Disables supply monitor
 *
 */
void SUPC_DisableSupplyMonitor(void)
{
	SUPC->SUPC_SMMR = SUPC_SMMR_SMSMPL_SMD;
}


/**
 * \brief Enables/Disables Brownout detector
 *
 */
void SUPC_BrownoutDetectEnable(uint8_t enable)
{
	if (enable)
		SUPC->SUPC_MR = (SUPC_MR_BODDIS_ENABLE | SUPC_MR_KEY_PASSWD);
	else
		SUPC->SUPC_MR = (SUPC_MR_BODDIS_DISABLE | SUPC_MR_KEY_PASSWD);
}

/**
 * \brief Enables Brownout Detector Reset
 *
 */
void SUPC_BrownoutResetEnable(void)
{
	SUPC->SUPC_MR = (SUPC_MR_BODRSTEN_ENABLE | SUPC_MR_KEY_PASSWD);
}


/**
 * \brief Enables/Disables Sram in backup mode
 *
 */
void SUPC_SramBackupMode(uint8_t enable)
{
	if (enable)
		SUPC->SUPC_MR = ((1 << 17) | SUPC_MR_KEY_PASSWD);
	else
		SUPC->SUPC_MR = ((0 << 17) | SUPC_MR_KEY_PASSWD);
}

/**
 * \brief Bypass external 32.768KHz oscillator
 *
 */
void SUPC_BypassXtal32KOsc(void)
{
	SUPC->SUPC_MR = (SUPC_MR_OSCBYPASS_BYPASS | SUPC_MR_KEY_PASSWD);
}


/**
 * \brief Enables/Disables Wakeup mode
 *
 */
void SUPC_EnablesWakeupMode(uint32_t Regs, uint8_t enable)
{
	if (enable)
		SUPC->SUPC_WUMR |= Regs;
	else
		SUPC->SUPC_WUMR &= ~(uint32_t)Regs;
}

/**
 * \brief Configure Wakeup denounce period
 *
 */
void SUPC_SetWakeupDebounce(uint8_t period)
{
	SUPC->SUPC_WUMR |= ((period << SUPC_WUMR_WKUPDBC_Pos) & SUPC_WUMR_WKUPDBC_Msk);
}

/**
 * \brief Configure Low-power denounce period
 *
 */
void SUPC_SetLowPowerDebounce(uint8_t period)
{
	SUPC->SUPC_WUMR |= ((period << SUPC_WUMR_LPDBC_Pos) & SUPC_WUMR_LPDBC_Msk);
}


/**
 * \brief Enables/Disables Wakeup Inputs
 *
 */
void SUPC_EnablesWakeupInput(uint32_t Input, uint8_t enable)
{
	if (enable)
		SUPC->SUPC_WUIR |= Input;
	else
		SUPC->SUPC_WUIR &= ~(uint32_t)Input;
}

/**
 * \brief Checks if Crystal oscillator is selected as a slow clock
 */

uint8_t SUPC_IsSlowClkExtCrystal32K(void)
{
	return ((SUPC->SUPC_SR & SUPC_SR_OSCSEL) >> 7);
}

/**
 * \brief Checks if Crystal oscillator is selected as a slow clock
 */

uint8_t SUPC_Read_Status(uint32_t status)
{
	return (SUPC->SUPC_SR & status);
}