Skip to content

Commit 025e0cb

Browse files
committed
Adding support for EefcFlash unique ids
- Supported with most implementations of EefcFlash * I looked through the various datasheets to make sure each chip supported EEFC_FCMD_STUI - uniqueIdWords parameter defines the length of the id * If zero length, ignore the id - Ignored for non-EefcFlash modules - Prints using info if supported bossa> connect /dev/ttyACM0 Connected to device on /dev/ttyACM0 bossa> info YAYDevice : ATSAM4S4 Version : v1.13 RC2 Feb 20 2013 13:25:17 Address : 0x400000 Pages : 512 Page Size : 512 bytes Total Size : 256KB Planes : 1 Lock Regions : 16 Locked : none Security : false Boot Flash : false Unique Id : 533631004a504d573530393134343034
1 parent 3532de8 commit 025e0cb

File tree

9 files changed

+104
-42
lines changed

9 files changed

+104
-42
lines changed

src/D2xNvmFlash.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class D2xNvmFlash : public Flash
5454
bool getBootFlash();
5555
bool canBootFlash() { return false; }
5656

57+
std::vector<uint32_t> getUniqueId() { return std::vector<uint32_t>(); }
58+
5759
void writeOptions();
5860

5961
void writePage(uint32_t page);

src/D5xNvmFlash.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ class D5xNvmFlash : public Flash
5454
bool getBootFlash();
5555
bool canBootFlash() { return false; }
5656

57+
std::vector<uint32_t> getUniqueId() { return std::vector<uint32_t>(); }
58+
5759
void writeOptions();
5860

5961
void writePage(uint32_t page);

src/Device.cpp

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -179,43 +179,43 @@ Device::create()
179179
case 0x29970ee0: // B
180180
case 0x29A70ee0: // C
181181
_family = FAMILY_SAM4S;
182-
flashPtr = new EefcFlash(_samba, "ATSAM4SD32", 0x400000, 4096, 512, 2, 256, 0x20001000, 0x20010000, 0x400e0a00, false);
182+
flashPtr = new EefcFlash(_samba, "ATSAM4SD32", 0x400000, 4096, 512, 2, 256, 4, 0x20001000, 0x20010000, 0x400e0a00, false);
183183
break;
184184
case 0x29870c30: // A
185185
case 0x29970c30: // B
186186
case 0x29a70c30: // C
187187
_family = FAMILY_SAM4S;
188-
flashPtr = new EefcFlash(_samba, "ATSAM4SD16", 0x400000, 2048, 512, 2, 256, 0x20001000, 0x20010000, 0x400e0a00, false);
188+
flashPtr = new EefcFlash(_samba, "ATSAM4SD16", 0x400000, 2048, 512, 2, 256, 4, 0x20001000, 0x20010000, 0x400e0a00, false);
189189
break;
190190
case 0x28870ce0: // A
191191
case 0x28970ce0: // B
192192
case 0x28A70ce0: // C
193193
_family = FAMILY_SAM4S;
194-
flashPtr = new EefcFlash(_samba, "ATSAM4SA16", 0x400000, 2048, 512, 1, 256, 0x20001000, 0x20010000, 0x400e0a00, false);
194+
flashPtr = new EefcFlash(_samba, "ATSAM4SA16", 0x400000, 2048, 512, 1, 256, 4, 0x20001000, 0x20010000, 0x400e0a00, false);
195195
break;
196196
case 0x288c0ce0 : // A
197197
case 0x289c0ce0 : // B
198198
case 0x28ac0ce0 : // C
199199
_family = FAMILY_SAM4S;
200-
flashPtr = new EefcFlash(_samba, "ATSAM4S16", 0x400000, 2048, 512, 1, 128, 0x20001000, 0x20020000, 0x400e0a00, false);
200+
flashPtr = new EefcFlash(_samba, "ATSAM4S16", 0x400000, 2048, 512, 1, 128, 4, 0x20001000, 0x20020000, 0x400e0a00, false);
201201
break;
202202
case 0x288c0ae0 : // A
203203
case 0x289c0ae0 : // B
204204
case 0x28ac0ae0 : // C
205205
_family = FAMILY_SAM4S;
206-
flashPtr = new EefcFlash(_samba, "ATSAM4S8", 0x400000, 1024, 512, 1, 64, 0x20001000, 0x20020000, 0x400e0a00, false);
206+
flashPtr = new EefcFlash(_samba, "ATSAM4S8", 0x400000, 1024, 512, 1, 64, 4, 0x20001000, 0x20020000, 0x400e0a00, false);
207207
break;
208208
case 0x288b09e0 : // A
209209
case 0x289b09e0 : // B
210210
case 0x28ab09e0 : // C
211211
_family = FAMILY_SAM4S;
212-
flashPtr = new EefcFlash(_samba, "ATSAM4S4", 0x400000, 512, 512, 1, 16, 0x20001000, 0x20010000, 0x400e0a00, false);
212+
flashPtr = new EefcFlash(_samba, "ATSAM4S4", 0x400000, 512, 512, 1, 16, 4, 0x20001000, 0x20010000, 0x400e0a00, false);
213213
break;
214214
case 0x288b07e0 : // A
215215
case 0x289b07e0 : // B
216216
case 0x28ab07e0 : // C
217217
_family = FAMILY_SAM4S;
218-
flashPtr = new EefcFlash(_samba, "ATSAM4S2", 0x400000, 256, 512, 1, 16, 0x20001000, 0x20010000, 0x400e0a00, false);
218+
flashPtr = new EefcFlash(_samba, "ATSAM4S2", 0x400000, 256, 512, 1, 16, 4, 0x20001000, 0x20010000, 0x400e0a00, false);
219219
break;
220220
//
221221
// SAM3N
@@ -224,74 +224,74 @@ Device::create()
224224
case 0x29440960 : // B
225225
case 0x29540960 : // C
226226
_family = FAMILY_SAM3N;
227-
flashPtr = new EefcFlash(_samba, "ATSAM3N4", 0x400000, 1024, 256, 1, 16, 0x20001000, 0x20006000, 0x400e0a00, false);
227+
flashPtr = new EefcFlash(_samba, "ATSAM3N4", 0x400000, 1024, 256, 1, 16, 4, 0x20001000, 0x20006000, 0x400e0a00, false);
228228
break;
229229
case 0x29390760 : // A
230230
case 0x29490760 : // B
231231
case 0x29590760 : // C
232232
_family = FAMILY_SAM3N;
233-
flashPtr = new EefcFlash(_samba, "ATSAM3N2", 0x400000, 512, 256, 1, 8, 0x20001000, 0x20004000, 0x400e0a00, false);
233+
flashPtr = new EefcFlash(_samba, "ATSAM3N2", 0x400000, 512, 256, 1, 8, 4, 0x20001000, 0x20004000, 0x400e0a00, false);
234234
break;
235235
case 0x29380560 : // A
236236
case 0x29480560 : // B
237237
case 0x29580560 : // C
238238
_family = FAMILY_SAM3N;
239-
flashPtr = new EefcFlash(_samba, "ATSAM3N1", 0x400000, 256, 256, 1, 4, 0x20000800, 0x20002000, 0x400e0a00, false);
239+
flashPtr = new EefcFlash(_samba, "ATSAM3N1", 0x400000, 256, 256, 1, 4, 4, 0x20000800, 0x20002000, 0x400e0a00, false);
240240
break;
241241
case 0x29380360 : // A
242242
case 0x29480360 : // B
243243
case 0x29580360 : // C
244244
_family = FAMILY_SAM3N;
245-
flashPtr = new EefcFlash(_samba, "ATSAM3N0", 0x400000, 128, 256, 1, 1, 0x20000800, 0x20002000, 0x400e0a00, false);
245+
flashPtr = new EefcFlash(_samba, "ATSAM3N0", 0x400000, 128, 256, 1, 1, 4, 0x20000800, 0x20002000, 0x400e0a00, false);
246246
break;
247247
//
248248
// SAM3S
249249
//
250250
case 0x299b0a60 : // B
251251
case 0x29ab0a60 : // C
252252
_family = FAMILY_SAM3S;
253-
flashPtr = new EefcFlash(_samba, "ATSAM3SD8", 0x400000, 2048, 256, 1, 16, 0x20001000, 0x20010000, 0x400e0a00, false);
253+
flashPtr = new EefcFlash(_samba, "ATSAM3SD8", 0x400000, 2048, 256, 1, 16, 4, 0x20001000, 0x20010000, 0x400e0a00, false);
254254
break;
255255
case 0x289b0a60 : // B
256256
case 0x28ab0a60 : // C
257257
_family = FAMILY_SAM3S;
258-
flashPtr = new EefcFlash(_samba, "ATSAM3S8", 0x400000, 2048, 256, 1, 16, 0x20001000, 0x20010000, 0x400e0a00, false);
258+
flashPtr = new EefcFlash(_samba, "ATSAM3S8", 0x400000, 2048, 256, 1, 16, 4, 0x20001000, 0x20010000, 0x400e0a00, false);
259259
break;
260260
case 0x28800960 : // A
261261
case 0x28900960 : // B
262262
case 0x28a00960 : // C
263263
_family = FAMILY_SAM3S;
264-
flashPtr = new EefcFlash(_samba, "ATSAM3S4", 0x400000, 1024, 256, 1, 16, 0x20001000, 0x2000c000, 0x400e0a00, false);
264+
flashPtr = new EefcFlash(_samba, "ATSAM3S4", 0x400000, 1024, 256, 1, 16, 4, 0x20001000, 0x2000c000, 0x400e0a00, false);
265265
break;
266266
case 0x288a0760 : // A
267267
case 0x289a0760 : // B
268268
case 0x28aa0760 : // C
269269
_family = FAMILY_SAM3S;
270-
flashPtr = new EefcFlash(_samba, "ATSAM3S2", 0x400000, 512, 256, 1, 8, 0x20000800, 0x20008000, 0x400e0a00, false);
270+
flashPtr = new EefcFlash(_samba, "ATSAM3S2", 0x400000, 512, 256, 1, 8, 4, 0x20000800, 0x20008000, 0x400e0a00, false);
271271
break;
272272
case 0x28890560 : // A
273273
case 0x28990560 : // B
274274
case 0x28a90560 : // C
275275
_family = FAMILY_SAM3S;
276-
flashPtr = new EefcFlash(_samba, "ATSAM3S1", 0x400000, 256, 256, 1, 4, 0x20000800, 0x20004000, 0x400e0a00, false);
276+
flashPtr = new EefcFlash(_samba, "ATSAM3S1", 0x400000, 256, 256, 1, 4, 4, 0x20000800, 0x20004000, 0x400e0a00, false);
277277
break;
278278
//
279279
// SAM3U
280280
//
281281
case 0x28000960 : // C
282282
case 0x28100960 : // E
283283
_family = FAMILY_SAM3U;
284-
flashPtr = new EefcFlash(_samba, "ATSAM3U4", 0xE0000, 1024, 256, 2, 32, 0x20001000, 0x20008000, 0x400e0800, false);
284+
flashPtr = new EefcFlash(_samba, "ATSAM3U4", 0xE0000, 1024, 256, 2, 32, 4, 0x20001000, 0x20008000, 0x400e0800, false);
285285
break;
286286
case 0x280a0760 : // C
287287
case 0x281a0760 : // E
288288
_family = FAMILY_SAM3U;
289-
flashPtr = new EefcFlash(_samba, "ATSAM3U2", 0x80000, 512, 256, 1, 16, 0x20001000, 0x20004000, 0x400e0800, false);
289+
flashPtr = new EefcFlash(_samba, "ATSAM3U2", 0x80000, 512, 256, 1, 16, 4, 0x20001000, 0x20004000, 0x400e0800, false);
290290
break;
291291
case 0x28090560 : // C
292292
case 0x28190560 : // E
293293
_family = FAMILY_SAM3U;
294-
flashPtr = new EefcFlash(_samba, "ATSAM3U1", 0x80000, 256, 256, 1, 8, 0x20001000, 0x20002000, 0x400e0800, false);
294+
flashPtr = new EefcFlash(_samba, "ATSAM3U1", 0x80000, 256, 256, 1, 8, 4, 0x20001000, 0x20002000, 0x400e0800, false);
295295
break;
296296
//
297297
// SAM3X
@@ -300,49 +300,49 @@ Device::create()
300300
case 0x285e0a60 : // 8E
301301
case 0x284e0a60 : // 8C
302302
_family = FAMILY_SAM3X;
303-
flashPtr = new EefcFlash(_samba, "ATSAM3X8", 0x80000, 2048, 256, 2, 32, 0x20001000, 0x20010000, 0x400e0a00, false);
303+
flashPtr = new EefcFlash(_samba, "ATSAM3X8", 0x80000, 2048, 256, 2, 32, 4, 0x20001000, 0x20010000, 0x400e0a00, false);
304304
break;
305305
case 0x285b0960 : // 4E
306306
case 0x284b0960 : // 4C
307307
_family = FAMILY_SAM3X;
308-
flashPtr = new EefcFlash(_samba, "ATSAM3X4", 0x80000, 1024, 256, 2, 16, 0x20001000, 0x20008000, 0x400e0a00, false);
308+
flashPtr = new EefcFlash(_samba, "ATSAM3X4", 0x80000, 1024, 256, 2, 16, 4, 0x20001000, 0x20008000, 0x400e0a00, false);
309309
break;
310310
//
311311
// SAM3A
312312
//
313313
case 0x283e0A60 : // 8C
314314
_family = FAMILY_SAM3A;
315-
flashPtr = new EefcFlash(_samba, "ATSAM3A8", 0x80000, 2048, 256, 2, 32, 0x20001000, 0x20010000, 0x400e0a00, false);
315+
flashPtr = new EefcFlash(_samba, "ATSAM3A8", 0x80000, 2048, 256, 2, 32, 4, 0x20001000, 0x20010000, 0x400e0a00, false);
316316
break;
317317
case 0x283b0960 : // 4C
318318
_family = FAMILY_SAM3A;
319-
flashPtr = new EefcFlash(_samba, "ATSAM3A4", 0x80000, 1024, 256, 2, 16, 0x20001000, 0x20008000, 0x400e0a00, false);
319+
flashPtr = new EefcFlash(_samba, "ATSAM3A4", 0x80000, 1024, 256, 2, 16, 4, 0x20001000, 0x20008000, 0x400e0a00, false);
320320
break;
321321
//
322322
// SAM7L
323323
//
324324
case 0x27330740 :
325325
_family = FAMILY_SAM7L;
326-
flashPtr = new EefcFlash(_samba, "ATSAM7L128", 0x100000, 512, 256, 1, 16, 0x2ffb40, 0x300700, 0xffffff60, false);
326+
flashPtr = new EefcFlash(_samba, "ATSAM7L128", 0x100000, 512, 256, 1, 16, 0, 0x2ffb40, 0x300700, 0xffffff60, false);
327327
break;
328328
case 0x27330540 :
329329
_family = FAMILY_SAM7L;
330-
flashPtr = new EefcFlash(_samba, "ATSAM7L64", 0x100000, 256, 256, 1, 8, 0x2ffb40, 0x300700, 0xffffff60, false);
330+
flashPtr = new EefcFlash(_samba, "ATSAM7L64", 0x100000, 256, 256, 1, 8, 0, 0x2ffb40, 0x300700, 0xffffff60, false);
331331
break;
332332
//
333333
// SAM9XE
334334
//
335335
case 0x329aa3a0 :
336336
_family = FAMILY_SAM9XE;
337-
flashPtr = new EefcFlash(_samba, "ATSAM9XE512", 0x200000, 1024, 512, 1, 32, 0x300000, 0x307000, 0xfffffa00, true);
337+
flashPtr = new EefcFlash(_samba, "ATSAM9XE512", 0x200000, 1024, 512, 1, 32, 0, 0x300000, 0x307000, 0xfffffa00, true);
338338
break;
339339
case 0x329a93a0 :
340340
_family = FAMILY_SAM9XE;
341-
flashPtr = new EefcFlash(_samba, "ATSAM9XE256", 0x200000, 512, 512, 1, 16, 0x300000, 0x307000, 0xfffffa00, true);
341+
flashPtr = new EefcFlash(_samba, "ATSAM9XE256", 0x200000, 512, 512, 1, 16, 0, 0x300000, 0x307000, 0xfffffa00, true);
342342
break;
343343
case 0x329973a0 :
344344
_family = FAMILY_SAM9XE;
345-
flashPtr = new EefcFlash(_samba, "ATSAM9XE128", 0x200000, 256, 512, 1, 8, 0x300000, 0x303000, 0xfffffa00, true);
345+
flashPtr = new EefcFlash(_samba, "ATSAM9XE128", 0x200000, 256, 512, 1, 8, 0, 0x300000, 0x303000, 0xfffffa00, true);
346346
break;
347347
//
348348
// SAM4E
@@ -353,12 +353,12 @@ Device::create()
353353
case 0x00120200: // E
354354
case 0x00120201: // C
355355
_family = FAMILY_SAM4E;
356-
flashPtr = new EefcFlash(_samba, "ATSAM4E16", 0x400000, 2048, 512, 1, 128, 0x20001000, 0x20020000, 0x400e0a00, false);
356+
flashPtr = new EefcFlash(_samba, "ATSAM4E16", 0x400000, 2048, 512, 1, 128, 4, 0x20001000, 0x20020000, 0x400e0a00, false);
357357
break;
358358
case 0x00120208: // E
359359
case 0x00120209: // C
360360
_family = FAMILY_SAM4E;
361-
flashPtr = new EefcFlash(_samba, "ATSAM4E8", 0x400000, 1024, 512, 1, 64, 0x20001000, 0x20020000, 0x400e0a00, false);
361+
flashPtr = new EefcFlash(_samba, "ATSAM4E8", 0x400000, 1024, 512, 1, 64, 4, 0x20001000, 0x20020000, 0x400e0a00, false);
362362
break;
363363
}
364364
break;
@@ -367,56 +367,56 @@ Device::create()
367367
//
368368
case 0x210d0a00:
369369
_family = FAMILY_SAME70;
370-
flashPtr = new EefcFlash(_samba, "ATSAME70x19", 0x400000, 1024, 512, 1, 32, 0x20401000, 0x20404000, 0x400e0c00, false);
370+
flashPtr = new EefcFlash(_samba, "ATSAME70x19", 0x400000, 1024, 512, 1, 32, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
371371
break;
372372
case 0x21020c00:
373373
_family = FAMILY_SAME70;
374-
flashPtr = new EefcFlash(_samba, "ATSAME70x20", 0x400000, 2048, 512, 1, 64, 0x20401000, 0x20404000, 0x400e0c00, false);
374+
flashPtr = new EefcFlash(_samba, "ATSAME70x20", 0x400000, 2048, 512, 1, 64, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
375375
break;
376376
case 0x21020e00:
377377
_family = FAMILY_SAME70;
378-
flashPtr = new EefcFlash(_samba, "ATSAME70x21", 0x400000, 4096, 512, 1, 128, 0x20401000, 0x20404000, 0x400e0c00, false);
378+
flashPtr = new EefcFlash(_samba, "ATSAME70x21", 0x400000, 4096, 512, 1, 128, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
379379
break;
380380
//
381381
// SAMS70
382382
//
383383
case 0x211d0a00:
384384
_family = FAMILY_SAMS70;
385-
flashPtr = new EefcFlash(_samba, "ATSAMS70x19", 0x400000, 1024, 512, 1, 32, 0x20401000, 0x20404000, 0x400e0c00, false);
385+
flashPtr = new EefcFlash(_samba, "ATSAMS70x19", 0x400000, 1024, 512, 1, 32, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
386386
break;
387387
case 0x21120c00:
388388
_family = FAMILY_SAMS70;
389-
flashPtr = new EefcFlash(_samba, "ATSAMS70x20", 0x400000, 2048, 512, 1, 64, 0x20401000, 0x20404000, 0x400e0c00, false);
389+
flashPtr = new EefcFlash(_samba, "ATSAMS70x20", 0x400000, 2048, 512, 1, 64, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
390390
break;
391391
case 0x21120e00:
392392
_family = FAMILY_SAMS70;
393-
flashPtr = new EefcFlash(_samba, "ATSAMS70x21", 0x400000, 4096, 512, 1, 128, 0x20401000, 0x20404000, 0x400e0c00, false);
393+
flashPtr = new EefcFlash(_samba, "ATSAMS70x21", 0x400000, 4096, 512, 1, 128, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
394394
break;
395395
//
396396
// SAMV70
397397
//
398398
case 0x213d0a00:
399399
_family = FAMILY_SAMV70;
400-
flashPtr = new EefcFlash(_samba, "ATSAMV70x19", 0x400000, 1024, 512, 1, 32, 0x20401000, 0x20404000, 0x400e0c00, false);
400+
flashPtr = new EefcFlash(_samba, "ATSAMV70x19", 0x400000, 1024, 512, 1, 32, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
401401
break;
402402
case 0x21320c00:
403403
_family = FAMILY_SAMV70;
404-
flashPtr = new EefcFlash(_samba, "ATSAMV70x20", 0x400000, 2048, 512, 1, 64, 0x20401000, 0x20404000, 0x400e0c00, false);
404+
flashPtr = new EefcFlash(_samba, "ATSAMV70x20", 0x400000, 2048, 512, 1, 64, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
405405
break;
406406
//
407407
// SAMV71
408408
//
409409
case 0x212d0a00:
410410
_family = FAMILY_SAMV71;
411-
flashPtr = new EefcFlash(_samba, "ATSAMV71x19", 0x400000, 1024, 512, 1, 32, 0x20401000, 0x20404000, 0x400e0c00, false);
411+
flashPtr = new EefcFlash(_samba, "ATSAMV71x19", 0x400000, 1024, 512, 1, 32, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
412412
break;
413413
case 0x21220c00:
414414
_family = FAMILY_SAMV71;
415-
flashPtr = new EefcFlash(_samba, "ATSAMV71x20", 0x400000, 2048, 512, 1, 64, 0x20401000, 0x20404000, 0x400e0c00, false);
415+
flashPtr = new EefcFlash(_samba, "ATSAMV71x20", 0x400000, 2048, 512, 1, 64, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
416416
break;
417417
case 0x21220e00:
418418
_family = FAMILY_SAMV71;
419-
flashPtr = new EefcFlash(_samba, "ATSAMV71x21", 0x400000, 4096, 512, 1, 128, 0x20401000, 0x20404000, 0x400e0c00, false);
419+
flashPtr = new EefcFlash(_samba, "ATSAMV71x21", 0x400000, 4096, 512, 1, 128, 4, 0x20401000, 0x20404000, 0x400e0c00, false);
420420
break;
421421
//
422422
// No CHIPID devices

src/EefcFlash.cpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,14 @@
5757
#define EEFC_FCMD_SGPB 0xb
5858
#define EEFC_FCMD_CGPB 0xc
5959
#define EEFC_FCMD_GGPB 0xd
60+
#define EEFC_FCMD_STUI 0xe
61+
#define EEFC_FCMD_SPUI 0xf
62+
#define EEFC_FCMD_GCALB 0x10
63+
#define EEFC_FCMD_ES 0x11
64+
#define EEFC_FCMD_WUS 0x12
65+
#define EEFC_FCMD_EUS 0x13
66+
#define EEFC_FCMD_STUS 0x14
67+
#define EEFC_FCMD_SPUS 0x15
6068

6169
const uint32_t
6270
EefcFlash::PagesPerErase = 8;
@@ -68,12 +76,13 @@ EefcFlash::EefcFlash(Samba& samba,
6876
uint32_t size,
6977
uint32_t planes,
7078
uint32_t lockRegions,
79+
uint32_t uniqueIdWords,
7180
uint32_t user,
7281
uint32_t stack,
7382
uint32_t regs,
7483
bool canBrownout)
7584
: Flash(samba, name, addr, pages, size, planes, lockRegions, user, stack),
76-
_regs(regs), _canBrownout(canBrownout), _eraseAuto(true)
85+
_regs(regs), _uniqueIdWords(uniqueIdWords), _canBrownout(canBrownout), _eraseAuto(true)
7786
{
7887
assert(planes == 1 || planes == 2);
7988
assert(pages <= 4096);
@@ -220,6 +229,36 @@ EefcFlash::getBootFlash()
220229
return (readFRR0() & (1 << (_canBrownout ? 3 : 1)));
221230
}
222231

232+
std::vector<uint32_t>
233+
EefcFlash::getUniqueId()
234+
{
235+
std::vector<uint32_t> value;
236+
237+
// No unique id for this chip
238+
if (_uniqueIdWords == 0)
239+
return value;
240+
241+
waitFSR();
242+
243+
// Start read
244+
writeFCR0(EEFC_FCMD_STUI, 0);
245+
246+
// Unique id (so far, only 128-bit, or 0 if feature is not available)
247+
uint32_t addr = address();
248+
for (uint8_t word = 0; word < _uniqueIdWords; word++)
249+
{
250+
// Read from the beginning of the flash region
251+
// Other flash reads are not allowed while reading the unique id
252+
value.push_back(_samba.readWord(addr + word * 4));
253+
}
254+
255+
// End read
256+
writeFCR0(EEFC_FCMD_SPUI, 0);
257+
258+
waitFSR();
259+
return value;
260+
}
261+
223262
void
224263
EefcFlash::writeOptions()
225264
{

src/EefcFlash.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class EefcFlash : public Flash
4444
uint32_t size,
4545
uint32_t planes,
4646
uint32_t lockRegions,
47+
uint32_t uniqueIdWords,
4748
uint32_t user,
4849
uint32_t stack,
4950
uint32_t regs,
@@ -66,6 +67,8 @@ class EefcFlash : public Flash
6667
bool getBootFlash();
6768
bool canBootFlash() { return true; }
6869

70+
std::vector<uint32_t> getUniqueId();
71+
6972
void writeOptions();
7073

7174
void writePage(uint32_t page);
@@ -75,6 +78,7 @@ class EefcFlash : public Flash
7578

7679
private:
7780
uint32_t _regs;
81+
uint32_t _uniqueIdWords;
7882
bool _canBrownout;
7983
bool _eraseAuto;
8084

src/EfcFlash.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ class EfcFlash : public Flash
6565
bool getBootFlash();
6666
bool canBootFlash() { return _canBootFlash; }
6767

68+
std::vector<uint32_t> getUniqueId() { return std::vector<uint32_t>(); }
69+
6870
void writeOptions();
6971

7072
void writePage(uint32_t page);

0 commit comments

Comments
 (0)