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