1 /* --COPYRIGHT--,BSD 2 * Copyright (c) 2017, Texas Instruments Incorporated 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of Texas Instruments Incorporated nor the names of 17 * its contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 27 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 28 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 29 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 30 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 * --/COPYRIGHT--*/ 32 /* Standard Includes */ 33 #include <stdint.h> 34 35 /* DriverLib Includes */ 36 #include <ti/devices/msp432p4xx/driverlib/pss.h> 37 #include <ti/devices/msp432p4xx/driverlib/interrupt.h> 38 #include <ti/devices/msp432p4xx/driverlib/debug.h> 39 #include <ti/devices/msp432p4xx/driverlib/cpu.h> 40 41 static void __PSSUnlock() 42 { 43 PSS->KEY = PSS_KEY_VALUE; 44 } 45 46 static void __PSSLock() 47 { 48 PSS->KEY = 0; 49 } 50 51 52 void PSS_enableForcedDCDCOperation(void) 53 { 54 __PSSUnlock(); 55 56 BITBAND_PERI(PSS->CTL0, PSS_CTL0_DCDC_FORCE_OFS) = 1; 57 58 __PSSLock(); 59 } 60 61 void PSS_disableForcedDCDCOperation(void) 62 { 63 __PSSUnlock(); 64 65 BITBAND_PERI(PSS->CTL0, PSS_CTL0_DCDC_FORCE_OFS) = 0; 66 67 __PSSLock(); 68 69 } 70 71 void PSS_enableHighSidePinToggle(bool activeLow) 72 { 73 __PSSUnlock(); 74 75 if (activeLow) 76 PSS->CTL0 |= (PSS_CTL0_SVMHOE | PSS_CTL0_SVMHOUTPOLAL); 77 else 78 { 79 BITBAND_PERI(PSS->CTL0, PSS_CTL0_SVMHOUTPOLAL_OFS) = 0; 80 BITBAND_PERI(PSS->CTL0, PSS_CTL0_SVMHOE_OFS) = 1; 81 } 82 83 __PSSLock(); 84 } 85 86 void PSS_disableHighSidePinToggle(void) 87 { 88 __PSSUnlock(); 89 90 BITBAND_PERI(PSS->CTL0, PSS_CTL0_SVMHOE_OFS) = 0; 91 92 __PSSLock(); 93 } 94 95 void PSS_enableHighSide(void) 96 { 97 __PSSUnlock(); 98 99 BITBAND_PERI(PSS->CTL0, PSS_CTL0_SVSMHOFF_OFS) = 0; 100 101 __PSSLock(); 102 } 103 104 void PSS_disableHighSide(void) 105 { 106 __PSSUnlock(); 107 108 BITBAND_PERI(PSS->CTL0, PSS_CTL0_SVSMHOFF_OFS) = 1; 109 110 __PSSLock(); 111 } 112 113 void PSS_setHighSidePerformanceMode(uint_fast8_t powerMode) 114 { 115 __PSSUnlock(); 116 117 if (powerMode == PSS_FULL_PERFORMANCE_MODE) 118 BITBAND_PERI(PSS->CTL0, PSS_CTL0_SVSMHLP_OFS) = 0; 119 else 120 BITBAND_PERI(PSS->CTL0, PSS_CTL0_SVSMHLP_OFS) = 1; 121 122 __PSSLock(); 123 } 124 125 uint_fast8_t PSS_getHighSidePerformanceMode(void) 126 { 127 if (BITBAND_PERI(PSS->CTL0, PSS_CTL0_SVSMHLP_OFS)) 128 return PSS_NORMAL_PERFORMANCE_MODE; 129 else 130 return PSS_FULL_PERFORMANCE_MODE; 131 } 132 133 void PSS_enableHighSideMonitor(void) 134 { 135 __PSSUnlock(); 136 137 BITBAND_PERI(PSS->CTL0, PSS_CTL0_SVSMHS_OFS) = 1; 138 139 __PSSLock(); 140 } 141 142 void PSS_disableHighSideMonitor(void) 143 { 144 __PSSUnlock(); 145 146 BITBAND_PERI(PSS->CTL0, PSS_CTL0_SVSMHS_OFS) = 0; 147 148 __PSSLock(); 149 } 150 151 void PSS_setHighSideVoltageTrigger(uint_fast8_t triggerVoltage) 152 { 153 __PSSUnlock(); 154 155 ASSERT(!(triggerVoltage & 0xF8)) 156 157 PSS->CTL0 &= ~PSS_CTL0_SVSMHTH_MASK; 158 PSS->CTL0 |= (triggerVoltage & 0x07) << PSS_CTL0_SVSMHTH_OFS; 159 160 __PSSLock(); 161 } 162 163 uint_fast8_t PSS_getHighSideVoltageTrigger(void) 164 { 165 return (uint_fast8_t)((PSS->CTL0 & PSS_CTL0_SVSMHTH_MASK) 166 >> PSS_CTL0_SVSMHTH_OFS); 167 } 168 169 void PSS_enableInterrupt(void) 170 { 171 __PSSUnlock(); 172 BITBAND_PERI(PSS->IE,PSS_IE_SVSMHIE_OFS) = 1; 173 __PSSLock(); 174 } 175 176 void PSS_disableInterrupt(void) 177 { 178 __PSSUnlock(); 179 BITBAND_PERI(PSS->IE,PSS_IE_SVSMHIE_OFS) = 0; 180 __PSSLock(); 181 } 182 183 uint32_t PSS_getInterruptStatus(void) 184 { 185 return PSS->IFG; 186 } 187 188 void PSS_clearInterruptFlag(void) 189 { 190 __PSSUnlock(); 191 BITBAND_PERI(PSS->CLRIFG,PSS_CLRIFG_CLRSVSMHIFG_OFS) = 1; 192 __PSSLock(); 193 } 194 195 void PSS_registerInterrupt(void (*intHandler)(void)) 196 { 197 // 198 // Register the interrupt handler, returning an error if an error occurs. 199 // 200 Interrupt_registerInterrupt(INT_PSS, intHandler); 201 202 // 203 // Enable the system control interrupt. 204 // 205 Interrupt_enableInterrupt(INT_PSS); 206 } 207 208 void PSS_unregisterInterrupt(void) 209 { 210 // 211 // Disable the interrupt. 212 // 213 Interrupt_disableInterrupt(INT_PSS); 214 215 // 216 // Unregister the interrupt handler. 217 // 218 Interrupt_unregisterInterrupt(INT_PSS); 219 } 220