Skip to content

Commit ead6912

Browse files
bogdanovsjpanisbl
authored andcommitted
simplelink_lpf3: cc23x0r5: driverlib: Add missing VIMS functionality for flash
VIMS function API is needed to enbale/disable buffers and check for activity before read/write/erase. Signed-off-by: Stoyan Bogdanov <[email protected]>
1 parent 399efe4 commit ead6912

File tree

3 files changed

+709
-1
lines changed

3 files changed

+709
-1
lines changed
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
/******************************************************************************
2+
* Filename: vims.c
3+
*
4+
* Description: Driver for the VIMS.
5+
*
6+
* Copyright (c) 2015 - 2022, Texas Instruments Incorporated
7+
* All rights reserved.
8+
*
9+
* Redistribution and use in source and binary forms, with or without
10+
* modification, are permitted provided that the following conditions are met:
11+
*
12+
* 1) Redistributions of source code must retain the above copyright notice,
13+
* this list of conditions and the following disclaimer.
14+
*
15+
* 2) Redistributions in binary form must reproduce the above copyright notice,
16+
* this list of conditions and the following disclaimer in the documentation
17+
* and/or other materials provided with the distribution.
18+
*
19+
* 3) Neither the name of the ORGANIZATION nor the names of its contributors may
20+
* be used to endorse or promote products derived from this software without
21+
* specific prior written permission.
22+
*
23+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26+
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
27+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29+
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30+
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31+
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33+
* POSSIBILITY OF SUCH DAMAGE.
34+
*
35+
******************************************************************************/
36+
37+
#include "vims.h"
38+
39+
//*****************************************************************************
40+
//
41+
// Handle support for DriverLib in ROM:
42+
// This section will undo prototype renaming made in the header file
43+
//
44+
//*****************************************************************************
45+
#if !defined(DOXYGEN)
46+
#undef VIMSConfigure
47+
#define VIMSConfigure NOROM_VIMSConfigure
48+
#undef VIMSModeSet
49+
#define VIMSModeSet NOROM_VIMSModeSet
50+
#undef VIMSModeGet
51+
#define VIMSModeGet NOROM_VIMSModeGet
52+
#undef VIMSModeSafeSet
53+
#define VIMSModeSafeSet NOROM_VIMSModeSafeSet
54+
#endif
55+
56+
//*****************************************************************************
57+
//
58+
// Configures the VIMS.
59+
//
60+
//*****************************************************************************
61+
void
62+
VIMSConfigure(uint32_t ui32Base, bool bRoundRobin, bool bPrefetch)
63+
{
64+
uint32_t ui32Reg;
65+
66+
// Check the arguments.
67+
ASSERT(VIMSBaseValid(ui32Base));
68+
69+
ui32Reg = HWREG(ui32Base + VIMS_O_CTL);
70+
ui32Reg &= ~(VIMS_CTL_PREF_EN | VIMS_CTL_ARB_CFG);
71+
if(bRoundRobin)
72+
{
73+
ui32Reg |= VIMS_CTL_ARB_CFG;
74+
}
75+
if(bPrefetch)
76+
{
77+
ui32Reg |= VIMS_CTL_PREF_EN;
78+
}
79+
80+
// Set the Arbitration and prefetch mode.
81+
HWREG(ui32Base + VIMS_O_CTL) = ui32Reg;
82+
}
83+
84+
//*****************************************************************************
85+
//
86+
// Set the operational mode of the VIMS
87+
//
88+
//*****************************************************************************
89+
void
90+
VIMSModeSet(uint32_t ui32Base, uint32_t ui32Mode)
91+
{
92+
uint32_t ui32Reg;
93+
94+
// Check the arguments.
95+
ASSERT(VIMSBaseValid(ui32Base));
96+
97+
ASSERT((ui32Mode == VIMS_MODE_DISABLED) ||
98+
(ui32Mode == VIMS_MODE_ENABLED) ||
99+
(ui32Mode == VIMS_MODE_OFF));
100+
101+
// Set the mode.
102+
ui32Reg = HWREG(ui32Base + VIMS_O_CTL);
103+
ui32Reg &= ~VIMS_CTL_MODE_M;
104+
ui32Reg |= (ui32Mode & VIMS_CTL_MODE_M);
105+
106+
HWREG(ui32Base + VIMS_O_CTL) = ui32Reg;
107+
}
108+
109+
//*****************************************************************************
110+
//
111+
// Get the current operational mode of the VIMS.
112+
//
113+
//*****************************************************************************
114+
uint32_t
115+
VIMSModeGet(uint32_t ui32Base)
116+
{
117+
uint32_t ui32Reg;
118+
119+
// Check the arguments.
120+
ASSERT(VIMSBaseValid(ui32Base));
121+
122+
ui32Reg = HWREG(ui32Base + VIMS_O_STAT);
123+
if(ui32Reg & VIMS_STAT_MODE_CHANGING)
124+
{
125+
return (VIMS_MODE_CHANGING);
126+
}
127+
else
128+
{
129+
return (ui32Reg & VIMS_STAT_MODE_M);
130+
}
131+
}
132+
133+
//*****************************************************************************
134+
//
135+
// Safe setting of new VIMS mode
136+
// - Function might be blocking
137+
// - Can be called for any mode change (also if actually not changing mode)
138+
//
139+
//*****************************************************************************
140+
void
141+
VIMSModeSafeSet( uint32_t ui32Base, uint32_t ui32NewMode, bool blocking )
142+
{
143+
uint32_t currentMode;
144+
145+
// Check the arguments.
146+
ASSERT(VIMSBaseValid(ui32Base));
147+
ASSERT((ui32NewMode == VIMS_MODE_DISABLED) ||
148+
(ui32NewMode == VIMS_MODE_ENABLED) ||
149+
(ui32NewMode == VIMS_MODE_OFF));
150+
151+
// Make sure that only the mode bits are set in the input parameter
152+
// (done just for security since it is critical to the code flow)
153+
ui32NewMode &= VIMS_CTL_MODE_M;
154+
155+
// Wait for any pending change to complete and get current VIMS mode
156+
// (This is a blocking point but will typically only be a blocking point
157+
// only if mode is changed multiple times with blocking=0)
158+
do {
159+
currentMode = VIMSModeGet( ui32Base );
160+
} while ( currentMode == VIMS_MODE_CHANGING );
161+
162+
// First check that it actually is a mode change request
163+
if ( ui32NewMode != currentMode ) {
164+
// Set new mode
165+
VIMSModeSet( ui32Base, ui32NewMode );
166+
167+
// Wait for final mode change to complete - if blocking is requested
168+
if ( blocking ) {
169+
while ( HWREGBITW( VIMS_BASE + VIMS_O_STAT, VIMS_STAT_MODE_CHANGING_BITN )) {
170+
// Do nothing - wait for change to complete.
171+
}
172+
}
173+
}
174+
}

0 commit comments

Comments
 (0)