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