1 /*
2 * ArmSpecialMemoryAccess.cpp
3 *
4 * Memory class for accessing flash memory.
5 *
6 * Copyright (C) 2007 - 2011 Texas Instruments Incorporated - http://www.ti.com/
7 *
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the
19 * distribution.
20 *
21 * Neither the name of Texas Instruments Incorporated nor the names of
22 * its contributors may be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38 #include <pch.h>
39 #include "ArmFlashMemoryAccess.h"
40 #include "ArmSpecialFlashMemoryAccess.h"
41 #include "HalExecCommand.h"
42 #include "IDeviceHandle.h"
43 #include "FetHandle.h"
44 #include "ClockCalibration.h"
45 #include "MSP432_FlashLib.h"
46 #include "CpuRegisters.h"
47
48 using namespace TI::DLL430;
49 using std::vector;
50 using std::bind;
51 using std::shared_ptr;
52
ArmInfoFlashMemoryAccess(MemoryArea::Name name,IDeviceHandle * devHandle,uint32_t start,uint32_t size,uint32_t seg,uint32_t banks,bool mapped,const bool isProtected,IMemoryManager * mm,uint8_t psa)53 ArmInfoFlashMemoryAccess::ArmInfoFlashMemoryAccess(
54 MemoryArea::Name name,
55 IDeviceHandle* devHandle,
56 uint32_t start,
57 uint32_t size,
58 uint32_t seg,
59 uint32_t banks,
60 bool mapped,
61 const bool isProtected,
62 IMemoryManager* mm,
63 uint8_t psa
64 )
65 : ArmFlashMemoryAccess(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa, static_cast<IWriteProtection*>(new NoWriteProtection(mm)))
66 , start(start)
67 , end(start + size - 1)
68 {}
69
~ArmInfoFlashMemoryAccess()70 ArmInfoFlashMemoryAccess::~ArmInfoFlashMemoryAccess() {};
71
72
erase()73 bool ArmInfoFlashMemoryAccess::erase()
74 {
75 return ArmFlashMemoryAccess::erase(start, end);
76 }
77
ArmBslFlashMemoryAccess(MemoryArea::Name name,IDeviceHandle * devHandle,uint32_t start,uint32_t size,uint32_t seg,uint32_t banks,bool mapped,const bool isProtected,IMemoryManager * mm,uint8_t psa)78 ArmBslFlashMemoryAccess::ArmBslFlashMemoryAccess(
79 MemoryArea::Name name,
80 IDeviceHandle* devHandle,
81 uint32_t start,
82 uint32_t size,
83 uint32_t seg,
84 uint32_t banks,
85 bool mapped,
86 const bool isProtected,
87 IMemoryManager* mm,
88 uint8_t psa
89 )
90 : ArmFlashMemoryAccess(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa, static_cast<IWriteProtection*>(new NoWriteProtection(mm)))
91 , start(start)
92 , end(start + size - 1)
93 {}
94
~ArmBslFlashMemoryAccess()95 ArmBslFlashMemoryAccess::~ArmBslFlashMemoryAccess()
96 {}
97
98
erase()99 bool ArmBslFlashMemoryAccess::erase()
100 {
101 if (!isLocked())
102 {
103 return ArmFlashMemoryAccess::flashErase(ArmBslFlashMemoryAccess::start, ArmBslFlashMemoryAccess::end,
104 true, MSP432_FlashLib::FLASH_SECTOR_ERASE);
105 }
106 return true;
107 }
108
erase(uint32_t start,uint32_t end,bool forceUnlock)109 bool ArmBslFlashMemoryAccess::erase(uint32_t start, uint32_t end, bool forceUnlock)
110 {
111 if (!isLocked())
112 {
113 return ArmFlashMemoryAccess::flashErase(start, end, true, MSP432_FlashLib::FLASH_SECTOR_ERASE);
114 }
115 return true;
116 }
117
doWrite(uint32_t address,const uint8_t * buffer,size_t count)118 bool ArmBslFlashMemoryAccess::doWrite(uint32_t address, const uint8_t* buffer, size_t count)
119 {
120 if (!isLocked())
121 {
122 return ArmFlashMemoryAccess::flashWrite(address, buffer, count, true);
123 }
124 return true;
125 }
126
ArmFlashMemoryAccess2M(MemoryArea::Name name,IDeviceHandle * devHandle,uint32_t start,uint32_t size,uint32_t seg,uint32_t banks,bool mapped,const bool isProtected,IMemoryManager * mm,uint8_t psa,IWriteProtection * writeProt)127 ArmFlashMemoryAccess2M::ArmFlashMemoryAccess2M(
128 MemoryArea::Name name,
129 IDeviceHandle* devHandle,
130 uint32_t start,
131 uint32_t size,
132 uint32_t seg,
133 uint32_t banks,
134 bool mapped,
135 const bool isProtected,
136 IMemoryManager* mm,
137 uint8_t psa,
138 IWriteProtection *writeProt
139 )
140 : ArmFlashMemoryAccess(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa, writeProt)
141 {}
142
~ArmFlashMemoryAccess2M()143 ArmFlashMemoryAccess2M::~ArmFlashMemoryAccess2M()
144 {}
145
146
wakeup()147 bool ArmFlashMemoryAccess2M::wakeup()
148 {
149 uint8_t timeout = 6;
150
151 uint32_t pcmCtlData = 0;
152 uint8_t tmpPcm[4] = { 0 };
153
154 IDebugManager *dbm = devHandle->getDebugManager();
155 if (!dbm)
156 {
157 return false;
158 }
159
160 mm->read(MSP432_FlashLib::PCM_CTL, tmpPcm, sizeof(pcmCtlData));
161 mm->sync();
162 pcmCtlData = tmpPcm[0] | (tmpPcm[1] << 8) | (tmpPcm[2] << 16) | (tmpPcm[3] << 24);
163
164 pcmCtlData = MSP432_FlashLib::PCM_CTL0_KEY | ((pcmCtlData & 0xFFFF) & ~(MSP432_FlashLib::PCM_CTL1_LOCKLPM5 + MSP432_FlashLib::PCM_CTL1_LOCKBKUP));
165
166 mm->write(MSP432_FlashLib::PCM_CTL, pcmCtlData);
167 mm->sync();
168
169 uint32_t sramEn = 0;
170 uint8_t sramEnTmp[4] = { 0 };
171 do
172 {
173 mm->read(MSP432_FlashLib::SYS_SRAM_STAT, sramEnTmp, sizeof(sramEn));
174 mm->sync();
175 sramEn = sramEnTmp[0] | (sramEnTmp[1] << 8) | (sramEnTmp[2] << 16) | (sramEnTmp[3] << 24);
176 } while (!(sramEn & MSP432_FlashLib::BNKEN_RDY) && --timeout);
177
178 if (!timeout)
179 {
180 return false;
181 }
182
183 uint32_t sramBanks = 0;
184 uint8_t sramBanksTmp[4] = { 0 };
185
186 mm->read(MSP432_FlashLib::SYS_SRAM_NUMBANKS, sramBanksTmp, sizeof(sramBanks));
187 mm->sync();
188 sramBanks = sramBanksTmp[0] | (sramBanksTmp[1] << 8) | (sramBanksTmp[2] << 16) | (sramBanksTmp[3] << 24);
189
190 if (sramBanks == 4)
191 {
192 mm->write(MSP432_FlashLib::SYS_SRAM_BNKEN_CTL0, MSP432_FlashLib::BNK3_EN);
193 mm->sync();
194 }
195 else if (sramBanks == 2)
196 {
197 mm->write(MSP432_FlashLib::SYS_SRAM_BNKEN_CTL0, MSP432_FlashLib::BNK1_EN);
198 mm->sync();
199 }
200 else
201 {
202 return false;
203 }
204 return true;
205 }
206
ArmBslFlashMemoryAccess2M(MemoryArea::Name name,IDeviceHandle * devHandle,uint32_t start,uint32_t size,uint32_t seg,uint32_t banks,bool mapped,const bool isProtected,IMemoryManager * mm,uint8_t psa)207 ArmBslFlashMemoryAccess2M::ArmBslFlashMemoryAccess2M(
208 MemoryArea::Name name,
209 IDeviceHandle* devHandle,
210 uint32_t start,
211 uint32_t size,
212 uint32_t seg,
213 uint32_t banks,
214 bool mapped,
215 const bool isProtected,
216 IMemoryManager* mm,
217 uint8_t psa
218 )
219 : ArmFlashMemoryAccess2M(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa, static_cast<IWriteProtection*>(new NoWriteProtection(mm))),
220 start(start),
221 end(start + size - 1)
222 {}
223
~ArmBslFlashMemoryAccess2M()224 ArmBslFlashMemoryAccess2M::~ArmBslFlashMemoryAccess2M()
225 {}
226
erase()227 bool ArmBslFlashMemoryAccess2M::erase()
228 {
229 if (!isLocked())
230 {
231 return ArmFlashMemoryAccess2M::flashErase(ArmBslFlashMemoryAccess2M::start, ArmBslFlashMemoryAccess2M::end,
232 true, MSP432_FlashLib::FLASH_SECTOR_ERASE);
233 }
234 return true;
235 }
236
erase(uint32_t start,uint32_t end,bool forceUnlock)237 bool ArmBslFlashMemoryAccess2M::erase(uint32_t start, uint32_t end, bool forceUnlock)
238 {
239 if (!isLocked())
240 {
241 return ArmFlashMemoryAccess2M::flashErase(start, end, true, MSP432_FlashLib::FLASH_SECTOR_ERASE);
242 }
243 return true;
244 }
245
doWrite(uint32_t address,const uint8_t * buffer,size_t count)246 bool ArmBslFlashMemoryAccess2M::doWrite(uint32_t address, const uint8_t* buffer, size_t count)
247 {
248 if (!isLocked())
249 {
250 return ArmFlashMemoryAccess2M::flashWrite(address, buffer, count, true);
251 }
252 return true;
253 }
254
ArmInfoFlashMemoryAccess2M(MemoryArea::Name name,IDeviceHandle * devHandle,uint32_t start,uint32_t size,uint32_t seg,uint32_t banks,bool mapped,const bool isProtected,IMemoryManager * mm,uint8_t psa)255 ArmInfoFlashMemoryAccess2M::ArmInfoFlashMemoryAccess2M(
256 MemoryArea::Name name,
257 IDeviceHandle* devHandle,
258 uint32_t start,
259 uint32_t size,
260 uint32_t seg,
261 uint32_t banks,
262 bool mapped,
263 const bool isProtected,
264 IMemoryManager* mm,
265 uint8_t psa
266 )
267 : ArmFlashMemoryAccess2M(name, devHandle, start, size, seg, banks, mapped, isProtected, mm, psa, static_cast<IWriteProtection*>(new NoWriteProtection(mm)))
268 , start(start)
269 , end(start + size - 1)
270 {}
271
~ArmInfoFlashMemoryAccess2M()272 ArmInfoFlashMemoryAccess2M::~ArmInfoFlashMemoryAccess2M() {};
273
274
erase()275 bool ArmInfoFlashMemoryAccess2M::erase()
276 {
277 return ArmFlashMemoryAccess2M::erase(start, end);
278 }
279
280
281
282