iLLD_TC27xC  1.0
IfxFlash.c
Go to the documentation of this file.
1 /**
2  * \file IfxFlash.c
3  * \brief FLASH basic functionality
4  *
5  * \version iLLD_0_1_0_10
6  * \copyright Copyright (c) 2013 Infineon Technologies AG. All rights reserved.
7  *
8  *
9  * IMPORTANT NOTICE
10  *
11  *
12  * Infineon Technologies AG (Infineon) is supplying this file for use
13  * exclusively with Infineon's microcontroller products. This file can be freely
14  * distributed within development tools that are supporting such microcontroller
15  * products.
16  *
17  * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
18  * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
20  * INFINEON SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL,
21  * OR CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
22  *
23  *
24  */
25 
26 /******************************************************************************/
27 /*----------------------------------Includes----------------------------------*/
28 /******************************************************************************/
29 
30 #include "IfxFlash.h"
31 #include "_Utilities/Ifx_Assert.h"
32 
33 /******************************************************************************/
34 /*-------------------------Function Implementations---------------------------*/
35 /******************************************************************************/
36 
38 {
39  MODULE_FLASH0.CBAB[portId].CFG.B.CLR = 1;
40 }
41 
42 
44 {
45  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0x5554);
46 
47  *addr1 = 0xFA;
48 }
49 
50 
52 {
53  MODULE_FLASH0.UBAB[portId].CFG.B.CLR = 1;
54 }
55 
56 
58 {
59  MODULE_FLASH0.CBAB[portId].CFG.B.DIS = disable;
60 }
61 
62 
64 {
65  MODULE_FLASH0.UBAB[portId].CFG.B.DIS = disable;
66 }
67 
68 
70 {
71  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0x553c);
72  uint32 i;
73 
74  *addr1 = ucb;
75 
76  for (i = 0; i < 8; i++)
77  {
78  *addr1 = password[i];
79  }
80 }
81 
82 
84 {
85  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0x5554);
86 
87  if ((pageAddr & 0xff000000) == 0xa0000000) // program flash
88  {
89  *addr1 = 0x50;
90  return 0;
91  }
92  else if ((pageAddr & 0xff000000) == 0xaf000000) // data flash
93  {
94  *addr1 = 0x5D;
95  return 0;
96  }
97 
98  return 1; // invalid flash address
99 }
100 
101 
103 {
104  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
105  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
106  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
107  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
108 
109  *addr1 = sectorAddr;
110  *addr2 = numSector;
111  *addr3 = 0x80;
112  *addr4 = 0x5a;
113 }
114 
115 
116 void IfxFlash_eraseMultipleSectors(uint32 sectorAddr, uint32 numSector)
117 {
118  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
119  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
120  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
121  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
122 
123  *addr1 = sectorAddr;
124  *addr2 = numSector;
125  *addr3 = 0x80;
126  *addr4 = 0x50;
127 }
128 
129 
131 {
132  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
133  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
134  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
135  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
136 
137  *addr1 = sectorAddr;
138  *addr2 = 1;
139  *addr3 = 0x80;
140  *addr4 = 0x5a;
141 }
142 
143 
144 void IfxFlash_eraseSector(uint32 sectorAddr)
145 {
146  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
147  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
148  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
149  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
150 
151  *addr1 = sectorAddr;
152  *addr2 = 1;
153  *addr3 = 0x80;
154  *addr4 = 0x50;
155 }
156 
157 
159 {
160  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
161  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
162  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
163  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
164 
165  *addr1 = sectorAddr;
166  *addr2 = numSector;
167  *addr3 = 0x80;
168  *addr4 = 0x5F;
169 }
170 
171 
173 {
174  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
175  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
176  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
177  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
178 
179  *addr1 = sectorAddr;
180  *addr2 = 1;
181  *addr3 = 0x80;
182  *addr4 = 0x5F;
183 }
184 
185 
187 {
188  uint32 numErrors = 0;
189  uint32 fillingLevel = MODULE_FLASH0.CBAB[portId].STAT.U;
190 
191  int i;
192 
193  for (i = 0;
195  (fillingLevel & (1 << i)) != 0;
196  ++i)
197  {
198  Ifx_FLASH_CBAB_TOP top;
199  top.U = MODULE_FLASH0.CBAB[portId].TOP.U;
200 
201  if (top.B.VLD)
202  {
203  trackedFlashAdresses[numErrors].address = 0xa0000000 | (top.B.ADDR << 5);
204  trackedFlashAdresses[numErrors].errorType = top.B.ERR;
205  ++numErrors;
206  }
207 
208  // clear entry
209  MODULE_FLASH0.CBAB[portId].TOP.U = (1 << 31);
210  }
211 
212  return numErrors;
213 }
214 
215 
217 {
218  uint32 numErrors = 0;
219  uint32 fillingLevel = MODULE_FLASH0.UBAB[portId].STAT.U;
220 
221  int i;
222 
223  for (i = 0;
225  (fillingLevel & (1 << i)) != 0;
226  ++i)
227  {
228  Ifx_FLASH_UBAB_TOP top;
229  top.U = MODULE_FLASH0.UBAB[portId].TOP.U;
230 
231  if (top.B.VLD)
232  {
233  trackedFlashAdresses[numErrors].address = 0xa0000000 | (top.B.ADDR << 5);
234  trackedFlashAdresses[numErrors].errorType = top.B.ERR;
235  ++numErrors;
236  }
237 
238  // clear entry
239  MODULE_FLASH0.UBAB[portId].TOP.U = (1 << 31);
240  }
241 
242  return numErrors;
243 }
244 
245 
246 void IfxFlash_loadPage(uint32 pageAddr, uint32 wordL, uint32 wordU)
247 {
248  uint64 *addr1 = (uint64 *)(IFXFLASH_CMD_BASE_ADDRESS | 0x55f0);
249 
250  __st64_lu(addr1, wordL, wordU);
251 }
252 
253 
254 void IfxFlash_loadPage2X32(uint32 pageAddr, uint32 wordL, uint32 wordU)
255 {
256  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0x55f0);
257 
258  *addr1 = wordL;
259  addr1++;
260  *addr1 = wordU;
261 }
262 
263 
265 {
266  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0x5554);
267  *addr1 = 0xf0;
268 }
269 
270 
272 {
273  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0x5554);
274 
275  *addr1 = 0xF5;
276 }
277 
278 
280 {
282  errorTracking == IfxFlash_ErrorTracking_none ||
286 
287  MODULE_FLASH0.CBAB[portId].CFG.B.SEL = errorTracking;
288 }
289 
290 
292 {
294  errorTracking == IfxFlash_ErrorTracking_none ||
296 
297  MODULE_FLASH0.UBAB[portId].CFG.B.SEL = errorTracking;
298 }
299 
300 
302 {
303  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
304  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
305  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
306  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
307 
308  *addr1 = sectorAddr;
309  *addr2 = numSector;
310  *addr3 = 0x70;
311  *addr4 = 0xCC;
312 }
313 
314 
316 {
317  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
318  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
319  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
320  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
321 
322  *addr1 = sectorAddr;
323  *addr2 = 1;
324  *addr3 = 0x70;
325  *addr4 = 0xCC;
326 }
327 
328 
330 {
331  if (flash == 0)
332  {
333  while (FLASH0_FSR.U & (1 << flashType))
334  {}
335  }
336 
337 #if IFXFLASH_NUM_FLASH_MODULES > 1
338  else if (flash == 1)
339  {
340  while (FLASH1_FSR.U & (1 << flashType))
341  {}
342  }
343 #endif
344  else
345  {
346  return 1; // invalid flash selected
347  }
348 
349  return 0; // finished
350 }
351 
352 
354 {
355  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
356  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
357  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
358  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
359 
360  *addr1 = pageAddr;
361  *addr2 = 0x00;
362  *addr3 = 0xa0;
363  *addr4 = 0x7a;
364 }
365 
366 
368 {
369  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
370  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
371  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
372  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
373 
374  *addr1 = pageAddr;
375  *addr2 = 0x00;
376  *addr3 = 0xa0;
377  *addr4 = 0xaa;
378 }
379 
380 
382 {
383  volatile uint32 *addr1 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa50);
384  volatile uint32 *addr2 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaa58);
385  volatile uint32 *addr3 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
386  volatile uint32 *addr4 = (volatile uint32 *)(IFXFLASH_CMD_BASE_ADDRESS | 0xaaa8);
387 
388  *addr1 = pageAddr;
389  *addr2 = 0x00;
390  *addr3 = 0xa0;
391  *addr4 = 0x9a;
392 }