/* * Copyright (c) 2015, Freescale Semiconductor, Inc. * Copyright 2016-2017 NXP * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * o Redistributions of source code must retain the above copyright notice, this list * of conditions and the following disclaimer. * * o Redistributions in binary form must reproduce the above copyright notice, this * list of conditions and the following disclaimer in the documentation and/or * other materials provided with the distribution. * * o Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 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. */ #include "fsl_llwu.h" #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) void LLWU_SetExternalWakeupPinMode(LLWU_Type *base, uint32_t pinIndex, llwu_external_pin_mode_t pinMode) { #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32)) volatile uint32_t *regBase; uint32_t regOffset; uint32_t reg; switch (pinIndex >> 4U) { case 0U: regBase = &base->PE1; break; #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16)) case 1U: regBase = &base->PE2; break; #endif default: regBase = NULL; break; } #else volatile uint8_t *regBase; uint8_t regOffset; uint8_t reg; switch (pinIndex >> 2U) { case 0U: regBase = &base->PE1; break; case 1U: regBase = &base->PE2; break; #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 8)) case 2U: regBase = &base->PE3; break; #endif #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 12)) case 3U: regBase = &base->PE4; break; #endif #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16)) case 4U: regBase = &base->PE5; break; #endif #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 20)) case 5U: regBase = &base->PE6; break; #endif #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 24)) case 6U: regBase = &base->PE7; break; #endif #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 28)) case 7U: regBase = &base->PE8; break; #endif default: regBase = NULL; break; } #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH == 32 */ if (regBase) { reg = *regBase; #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32)) regOffset = ((pinIndex & 0x0FU) << 1U); #else regOffset = ((pinIndex & 0x03U) << 1U); #endif reg &= ~(0x3U << regOffset); reg |= ((uint32_t)pinMode << regOffset); *regBase = reg; } } bool LLWU_GetExternalWakeupPinFlag(LLWU_Type *base, uint32_t pinIndex) { #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32)) return (bool)(base->PF & (1U << pinIndex)); #else volatile uint8_t *regBase; switch (pinIndex >> 3U) { #if (defined(FSL_FEATURE_LLWU_HAS_PF) && FSL_FEATURE_LLWU_HAS_PF) case 0U: regBase = &base->PF1; break; #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 8)) case 1U: regBase = &base->PF2; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16)) case 2U: regBase = &base->PF3; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 24)) case 3U: regBase = &base->PF4; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #else case 0U: regBase = &base->F1; break; #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 8)) case 1U: regBase = &base->F2; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16)) case 2U: regBase = &base->F3; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 24)) case 3U: regBase = &base->F4; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #endif /* FSL_FEATURE_LLWU_HAS_PF */ default: regBase = NULL; break; } if (regBase) { return (bool)(*regBase & (1U << pinIndex % 8)); } else { return false; } #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH */ } void LLWU_ClearExternalWakeupPinFlag(LLWU_Type *base, uint32_t pinIndex) { #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32)) base->PF = (1U << pinIndex); #else volatile uint8_t *regBase; switch (pinIndex >> 3U) { #if (defined(FSL_FEATURE_LLWU_HAS_PF) && FSL_FEATURE_LLWU_HAS_PF) case 0U: regBase = &base->PF1; break; #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 8)) case 1U: regBase = &base->PF2; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16)) case 2U: regBase = &base->PF3; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 24)) case 3U: regBase = &base->PF4; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #else case 0U: regBase = &base->F1; break; #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 8)) case 1U: regBase = &base->F2; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 16)) case 2U: regBase = &base->F3; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #if (defined(FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN) && (FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN > 24)) case 3U: regBase = &base->F4; break; #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #endif /* FSL_FEATURE_LLWU_HAS_PF */ default: regBase = NULL; break; } if (regBase) { *regBase = (1U << pinIndex % 8U); } #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH */ } #endif /* FSL_FEATURE_LLWU_HAS_EXTERNAL_PIN */ #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && FSL_FEATURE_LLWU_HAS_PIN_FILTER) void LLWU_SetPinFilterMode(LLWU_Type *base, uint32_t filterIndex, llwu_external_pin_filter_mode_t filterMode) { #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32)) uint32_t reg; reg = base->FILT; reg &= ~((LLWU_FILT_FILTSEL1_MASK | LLWU_FILT_FILTE1_MASK) << (filterIndex * 8U - 1U)); reg |= (((filterMode.pinIndex << LLWU_FILT_FILTSEL1_SHIFT) | (filterMode.filterMode << LLWU_FILT_FILTE1_SHIFT) /* Clear the Filter Detect Flag */ | LLWU_FILT_FILTF1_MASK) << (filterIndex * 8U - 1U)); base->FILT = reg; #else volatile uint8_t *regBase; uint8_t reg; switch (filterIndex) { case 1: regBase = &base->FILT1; break; #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 1)) case 2: regBase = &base->FILT2; break; #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */ #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 2)) case 3: regBase = &base->FILT3; break; #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */ #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 3)) case 4: regBase = &base->FILT4; break; #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */ default: regBase = NULL; break; } if (regBase) { reg = *regBase; reg &= ~(LLWU_FILT1_FILTSEL_MASK | LLWU_FILT1_FILTE_MASK); reg |= ((uint32_t)filterMode.pinIndex << LLWU_FILT1_FILTSEL_SHIFT); reg |= ((uint32_t)filterMode.filterMode << LLWU_FILT1_FILTE_SHIFT); /* Clear the Filter Detect Flag */ reg |= LLWU_FILT1_FILTF_MASK; *regBase = reg; } #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH */ } bool LLWU_GetPinFilterFlag(LLWU_Type *base, uint32_t filterIndex) { #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32)) return (bool)(base->FILT & (1U << (filterIndex * 8U - 1))); #else bool status = false; switch (filterIndex) { case 1: status = (base->FILT1 & LLWU_FILT1_FILTF_MASK); break; #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 1)) case 2: status = (base->FILT2 & LLWU_FILT2_FILTF_MASK); break; #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */ #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 2)) case 3: status = (base->FILT3 & LLWU_FILT3_FILTF_MASK); break; #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */ #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 3)) case 4: status = (base->FILT4 & LLWU_FILT4_FILTF_MASK); break; #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */ default: break; } return status; #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH */ } void LLWU_ClearPinFilterFlag(LLWU_Type *base, uint32_t filterIndex) { #if (defined(FSL_FEATURE_LLWU_REG_BITWIDTH) && (FSL_FEATURE_LLWU_REG_BITWIDTH == 32)) uint32_t reg; reg = base->FILT; switch (filterIndex) { case 1: reg |= LLWU_FILT_FILTF1_MASK; break; case 2: reg |= LLWU_FILT_FILTF2_MASK; break; case 3: reg |= LLWU_FILT_FILTF3_MASK; break; case 4: reg |= LLWU_FILT_FILTF4_MASK; break; default: break; } base->FILT = reg; #else volatile uint8_t *regBase; uint8_t reg; switch (filterIndex) { case 1: regBase = &base->FILT1; break; #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 1)) case 2: regBase = &base->FILT2; break; #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */ #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 2)) case 3: regBase = &base->FILT3; break; #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */ #if (defined(FSL_FEATURE_LLWU_HAS_PIN_FILTER) && (FSL_FEATURE_LLWU_HAS_PIN_FILTER > 3)) case 4: regBase = &base->FILT4; break; #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */ default: regBase = NULL; break; } if (regBase) { reg = *regBase; reg |= LLWU_FILT1_FILTF_MASK; *regBase = reg; } #endif /* FSL_FEATURE_LLWU_REG_BITWIDTH */ } #endif /* FSL_FEATURE_LLWU_HAS_PIN_FILTER */ #if (defined(FSL_FEATURE_LLWU_HAS_RESET_ENABLE) && FSL_FEATURE_LLWU_HAS_RESET_ENABLE) void LLWU_SetResetPinMode(LLWU_Type *base, bool pinEnable, bool enableInLowLeakageMode) { uint8_t reg; reg = base->RST; reg &= ~(LLWU_RST_LLRSTE_MASK | LLWU_RST_RSTFILT_MASK); reg |= (((uint32_t)pinEnable << LLWU_RST_LLRSTE_SHIFT) | ((uint32_t)enableInLowLeakageMode << LLWU_RST_RSTFILT_SHIFT)); base->RST = reg; } #endif /* FSL_FEATURE_LLWU_HAS_RESET_ENABLE */