xref: /btstack/port/msp432p401lp-cc256x/ti/devices/msp432p4xx/driverlib/sysctl_a.c (revision 5fd0122a3e19d95e11e1f3eb8a08a2b2acb2557e)
1*5fd0122aSMatthias Ringwald /* --COPYRIGHT--,BSD
2*5fd0122aSMatthias Ringwald  * Copyright (c) 2017, Texas Instruments Incorporated
3*5fd0122aSMatthias Ringwald  * All rights reserved.
4*5fd0122aSMatthias Ringwald  *
5*5fd0122aSMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
6*5fd0122aSMatthias Ringwald  * modification, are permitted provided that the following conditions
7*5fd0122aSMatthias Ringwald  * are met:
8*5fd0122aSMatthias Ringwald  *
9*5fd0122aSMatthias Ringwald  * *  Redistributions of source code must retain the above copyright
10*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
11*5fd0122aSMatthias Ringwald  *
12*5fd0122aSMatthias Ringwald  * *  Redistributions in binary form must reproduce the above copyright
13*5fd0122aSMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
14*5fd0122aSMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
15*5fd0122aSMatthias Ringwald  *
16*5fd0122aSMatthias Ringwald  * *  Neither the name of Texas Instruments Incorporated nor the names of
17*5fd0122aSMatthias Ringwald  *    its contributors may be used to endorse or promote products derived
18*5fd0122aSMatthias Ringwald  *    from this software without specific prior written permission.
19*5fd0122aSMatthias Ringwald  *
20*5fd0122aSMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21*5fd0122aSMatthias Ringwald  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22*5fd0122aSMatthias Ringwald  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23*5fd0122aSMatthias Ringwald  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24*5fd0122aSMatthias Ringwald  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25*5fd0122aSMatthias Ringwald  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26*5fd0122aSMatthias Ringwald  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27*5fd0122aSMatthias Ringwald  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28*5fd0122aSMatthias Ringwald  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29*5fd0122aSMatthias Ringwald  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30*5fd0122aSMatthias Ringwald  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*5fd0122aSMatthias Ringwald  * --/COPYRIGHT--*/
32*5fd0122aSMatthias Ringwald /* Standard Includes */
33*5fd0122aSMatthias Ringwald #include <stdint.h>
34*5fd0122aSMatthias Ringwald #include <stdbool.h>
35*5fd0122aSMatthias Ringwald 
36*5fd0122aSMatthias Ringwald /* DriverLib Includes */
37*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/sysctl_a.h>
38*5fd0122aSMatthias Ringwald #include <ti/devices/msp432p4xx/driverlib/debug.h>
39*5fd0122aSMatthias Ringwald 
40*5fd0122aSMatthias Ringwald /* Define to ensure that our current MSP432 has the SYSCTL_A module. This
41*5fd0122aSMatthias Ringwald     definition is included in the device specific header file */
42*5fd0122aSMatthias Ringwald #ifdef __MCU_HAS_SYSCTL_A__
43*5fd0122aSMatthias Ringwald 
SysCtl_A_getTLVInfo(uint_fast8_t tag,uint_fast8_t instance,uint_fast8_t * length,uint32_t ** data_address)44*5fd0122aSMatthias Ringwald void SysCtl_A_getTLVInfo(uint_fast8_t tag, uint_fast8_t instance,
45*5fd0122aSMatthias Ringwald         uint_fast8_t *length, uint32_t **data_address)
46*5fd0122aSMatthias Ringwald {
47*5fd0122aSMatthias Ringwald     /* TLV Structure Start Address */
48*5fd0122aSMatthias Ringwald     uint32_t *TLV_address = (uint32_t *) TLV_START;
49*5fd0122aSMatthias Ringwald 
50*5fd0122aSMatthias Ringwald     if(*TLV_address == 0xFFFFFFFF)
51*5fd0122aSMatthias Ringwald     {
52*5fd0122aSMatthias Ringwald         *length = 0;
53*5fd0122aSMatthias Ringwald         // Return 0 for TAG not found
54*5fd0122aSMatthias Ringwald         *data_address = 0;
55*5fd0122aSMatthias Ringwald         return;
56*5fd0122aSMatthias Ringwald     }
57*5fd0122aSMatthias Ringwald 
58*5fd0122aSMatthias Ringwald     while (((*TLV_address != tag)) // check for tag and instance
59*5fd0122aSMatthias Ringwald     && (*TLV_address != TLV_TAGEND))         // do range check first
60*5fd0122aSMatthias Ringwald     {
61*5fd0122aSMatthias Ringwald         if (*TLV_address == tag)
62*5fd0122aSMatthias Ringwald         {
63*5fd0122aSMatthias Ringwald             if (instance == 0)
64*5fd0122aSMatthias Ringwald             {
65*5fd0122aSMatthias Ringwald                 break;
66*5fd0122aSMatthias Ringwald             }
67*5fd0122aSMatthias Ringwald 
68*5fd0122aSMatthias Ringwald             /* Repeat until requested instance is reached */
69*5fd0122aSMatthias Ringwald             instance--;
70*5fd0122aSMatthias Ringwald         }
71*5fd0122aSMatthias Ringwald 
72*5fd0122aSMatthias Ringwald         TLV_address += (*(TLV_address + 1)) + 2;
73*5fd0122aSMatthias Ringwald     }
74*5fd0122aSMatthias Ringwald 
75*5fd0122aSMatthias Ringwald     /* Check if Tag match happened... */
76*5fd0122aSMatthias Ringwald     if (*TLV_address == tag)
77*5fd0122aSMatthias Ringwald     {
78*5fd0122aSMatthias Ringwald         /* Return length = Address + 1 */
79*5fd0122aSMatthias Ringwald         *length = (*(TLV_address + 1)) * 4;
80*5fd0122aSMatthias Ringwald         /* Return address of first data/value info = Address + 2 */
81*5fd0122aSMatthias Ringwald         *data_address = (uint32_t *) (TLV_address + 2);
82*5fd0122aSMatthias Ringwald     }
83*5fd0122aSMatthias Ringwald     // If there was no tag match and the end of TLV structure was reached..
84*5fd0122aSMatthias Ringwald     else
85*5fd0122aSMatthias Ringwald     {
86*5fd0122aSMatthias Ringwald         // Return 0 for TAG not found
87*5fd0122aSMatthias Ringwald         *length = 0;
88*5fd0122aSMatthias Ringwald         // Return 0 for TAG not found
89*5fd0122aSMatthias Ringwald         *data_address = 0;
90*5fd0122aSMatthias Ringwald     }
91*5fd0122aSMatthias Ringwald }
92*5fd0122aSMatthias Ringwald 
SysCtl_A_getSRAMSize(void)93*5fd0122aSMatthias Ringwald uint_least32_t SysCtl_A_getSRAMSize(void)
94*5fd0122aSMatthias Ringwald {
95*5fd0122aSMatthias Ringwald     return SYSCTL_A->SRAM_SIZE;
96*5fd0122aSMatthias Ringwald }
97*5fd0122aSMatthias Ringwald 
SysCtl_A_getFlashSize(void)98*5fd0122aSMatthias Ringwald uint_least32_t SysCtl_A_getFlashSize(void)
99*5fd0122aSMatthias Ringwald {
100*5fd0122aSMatthias Ringwald     return SYSCTL_A->MAINFLASH_SIZE;
101*5fd0122aSMatthias Ringwald }
102*5fd0122aSMatthias Ringwald 
SysCtl_A_getInfoFlashSize(void)103*5fd0122aSMatthias Ringwald uint_least32_t SysCtl_A_getInfoFlashSize(void)
104*5fd0122aSMatthias Ringwald {
105*5fd0122aSMatthias Ringwald     return SYSCTL_A->INFOFLASH_SIZE;
106*5fd0122aSMatthias Ringwald }
107*5fd0122aSMatthias Ringwald 
SysCtl_A_disableNMISource(uint_fast8_t flags)108*5fd0122aSMatthias Ringwald void SysCtl_A_disableNMISource(uint_fast8_t flags)
109*5fd0122aSMatthias Ringwald {
110*5fd0122aSMatthias Ringwald     SYSCTL_A->NMI_CTLSTAT &= ~(flags);
111*5fd0122aSMatthias Ringwald }
112*5fd0122aSMatthias Ringwald 
SysCtl_A_enableNMISource(uint_fast8_t flags)113*5fd0122aSMatthias Ringwald void SysCtl_A_enableNMISource(uint_fast8_t flags)
114*5fd0122aSMatthias Ringwald {
115*5fd0122aSMatthias Ringwald     SYSCTL_A->NMI_CTLSTAT |= flags;
116*5fd0122aSMatthias Ringwald }
117*5fd0122aSMatthias Ringwald 
SysCtl_A_getNMISourceStatus(void)118*5fd0122aSMatthias Ringwald uint_fast8_t SysCtl_A_getNMISourceStatus(void)
119*5fd0122aSMatthias Ringwald {
120*5fd0122aSMatthias Ringwald     return SYSCTL_A->NMI_CTLSTAT & (SYSCTL_A_NMI_CTLSTAT_CS_FLG |
121*5fd0122aSMatthias Ringwald                                     SYSCTL_A_NMI_CTLSTAT_PSS_FLG |
122*5fd0122aSMatthias Ringwald                                     SYSCTL_A_NMI_CTLSTAT_PCM_FLG |
123*5fd0122aSMatthias Ringwald                                     SYSCTL_A_NMI_CTLSTAT_PIN_FLG);
124*5fd0122aSMatthias Ringwald }
125*5fd0122aSMatthias Ringwald 
SysCtl_A_rebootDevice(void)126*5fd0122aSMatthias Ringwald void SysCtl_A_rebootDevice(void)
127*5fd0122aSMatthias Ringwald {
128*5fd0122aSMatthias Ringwald     SYSCTL_A->REBOOT_CTL = (SYSCTL_A_REBOOT_CTL_REBOOT | SYSCTL_A_REBOOT_KEY);
129*5fd0122aSMatthias Ringwald }
130*5fd0122aSMatthias Ringwald 
SysCtl_A_enablePeripheralAtCPUHalt(uint_fast16_t devices)131*5fd0122aSMatthias Ringwald void SysCtl_A_enablePeripheralAtCPUHalt(uint_fast16_t devices)
132*5fd0122aSMatthias Ringwald {
133*5fd0122aSMatthias Ringwald     SYSCTL_A->PERIHALT_CTL &= ~devices;
134*5fd0122aSMatthias Ringwald }
135*5fd0122aSMatthias Ringwald 
SysCtl_A_disablePeripheralAtCPUHalt(uint_fast16_t devices)136*5fd0122aSMatthias Ringwald void SysCtl_A_disablePeripheralAtCPUHalt(uint_fast16_t devices)
137*5fd0122aSMatthias Ringwald {
138*5fd0122aSMatthias Ringwald     SYSCTL_A->PERIHALT_CTL |= devices;
139*5fd0122aSMatthias Ringwald }
140*5fd0122aSMatthias Ringwald 
SysCtl_A_setWDTTimeoutResetType(uint_fast8_t resetType)141*5fd0122aSMatthias Ringwald void SysCtl_A_setWDTTimeoutResetType(uint_fast8_t resetType)
142*5fd0122aSMatthias Ringwald {
143*5fd0122aSMatthias Ringwald     if (resetType)
144*5fd0122aSMatthias Ringwald         SYSCTL_A->WDTRESET_CTL |= SYSCTL_A_WDTRESET_CTL_TIMEOUT;
145*5fd0122aSMatthias Ringwald     else
146*5fd0122aSMatthias Ringwald         SYSCTL_A->WDTRESET_CTL &= ~SYSCTL_A_WDTRESET_CTL_TIMEOUT;
147*5fd0122aSMatthias Ringwald }
148*5fd0122aSMatthias Ringwald 
SysCtl_A_setWDTPasswordViolationResetType(uint_fast8_t resetType)149*5fd0122aSMatthias Ringwald void SysCtl_A_setWDTPasswordViolationResetType(uint_fast8_t resetType)
150*5fd0122aSMatthias Ringwald {
151*5fd0122aSMatthias Ringwald     if (resetType)
152*5fd0122aSMatthias Ringwald         SYSCTL_A->WDTRESET_CTL |= SYSCTL_A_WDTRESET_CTL_VIOLATION;
153*5fd0122aSMatthias Ringwald     else
154*5fd0122aSMatthias Ringwald         SYSCTL_A->WDTRESET_CTL &= ~SYSCTL_A_WDTRESET_CTL_VIOLATION;
155*5fd0122aSMatthias Ringwald }
156*5fd0122aSMatthias Ringwald 
SysCtl_A_enableGlitchFilter(void)157*5fd0122aSMatthias Ringwald void SysCtl_A_enableGlitchFilter(void)
158*5fd0122aSMatthias Ringwald {
159*5fd0122aSMatthias Ringwald     SYSCTL_A->DIO_GLTFLT_CTL |= SYSCTL_A_DIO_GLTFLT_CTL_GLTCH_EN;
160*5fd0122aSMatthias Ringwald }
161*5fd0122aSMatthias Ringwald 
SysCtl_A_disableGlitchFilter(void)162*5fd0122aSMatthias Ringwald void SysCtl_A_disableGlitchFilter(void)
163*5fd0122aSMatthias Ringwald {
164*5fd0122aSMatthias Ringwald     SYSCTL_A->DIO_GLTFLT_CTL &= ~SYSCTL_A_DIO_GLTFLT_CTL_GLTCH_EN;
165*5fd0122aSMatthias Ringwald }
166*5fd0122aSMatthias Ringwald 
SysCtl_A_getTempCalibrationConstant(uint32_t refVoltage,uint32_t temperature)167*5fd0122aSMatthias Ringwald uint_fast16_t SysCtl_A_getTempCalibrationConstant(uint32_t refVoltage,
168*5fd0122aSMatthias Ringwald         uint32_t temperature)
169*5fd0122aSMatthias Ringwald {
170*5fd0122aSMatthias Ringwald     return HWREG16(TLV_BASE + refVoltage + temperature);
171*5fd0122aSMatthias Ringwald }
172*5fd0122aSMatthias Ringwald 
SysCtl_A_enableSRAM(uint32_t addr)173*5fd0122aSMatthias Ringwald bool SysCtl_A_enableSRAM(uint32_t addr)
174*5fd0122aSMatthias Ringwald {
175*5fd0122aSMatthias Ringwald     uint32_t bankSize, bankBit;
176*5fd0122aSMatthias Ringwald 
177*5fd0122aSMatthias Ringwald     /* If SRAM is busy, return false */
178*5fd0122aSMatthias Ringwald     if(!(SYSCTL_A->SRAM_STAT & SYSCTL_A_SRAM_STAT_BNKEN_RDY))
179*5fd0122aSMatthias Ringwald         return false;
180*5fd0122aSMatthias Ringwald 
181*5fd0122aSMatthias Ringwald     /* Grabbing the bank size */
182*5fd0122aSMatthias Ringwald     bankSize = SysCtl_A_getSRAMSize()  / SYSCTL_A->SRAM_NUMBANKS;
183*5fd0122aSMatthias Ringwald     bankBit = (addr - SRAM_BASE) / bankSize;
184*5fd0122aSMatthias Ringwald 
185*5fd0122aSMatthias Ringwald     if (bankBit < 32)
186*5fd0122aSMatthias Ringwald     {
187*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BANKEN_CTL0 |= (1 << bankBit);
188*5fd0122aSMatthias Ringwald     } else if (bankBit < 64)
189*5fd0122aSMatthias Ringwald     {
190*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BANKEN_CTL1 |= (1 << (bankBit - 32));
191*5fd0122aSMatthias Ringwald     } else if (bankBit < 96)
192*5fd0122aSMatthias Ringwald     {
193*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BANKEN_CTL2 |= (1 << (bankBit - 64));
194*5fd0122aSMatthias Ringwald     } else
195*5fd0122aSMatthias Ringwald     {
196*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BANKEN_CTL3 |= (1 << (bankBit - 96));
197*5fd0122aSMatthias Ringwald     }
198*5fd0122aSMatthias Ringwald 
199*5fd0122aSMatthias Ringwald 
200*5fd0122aSMatthias Ringwald     return true;
201*5fd0122aSMatthias Ringwald }
202*5fd0122aSMatthias Ringwald 
SysCtl_A_disableSRAM(uint32_t addr)203*5fd0122aSMatthias Ringwald bool SysCtl_A_disableSRAM(uint32_t addr)
204*5fd0122aSMatthias Ringwald {
205*5fd0122aSMatthias Ringwald     uint32_t bankSize, bankBit;
206*5fd0122aSMatthias Ringwald 
207*5fd0122aSMatthias Ringwald     /* If SRAM is busy, return false */
208*5fd0122aSMatthias Ringwald     if(!(SYSCTL_A->SRAM_STAT & SYSCTL_A_SRAM_STAT_BNKEN_RDY))
209*5fd0122aSMatthias Ringwald         return false;
210*5fd0122aSMatthias Ringwald 
211*5fd0122aSMatthias Ringwald     /* Grabbing the bank size */
212*5fd0122aSMatthias Ringwald     bankSize = SysCtl_A_getSRAMSize() / SYSCTL_A->SRAM_NUMBANKS;
213*5fd0122aSMatthias Ringwald     bankBit = (addr - SRAM_BASE) / bankSize;
214*5fd0122aSMatthias Ringwald 
215*5fd0122aSMatthias Ringwald     if (bankBit < 32)
216*5fd0122aSMatthias Ringwald     {
217*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BANKEN_CTL0 &= ~(0xFFFFFFFF << bankBit);
218*5fd0122aSMatthias Ringwald     } else if (bankBit < 64)
219*5fd0122aSMatthias Ringwald     {
220*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BANKEN_CTL1 &= ~(0xFFFFFFFF << (bankBit - 32));
221*5fd0122aSMatthias Ringwald     } else if (bankBit < 96)
222*5fd0122aSMatthias Ringwald     {
223*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BANKEN_CTL2 &= ~(0xFFFFFFFF << (bankBit - 64));
224*5fd0122aSMatthias Ringwald     } else
225*5fd0122aSMatthias Ringwald     {
226*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BANKEN_CTL3 &= ~(0xFFFFFFFF << (bankBit - 96));
227*5fd0122aSMatthias Ringwald     }
228*5fd0122aSMatthias Ringwald 
229*5fd0122aSMatthias Ringwald 
230*5fd0122aSMatthias Ringwald     return true;
231*5fd0122aSMatthias Ringwald }
232*5fd0122aSMatthias Ringwald 
SysCtl_A_enableSRAMRetention(uint32_t startAddr,uint32_t endAddr)233*5fd0122aSMatthias Ringwald bool SysCtl_A_enableSRAMRetention(uint32_t startAddr,
234*5fd0122aSMatthias Ringwald         uint32_t endAddr)
235*5fd0122aSMatthias Ringwald {
236*5fd0122aSMatthias Ringwald     uint32_t blockSize, blockBitStart, blockBitEnd;
237*5fd0122aSMatthias Ringwald 
238*5fd0122aSMatthias Ringwald     if (startAddr > endAddr)
239*5fd0122aSMatthias Ringwald         return false;
240*5fd0122aSMatthias Ringwald 
241*5fd0122aSMatthias Ringwald     /* If SRAM is busy, return false */
242*5fd0122aSMatthias Ringwald     if(!(SYSCTL_A->SRAM_STAT & SYSCTL_A_SRAM_STAT_BLKRET_RDY))
243*5fd0122aSMatthias Ringwald         return false;
244*5fd0122aSMatthias Ringwald 
245*5fd0122aSMatthias Ringwald     /* Getting how big each bank is and how many blocks we have per bank */
246*5fd0122aSMatthias Ringwald     blockSize = SysCtl_A_getSRAMSize() / SYSCTL_A->SRAM_NUMBLOCKS;
247*5fd0122aSMatthias Ringwald     blockBitStart = (startAddr - SRAM_BASE) / blockSize;
248*5fd0122aSMatthias Ringwald     blockBitEnd = (endAddr - SRAM_BASE) / blockSize;
249*5fd0122aSMatthias Ringwald 
250*5fd0122aSMatthias Ringwald     if (blockBitStart < 32)
251*5fd0122aSMatthias Ringwald     {
252*5fd0122aSMatthias Ringwald         if (blockBitEnd < 32)
253*5fd0122aSMatthias Ringwald         {
254*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL0 |= (0xFFFFFFFF >> (31 - blockBitEnd))
255*5fd0122aSMatthias Ringwald                     & (0xFFFFFFFF << blockBitStart);
256*5fd0122aSMatthias Ringwald             return true;
257*5fd0122aSMatthias Ringwald         } else if (blockBitEnd < 64)
258*5fd0122aSMatthias Ringwald         {
259*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL0 |= (0xFFFFFFFF << blockBitStart);
260*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL1 |= (0xFFFFFFFF
261*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 32)));
262*5fd0122aSMatthias Ringwald         } else if (blockBitEnd < 96)
263*5fd0122aSMatthias Ringwald         {
264*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL0 |= (0xFFFFFFFF << blockBitStart);
265*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL1 = 0xFFFFFFFF;
266*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 |= (0xFFFFFFFF
267*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 64)));
268*5fd0122aSMatthias Ringwald         } else
269*5fd0122aSMatthias Ringwald         {
270*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL0 |= (0xFFFFFFFF << blockBitStart);
271*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL1 = 0xFFFFFFFF;
272*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 = 0xFFFFFFFF;
273*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL3 |= (0xFFFFFFFF
274*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 96)));
275*5fd0122aSMatthias Ringwald         }
276*5fd0122aSMatthias Ringwald     } else if (blockBitStart < 64)
277*5fd0122aSMatthias Ringwald     {
278*5fd0122aSMatthias Ringwald         if (blockBitEnd < 64)
279*5fd0122aSMatthias Ringwald         {
280*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL1 |= ((0xFFFFFFFF
281*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 32)))
282*5fd0122aSMatthias Ringwald                     & (0xFFFFFFFF << (blockBitStart - 32)));
283*5fd0122aSMatthias Ringwald             return true;
284*5fd0122aSMatthias Ringwald         }
285*5fd0122aSMatthias Ringwald 
286*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BLKRET_CTL1 = (0xFFFFFFFF << (blockBitStart - 32));
287*5fd0122aSMatthias Ringwald 
288*5fd0122aSMatthias Ringwald         if (blockBitEnd < 96)
289*5fd0122aSMatthias Ringwald         {
290*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 |= (0xFFFFFFFF
291*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 64)));
292*5fd0122aSMatthias Ringwald         } else
293*5fd0122aSMatthias Ringwald         {
294*5fd0122aSMatthias Ringwald 
295*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 |= 0xFFFFFFFF;
296*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL3 |= (0xFFFFFFFF
297*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 96)));
298*5fd0122aSMatthias Ringwald         }
299*5fd0122aSMatthias Ringwald     } else if (blockBitStart < 96)
300*5fd0122aSMatthias Ringwald     {
301*5fd0122aSMatthias Ringwald         if (blockBitEnd < 96)
302*5fd0122aSMatthias Ringwald         {
303*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 |= (0xFFFFFFFF
304*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 64)))
305*5fd0122aSMatthias Ringwald                     & (0xFFFFFFFF << (blockBitStart - 64));
306*5fd0122aSMatthias Ringwald             return true;
307*5fd0122aSMatthias Ringwald         } else
308*5fd0122aSMatthias Ringwald         {
309*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 |= (0xFFFFFFFF << (blockBitStart - 64));
310*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL3 |= (0xFFFFFFFF
311*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 96)));
312*5fd0122aSMatthias Ringwald         }
313*5fd0122aSMatthias Ringwald     } else
314*5fd0122aSMatthias Ringwald     {
315*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BLKRET_CTL3 |= (0xFFFFFFFF >> (31 - (blockBitEnd - 96)))
316*5fd0122aSMatthias Ringwald                 & (0xFFFFFFFF << (blockBitStart - 96));
317*5fd0122aSMatthias Ringwald     }
318*5fd0122aSMatthias Ringwald 
319*5fd0122aSMatthias Ringwald     return true;
320*5fd0122aSMatthias Ringwald 
321*5fd0122aSMatthias Ringwald }
322*5fd0122aSMatthias Ringwald 
SysCtl_A_disableSRAMRetention(uint32_t startAddr,uint32_t endAddr)323*5fd0122aSMatthias Ringwald bool SysCtl_A_disableSRAMRetention(uint32_t startAddr,
324*5fd0122aSMatthias Ringwald         uint32_t endAddr)
325*5fd0122aSMatthias Ringwald {
326*5fd0122aSMatthias Ringwald     uint32_t blockSize, blockBitStart, blockBitEnd;
327*5fd0122aSMatthias Ringwald 
328*5fd0122aSMatthias Ringwald     if (startAddr > endAddr)
329*5fd0122aSMatthias Ringwald         return false;
330*5fd0122aSMatthias Ringwald 
331*5fd0122aSMatthias Ringwald     /* If SRAM is busy, return false */
332*5fd0122aSMatthias Ringwald     if(!(SYSCTL_A->SRAM_STAT & SYSCTL_A_SRAM_STAT_BLKRET_RDY))
333*5fd0122aSMatthias Ringwald         return false;
334*5fd0122aSMatthias Ringwald 
335*5fd0122aSMatthias Ringwald 
336*5fd0122aSMatthias Ringwald     /* Getting how big each bank is and how many blocks we have per bank */
337*5fd0122aSMatthias Ringwald     blockSize = SysCtl_A_getSRAMSize() / SYSCTL_A->SRAM_NUMBLOCKS;
338*5fd0122aSMatthias Ringwald     blockBitStart = (startAddr - SRAM_BASE) / blockSize;
339*5fd0122aSMatthias Ringwald     blockBitEnd = (endAddr - SRAM_BASE) / blockSize;
340*5fd0122aSMatthias Ringwald 
341*5fd0122aSMatthias Ringwald     if (blockBitStart < 32)
342*5fd0122aSMatthias Ringwald     {
343*5fd0122aSMatthias Ringwald         if (blockBitEnd < 32)
344*5fd0122aSMatthias Ringwald         {
345*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL0 &= ~((0xFFFFFFFF >> (31 - blockBitEnd))
346*5fd0122aSMatthias Ringwald                     & (0xFFFFFFFF << blockBitStart));
347*5fd0122aSMatthias Ringwald             return true;
348*5fd0122aSMatthias Ringwald         }
349*5fd0122aSMatthias Ringwald 
350*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BLKRET_CTL0 &= ~((0xFFFFFFFF << blockBitStart));
351*5fd0122aSMatthias Ringwald 
352*5fd0122aSMatthias Ringwald         if (blockBitEnd < 64)
353*5fd0122aSMatthias Ringwald         {
354*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL1 &= ~((0xFFFFFFFF
355*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 32))));
356*5fd0122aSMatthias Ringwald         } else if (blockBitEnd < 96)
357*5fd0122aSMatthias Ringwald         {
358*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL1 = 0;
359*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 &= ~(0xFFFFFFFF
360*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 64)));
361*5fd0122aSMatthias Ringwald         } else
362*5fd0122aSMatthias Ringwald         {
363*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL1 = 0;
364*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 = 0;
365*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL3 &= ~(0xFFFFFFFF
366*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 96)));
367*5fd0122aSMatthias Ringwald         }
368*5fd0122aSMatthias Ringwald     } else if (blockBitStart < 64)
369*5fd0122aSMatthias Ringwald     {
370*5fd0122aSMatthias Ringwald         if (blockBitEnd < 64)
371*5fd0122aSMatthias Ringwald         {
372*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL1 &= ~((0xFFFFFFFF
373*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 32)))
374*5fd0122aSMatthias Ringwald                     & (0xFFFFFFFF << (blockBitStart - 32)));
375*5fd0122aSMatthias Ringwald             return true;
376*5fd0122aSMatthias Ringwald         }
377*5fd0122aSMatthias Ringwald 
378*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BLKRET_CTL1 &= ~(0xFFFFFFFF << (blockBitStart - 32));
379*5fd0122aSMatthias Ringwald 
380*5fd0122aSMatthias Ringwald         if (blockBitEnd < 96)
381*5fd0122aSMatthias Ringwald         {
382*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 &= ~(0xFFFFFFFF
383*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 64)));
384*5fd0122aSMatthias Ringwald         } else
385*5fd0122aSMatthias Ringwald         {
386*5fd0122aSMatthias Ringwald 
387*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 = 0;
388*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL3 &= ~(0xFFFFFFFF
389*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 96)));
390*5fd0122aSMatthias Ringwald         }
391*5fd0122aSMatthias Ringwald     } else if (blockBitStart < 96)
392*5fd0122aSMatthias Ringwald     {
393*5fd0122aSMatthias Ringwald         if (blockBitEnd < 96)
394*5fd0122aSMatthias Ringwald         {
395*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 &= ~((0xFFFFFFFF
396*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 64)))
397*5fd0122aSMatthias Ringwald                     & (0xFFFFFFFF << (blockBitStart - 64)));
398*5fd0122aSMatthias Ringwald         } else
399*5fd0122aSMatthias Ringwald         {
400*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL2 &= ~(0xFFFFFFFF << (blockBitStart - 64));
401*5fd0122aSMatthias Ringwald             SYSCTL_A->SRAM_BLKRET_CTL3 &= ~(0xFFFFFFFF
402*5fd0122aSMatthias Ringwald                     >> (31 - (blockBitEnd - 96)));
403*5fd0122aSMatthias Ringwald         }
404*5fd0122aSMatthias Ringwald     } else
405*5fd0122aSMatthias Ringwald     {
406*5fd0122aSMatthias Ringwald         SYSCTL_A->SRAM_BLKRET_CTL3 &= ~((0xFFFFFFFF >> (31 - (blockBitEnd - 96)))
407*5fd0122aSMatthias Ringwald                 & (0xFFFFFFFF << (blockBitStart - 96)));
408*5fd0122aSMatthias Ringwald     }
409*5fd0122aSMatthias Ringwald 
410*5fd0122aSMatthias Ringwald     return true;
411*5fd0122aSMatthias Ringwald }
412*5fd0122aSMatthias Ringwald 
413*5fd0122aSMatthias Ringwald #endif /* __MCU_HAS_SYSCTL_A__ */
414