Add LPC8Nxx and NHS3xx support.
[openocd.git] / src / flash / nor / lpc2000.c
1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
4 * *
5 * LPC1700 support Copyright (C) 2009 by Audrius Urmanavicius *
6 * didele.deze@gmail.com *
7 * *
8 * LPC1100 variant and auto-probing support Copyright (C) 2014 *
9 * by Cosmin Gorgovan cosmin [at] linux-geek [dot] org *
10 * *
11 * LPC800/LPC1500/LPC54100 support Copyright (C) 2013/2014 *
12 * by Nemui Trinomius *
13 * nemuisan_kawausogasuki@live.jp *
14 * *
15 * LPC8N04/HNS31xx support Copyright (C) 2018 *
16 * by Jean-Christian de Rivaz jcdr [at] innodelec [dot] ch *
17 * *
18 * This program is free software; you can redistribute it and/or modify *
19 * it under the terms of the GNU General Public License as published by *
20 * the Free Software Foundation; either version 2 of the License, or *
21 * (at your option) any later version. *
22 * *
23 * This program is distributed in the hope that it will be useful, *
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
26 * GNU General Public License for more details. *
27 * *
28 * You should have received a copy of the GNU General Public License *
29 * along with this program. If not, see <http://www.gnu.org/licenses/>. *
30 ***************************************************************************/
31
32 #ifdef HAVE_CONFIG_H
33 #include "config.h"
34 #endif
35
36 #include "imp.h"
37 #include <helper/binarybuffer.h>
38 #include <target/algorithm.h>
39 #include <target/arm_opcodes.h>
40 #include <target/armv7m.h>
41
42 /**
43 * @file
44 * flash programming support for NXP LPC8xx,LPC1xxx,LPC4xxx,LP5410x,LPC2xxx and NHS31xx devices.
45 *
46 * @todo Provide a way to update CCLK after declaring the flash bank. The value which is correct after chip reset will
47 * rarely still work right after the clocks switch to use the PLL (e.g. 4MHz --> 100 MHz).
48 */
49 /*
50 * currently supported devices:
51 * variant 1 (lpc2000_v1):
52 * - 2104 | 5 | 6
53 * - 2114 | 9
54 * - 2124 | 9
55 * - 2194
56 * - 2212 | 4
57 * - 2292 | 4
58 *
59 * variant 2 (lpc2000_v2):
60 * - 213x
61 * - 214x
62 * - 2101 | 2 | 3
63 * - 2364 | 6 | 8
64 * - 2378
65 *
66 * lpc1700:
67 * - 175x
68 * - 176x (tested with LPC1768)
69 * - 177x
70 * - 178x (tested with LPC1788)
71 *
72 * lpc4000: (lpc1700's alias)
73 * - 407x
74 * - 408x (tested with LPC4088)
75 *
76 * lpc4300: (also available as lpc1800 - alias)
77 * - 43x2 | 3 | 5 | 7 (tested with LPC4337/LPC4357)
78 * - 18x2 | 3 | 5 | 7
79 *
80 * lpc800:
81 * - 810 | 1 | 2 (tested with LPC810/LPC811/LPC812)
82 * - 822 | 4 (tested with LPC824)
83 * - 8N04
84 * - NHS31xx (tested with NHS3100)
85 *
86 * lpc1100:
87 * - 11xx
88 * - 11Axx
89 * - 11Cxx
90 * - 11Dxx
91 * - 11Exx
92 * - 11Uxx (tested with LPC11U34)
93 * - 131x
94 * - 134x
95 *
96 * lpc1500:
97 * - 15x7 | 8 | 9 (tested with LPC1549)
98 *
99 * lpc54100:
100 * - 54101 | 2 (tested with LPC54102)
101 *
102 * The auto variant auto-detects parts from the following series:
103 * - 11xx
104 * - 11Axx
105 * - 11Cxx
106 * - 11Dxx
107 * - 11Exx
108 * - 11Uxx
109 * - 131x
110 * - 134x
111 * - 175x
112 * - 176x
113 * - 177x
114 * - 178x
115 * - 407x
116 * - 408x
117 * - 81x
118 * - 82x
119 * - 8N04
120 * - NHS31xx
121 */
122
123 /* Part IDs for autodetection */
124 /* A script which can automatically extract part ids from user manuals is available here:
125 * https://github.com/lgeek/lpc_part_ids
126 */
127 #define LPC1110_1 0x0A07102B
128 #define LPC1110_2 0x1A07102B
129 #define LPC1111_002_1 0x0A16D02B
130 #define LPC1111_002_2 0x1A16D02B
131 #define LPC1111_101_1 0x041E502B
132 #define LPC1111_101_2 0x2516D02B
133 #define LPC1111_103_1 0x00010013
134 #define LPC1111_201_1 0x0416502B
135 #define LPC1111_201_2 0x2516902B
136 #define LPC1111_203_1 0x00010012
137 #define LPC1112_101_1 0x042D502B
138 #define LPC1112_101_2 0x2524D02B
139 #define LPC1112_102_1 0x0A24902B
140 #define LPC1112_102_2 0x1A24902B
141 #define LPC1112_103_1 0x00020023
142 #define LPC1112_201_1 0x0425502B
143 #define LPC1112_201_2 0x2524902B
144 #define LPC1112_203_1 0x00020022
145 #define LPC1113_201_1 0x0434502B
146 #define LPC1113_201_2 0x2532902B
147 #define LPC1113_203_1 0x00030032
148 #define LPC1113_301_1 0x0434102B
149 #define LPC1113_301_2 0x2532102B
150 #define LPC1113_303_1 0x00030030
151 #define LPC1114_102_1 0x0A40902B
152 #define LPC1114_102_2 0x1A40902B
153 #define LPC1114_201_1 0x0444502B
154 #define LPC1114_201_2 0x2540902B
155 #define LPC1114_203_1 0x00040042
156 #define LPC1114_301_1 0x0444102B
157 #define LPC1114_301_2 0x2540102B
158 #define LPC1114_303_1 0x00040040
159 #define LPC1114_323_1 0x00040060
160 #define LPC1114_333_1 0x00040070
161 #define LPC1115_303_1 0x00050080
162
163 #define LPC11A02_1 0x4D4C802B
164 #define LPC11A04_1 0x4D80002B
165 #define LPC11A11_001_1 0x455EC02B
166 #define LPC11A12_101_1 0x4574802B
167 #define LPC11A13_201_1 0x458A402B
168 #define LPC11A14_301_1 0x35A0002B
169 #define LPC11A14_301_2 0x45A0002B
170
171 #define LPC11C12_301_1 0x1421102B
172 #define LPC11C14_301_1 0x1440102B
173 #define LPC11C22_301_1 0x1431102B
174 #define LPC11C24_301_1 0x1430102B
175
176 #define LPC11E11_101 0x293E902B
177 #define LPC11E12_201 0x2954502B
178 #define LPC11E13_301 0x296A102B
179 #define LPC11E14_401 0x2980102B
180 #define LPC11E36_501 0x00009C41
181 #define LPC11E37_401 0x00007C45
182 #define LPC11E37_501 0x00007C41
183
184 #define LPC11U12_201_1 0x095C802B
185 #define LPC11U12_201_2 0x295C802B
186 #define LPC11U13_201_1 0x097A802B
187 #define LPC11U13_201_2 0x297A802B
188 #define LPC11U14_201_1 0x0998802B
189 #define LPC11U14_201_2 0x2998802B
190 #define LPC11U23_301 0x2972402B
191 #define LPC11U24_301 0x2988402B
192 #define LPC11U24_401 0x2980002B
193 #define LPC11U34_311 0x0003D440
194 #define LPC11U34_421 0x0001CC40
195 #define LPC11U35_401 0x0001BC40
196 #define LPC11U35_501 0x0000BC40
197 #define LPC11U36_401 0x00019C40
198 #define LPC11U37_401 0x00017C40
199 #define LPC11U37H_401 0x00007C44
200 #define LPC11U37_501 0x00007C40
201
202 #define LPC11E66 0x0000DCC1
203 #define LPC11E67 0x0000BC81
204 #define LPC11E68 0x00007C01
205
206 #define LPC11U66 0x0000DCC8
207 #define LPC11U67_1 0x0000BC88
208 #define LPC11U67_2 0x0000BC80
209 #define LPC11U68_1 0x00007C08
210 #define LPC11U68_2 0x00007C00
211
212 #define LPC1311 0x2C42502B
213 #define LPC1311_1 0x1816902B
214 #define LPC1313 0x2C40102B
215 #define LPC1313_1 0x1830102B
216 #define LPC1315 0x3A010523
217 #define LPC1316 0x1A018524
218 #define LPC1317 0x1A020525
219 #define LPC1342 0x3D01402B
220 #define LPC1343 0x3D00002B
221 #define LPC1343_1 0x3000002B
222 #define LPC1345 0x28010541
223 #define LPC1346 0x08018542
224 #define LPC1347 0x08020543
225
226 #define LPC1751_1 0x25001110
227 #define LPC1751_2 0x25001118
228 #define LPC1752 0x25001121
229 #define LPC1754 0x25011722
230 #define LPC1756 0x25011723
231 #define LPC1758 0x25013F37
232 #define LPC1759 0x25113737
233 #define LPC1763 0x26012033
234 #define LPC1764 0x26011922
235 #define LPC1765 0x26013733
236 #define LPC1766 0x26013F33
237 #define LPC1767 0x26012837
238 #define LPC1768 0x26013F37
239 #define LPC1769 0x26113F37
240 #define LPC1774 0x27011132
241 #define LPC1776 0x27191F43
242 #define LPC1777 0x27193747
243 #define LPC1778 0x27193F47
244 #define LPC1785 0x281D1743
245 #define LPC1786 0x281D1F43
246 #define LPC1787 0x281D3747
247 #define LPC1788 0x281D3F47
248
249 #define LPC4072 0x47011121
250 #define LPC4074 0x47011132
251 #define LPC4076 0x47191F43
252 #define LPC4078 0x47193F47
253 #define LPC4088 0x481D3F47
254
255 #define LPC810_021 0x00008100
256 #define LPC811_001 0x00008110
257 #define LPC812_101 0x00008120
258 #define LPC812_101_1 0x00008121
259 #define LPC812_101_2 0x00008122
260 #define LPC812_101_3 0x00008123
261
262 #define LPC822_101 0x00008221
263 #define LPC822_101_1 0x00008222
264 #define LPC824_201 0x00008241
265 #define LPC824_201_1 0x00008242
266
267 #define LPC8N04 0x00008A04
268 #define NHS3100 0x4e310020
269 #define NHS3152 0x4e315220
270 #define NHS3153 0x4e315320 /* Only specified in Rev.1 of the datasheet */
271
272 #define IAP_CODE_LEN 0x34
273
274 #define LPC11xx_REG_SECTORS 24
275
276 typedef enum {
277 lpc2000_v1,
278 lpc2000_v2,
279 lpc1700,
280 lpc4300,
281 lpc800,
282 lpc1100,
283 lpc1500,
284 lpc54100,
285 lpc_auto,
286 } lpc2000_variant;
287
288 struct lpc2000_flash_bank {
289 lpc2000_variant variant;
290 uint32_t cclk;
291 int cmd51_dst_boundary;
292 int calc_checksum;
293 uint32_t cmd51_max_buffer;
294 int checksum_vector;
295 uint32_t iap_max_stack;
296 uint32_t lpc4300_bank;
297 bool probed;
298 };
299
300 enum lpc2000_status_codes {
301 LPC2000_CMD_SUCCESS = 0,
302 LPC2000_INVALID_COMMAND = 1,
303 LPC2000_SRC_ADDR_ERROR = 2,
304 LPC2000_DST_ADDR_ERROR = 3,
305 LPC2000_SRC_ADDR_NOT_MAPPED = 4,
306 LPC2000_DST_ADDR_NOT_MAPPED = 5,
307 LPC2000_COUNT_ERROR = 6,
308 LPC2000_INVALID_SECTOR = 7,
309 LPC2000_SECTOR_NOT_BLANK = 8,
310 LPC2000_SECTOR_NOT_PREPARED = 9,
311 LPC2000_COMPARE_ERROR = 10,
312 LPC2000_BUSY = 11,
313 LPC2000_PARAM_ERROR = 12,
314 LPC2000_ADDR_ERROR = 13,
315 LPC2000_ADDR_NOT_MAPPED = 14,
316 LPC2000_CMD_NOT_LOCKED = 15,
317 LPC2000_INVALID_CODE = 16,
318 LPC2000_INVALID_BAUD_RATE = 17,
319 LPC2000_INVALID_STOP_BIT = 18,
320 LPC2000_CRP_ENABLED = 19,
321 LPC2000_INVALID_FLASH_UNIT = 20,
322 LPC2000_USER_CODE_CHECKSUM = 21,
323 LCP2000_ERROR_SETTING_ACTIVE_PARTITION = 22,
324 };
325
326 static int lpc2000_build_sector_list(struct flash_bank *bank)
327 {
328 struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
329 uint32_t offset = 0;
330
331 /* default to a 4096 write buffer */
332 lpc2000_info->cmd51_max_buffer = 4096;
333
334 if (lpc2000_info->variant == lpc2000_v1) {
335 lpc2000_info->cmd51_dst_boundary = 512;
336 lpc2000_info->checksum_vector = 5;
337 lpc2000_info->iap_max_stack = 128;
338
339 /* variant 1 has different layout for 128kb and 256kb flashes */
340 if (bank->size == 128 * 1024) {
341 bank->num_sectors = 16;
342 bank->sectors = malloc(sizeof(struct flash_sector) * 16);
343 for (int i = 0; i < 16; i++) {
344 bank->sectors[i].offset = offset;
345 bank->sectors[i].size = 8 * 1024;
346 offset += bank->sectors[i].size;
347 bank->sectors[i].is_erased = -1;
348 bank->sectors[i].is_protected = 1;
349 }
350 } else if (bank->size == 256 * 1024) {
351 bank->num_sectors = 18;
352 bank->sectors = malloc(sizeof(struct flash_sector) * 18);
353
354 for (int i = 0; i < 8; i++) {
355 bank->sectors[i].offset = offset;
356 bank->sectors[i].size = 8 * 1024;
357 offset += bank->sectors[i].size;
358 bank->sectors[i].is_erased = -1;
359 bank->sectors[i].is_protected = 1;
360 }
361 for (int i = 8; i < 10; i++) {
362 bank->sectors[i].offset = offset;
363 bank->sectors[i].size = 64 * 1024;
364 offset += bank->sectors[i].size;
365 bank->sectors[i].is_erased = -1;
366 bank->sectors[i].is_protected = 1;
367 }
368 for (int i = 10; i < 18; i++) {
369 bank->sectors[i].offset = offset;
370 bank->sectors[i].size = 8 * 1024;
371 offset += bank->sectors[i].size;
372 bank->sectors[i].is_erased = -1;
373 bank->sectors[i].is_protected = 1;
374 }
375 } else {
376 LOG_ERROR("BUG: unknown bank->size encountered");
377 exit(-1);
378 }
379 } else if (lpc2000_info->variant == lpc2000_v2) {
380 lpc2000_info->cmd51_dst_boundary = 256;
381 lpc2000_info->checksum_vector = 5;
382 lpc2000_info->iap_max_stack = 128;
383
384 /* variant 2 has a uniform layout, only number of sectors differs */
385 switch (bank->size) {
386 case 4 * 1024:
387 lpc2000_info->cmd51_max_buffer = 1024;
388 bank->num_sectors = 1;
389 break;
390 case 8 * 1024:
391 lpc2000_info->cmd51_max_buffer = 1024;
392 bank->num_sectors = 2;
393 break;
394 case 16 * 1024:
395 bank->num_sectors = 4;
396 break;
397 case 32 * 1024:
398 bank->num_sectors = 8;
399 break;
400 case 64 * 1024:
401 bank->num_sectors = 9;
402 break;
403 case 128 * 1024:
404 bank->num_sectors = 11;
405 break;
406 case 256 * 1024:
407 bank->num_sectors = 15;
408 break;
409 case 500 * 1024:
410 bank->num_sectors = 27;
411 break;
412 case 512 * 1024:
413 case 504 * 1024:
414 bank->num_sectors = 28;
415 break;
416 default:
417 LOG_ERROR("BUG: unknown bank->size encountered");
418 exit(-1);
419 break;
420 }
421
422 bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
423
424 for (int i = 0; i < bank->num_sectors; i++) {
425 if (i < 8) {
426 bank->sectors[i].offset = offset;
427 bank->sectors[i].size = 4 * 1024;
428 offset += bank->sectors[i].size;
429 bank->sectors[i].is_erased = -1;
430 bank->sectors[i].is_protected = 1;
431 } else if (i < 22) {
432 bank->sectors[i].offset = offset;
433 bank->sectors[i].size = 32 * 1024;
434 offset += bank->sectors[i].size;
435 bank->sectors[i].is_erased = -1;
436 bank->sectors[i].is_protected = 1;
437 } else if (i < 28) {
438 bank->sectors[i].offset = offset;
439 bank->sectors[i].size = 4 * 1024;
440 offset += bank->sectors[i].size;
441 bank->sectors[i].is_erased = -1;
442 bank->sectors[i].is_protected = 1;
443 }
444 }
445 } else if (lpc2000_info->variant == lpc1700) {
446 lpc2000_info->cmd51_dst_boundary = 256;
447 lpc2000_info->checksum_vector = 7;
448 lpc2000_info->iap_max_stack = 128;
449
450 switch (bank->size) {
451 case 4 * 1024:
452 lpc2000_info->cmd51_max_buffer = 256;
453 bank->num_sectors = 1;
454 break;
455 case 8 * 1024:
456 lpc2000_info->cmd51_max_buffer = 512;
457 bank->num_sectors = 2;
458 break;
459 case 16 * 1024:
460 lpc2000_info->cmd51_max_buffer = 512;
461 bank->num_sectors = 4;
462 break;
463 case 32 * 1024:
464 lpc2000_info->cmd51_max_buffer = 1024;
465 bank->num_sectors = 8;
466 break;
467 case 64 * 1024:
468 bank->num_sectors = 16;
469 break;
470 case 128 * 1024:
471 bank->num_sectors = 18;
472 break;
473 case 256 * 1024:
474 bank->num_sectors = 22;
475 break;
476 case 512 * 1024:
477 bank->num_sectors = 30;
478 break;
479 default:
480 LOG_ERROR("BUG: unknown bank->size encountered");
481 exit(-1);
482 }
483
484 bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
485
486 for (int i = 0; i < bank->num_sectors; i++) {
487 bank->sectors[i].offset = offset;
488 /* sectors 0-15 are 4kB-sized, 16 and above are 32kB-sized for LPC17xx/LPC40xx devices */
489 bank->sectors[i].size = (i < 16) ? 4 * 1024 : 32 * 1024;
490 offset += bank->sectors[i].size;
491 bank->sectors[i].is_erased = -1;
492 bank->sectors[i].is_protected = 1;
493 }
494 } else if (lpc2000_info->variant == lpc4300) {
495 lpc2000_info->cmd51_dst_boundary = 512;
496 lpc2000_info->checksum_vector = 7;
497 lpc2000_info->iap_max_stack = 208;
498
499 switch (bank->size) {
500 case 256 * 1024:
501 bank->num_sectors = 11;
502 break;
503 case 384 * 1024:
504 bank->num_sectors = 13;
505 break;
506 case 512 * 1024:
507 bank->num_sectors = 15;
508 break;
509 default:
510 LOG_ERROR("BUG: unknown bank->size encountered");
511 exit(-1);
512 }
513
514 bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
515
516 for (int i = 0; i < bank->num_sectors; i++) {
517 bank->sectors[i].offset = offset;
518 /* sectors 0-7 are 8kB-sized, 8 and above are 64kB-sized for LPC43xx devices */
519 bank->sectors[i].size = (i < 8) ? 8 * 1024 : 64 * 1024;
520 offset += bank->sectors[i].size;
521 bank->sectors[i].is_erased = -1;
522 bank->sectors[i].is_protected = 1;
523 }
524
525 } else if (lpc2000_info->variant == lpc800) {
526 lpc2000_info->cmd51_dst_boundary = 64;
527 lpc2000_info->checksum_vector = 7;
528 lpc2000_info->iap_max_stack = 208; /* 148byte for LPC81x,208byte for LPC82x. */
529 lpc2000_info->cmd51_max_buffer = 256; /* smallest MCU in the series, LPC810, has 1 kB of SRAM */
530
531 switch (bank->size) {
532 case 4 * 1024:
533 bank->num_sectors = 4;
534 break;
535 case 8 * 1024:
536 bank->num_sectors = 8;
537 break;
538 case 16 * 1024:
539 bank->num_sectors = 16;
540 break;
541 case 30 * 1024:
542 lpc2000_info->cmd51_max_buffer = 1024; /* For LPC8N04 and NHS31xx, have 8kB of SRAM */
543 bank->num_sectors = 30; /* There have only 30kB of writable Flash out of 32kB */
544 break;
545 case 32 * 1024:
546 lpc2000_info->cmd51_max_buffer = 1024; /* For LPC824, has 8kB of SRAM */
547 bank->num_sectors = 32;
548 break;
549 default:
550 LOG_ERROR("BUG: unknown bank->size encountered");
551 exit(-1);
552 }
553
554 bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
555
556 for (int i = 0; i < bank->num_sectors; i++) {
557 bank->sectors[i].offset = offset;
558 /* all sectors are 1kB-sized for LPC8xx devices */
559 bank->sectors[i].size = 1 * 1024;
560 offset += bank->sectors[i].size;
561 bank->sectors[i].is_erased = -1;
562 bank->sectors[i].is_protected = 1;
563 }
564
565 } else if (lpc2000_info->variant == lpc1100) {
566 lpc2000_info->cmd51_dst_boundary = 256;
567 lpc2000_info->checksum_vector = 7;
568 lpc2000_info->iap_max_stack = 128;
569
570 if ((bank->size % (4 * 1024)) != 0) {
571 LOG_ERROR("BUG: unknown bank->size encountered,\nLPC1100 flash size must be a multiple of 4096");
572 exit(-1);
573 }
574 lpc2000_info->cmd51_max_buffer = 512; /* smallest MCU in the series, LPC1110, has 1 kB of SRAM */
575 unsigned int large_sectors = 0;
576 unsigned int normal_sectors = bank->size / 4096;
577
578 if (normal_sectors > LPC11xx_REG_SECTORS) {
579 large_sectors = (normal_sectors - LPC11xx_REG_SECTORS) / 8;
580 normal_sectors = LPC11xx_REG_SECTORS;
581 }
582
583 bank->num_sectors = normal_sectors + large_sectors;
584
585 bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
586
587 for (int i = 0; i < bank->num_sectors; i++) {
588 bank->sectors[i].offset = offset;
589 bank->sectors[i].size = (i < LPC11xx_REG_SECTORS ? 4 : 32) * 1024;
590 offset += bank->sectors[i].size;
591 bank->sectors[i].is_erased = -1;
592 bank->sectors[i].is_protected = 1;
593 }
594
595 } else if (lpc2000_info->variant == lpc1500) {
596 lpc2000_info->cmd51_dst_boundary = 256;
597 lpc2000_info->checksum_vector = 7;
598 lpc2000_info->iap_max_stack = 128;
599
600 switch (bank->size) {
601 case 64 * 1024:
602 bank->num_sectors = 16;
603 break;
604 case 128 * 1024:
605 bank->num_sectors = 32;
606 break;
607 case 256 * 1024:
608 bank->num_sectors = 64;
609 break;
610 default:
611 LOG_ERROR("BUG: unknown bank->size encountered");
612 exit(-1);
613 }
614
615 bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
616
617 for (int i = 0; i < bank->num_sectors; i++) {
618 bank->sectors[i].offset = offset;
619 /* all sectors are 4kB-sized */
620 bank->sectors[i].size = 4 * 1024;
621 offset += bank->sectors[i].size;
622 bank->sectors[i].is_erased = -1;
623 bank->sectors[i].is_protected = 1;
624 }
625
626 } else if (lpc2000_info->variant == lpc54100) {
627 lpc2000_info->cmd51_dst_boundary = 256;
628 lpc2000_info->checksum_vector = 7;
629 lpc2000_info->iap_max_stack = 128;
630
631 switch (bank->size) {
632 case 256 * 1024:
633 bank->num_sectors = 8;
634 break;
635 case 512 * 1024:
636 bank->num_sectors = 16;
637 break;
638 default:
639 LOG_ERROR("BUG: unknown bank->size encountered");
640 exit(-1);
641 }
642
643 bank->sectors = malloc(sizeof(struct flash_sector) * bank->num_sectors);
644
645 for (int i = 0; i < bank->num_sectors; i++) {
646 bank->sectors[i].offset = offset;
647 /* all sectors are 32kB-sized */
648 bank->sectors[i].size = 32 * 1024;
649 offset += bank->sectors[i].size;
650 bank->sectors[i].is_erased = -1;
651 bank->sectors[i].is_protected = 1;
652 }
653
654 } else {
655 LOG_ERROR("BUG: unknown lpc2000_info->variant encountered");
656 exit(-1);
657 }
658
659 return ERROR_OK;
660 }
661
662 /* this function allocates and initializes working area used for IAP algorithm
663 * uses 52 + max IAP stack bytes working area
664 * 0x0 to 0x7: jump gate (BX to thumb state, b -2 to wait)
665 * 0x8 to 0x1f: command parameter table (1+5 words)
666 * 0x20 to 0x33: command result table (1+4 words)
667 * 0x34 to 0xb3|0x104: stack
668 * (128b needed for lpc1xxx/2000/5410x, 208b for lpc43xx/lpc82x and 148b for lpc81x)
669 */
670
671 static int lpc2000_iap_working_area_init(struct flash_bank *bank, struct working_area **iap_working_area)
672 {
673 struct target *target = bank->target;
674 struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
675
676 if (target_alloc_working_area(target, IAP_CODE_LEN + lpc2000_info->iap_max_stack, iap_working_area) != ERROR_OK) {
677 LOG_ERROR("no working area specified, can't write LPC2000 internal flash");
678 return ERROR_FLASH_OPERATION_FAILED;
679 }
680
681 uint8_t jump_gate[8];
682
683 /* write IAP code to working area */
684 switch (lpc2000_info->variant) {
685 case lpc800:
686 case lpc1100:
687 case lpc1500:
688 case lpc1700:
689 case lpc4300:
690 case lpc54100:
691 case lpc_auto:
692 target_buffer_set_u32(target, jump_gate, ARMV4_5_T_BX(12));
693 target_buffer_set_u32(target, jump_gate + 4, ARMV5_T_BKPT(0));
694 break;
695 case lpc2000_v1:
696 case lpc2000_v2:
697 target_buffer_set_u32(target, jump_gate, ARMV4_5_BX(12));
698 target_buffer_set_u32(target, jump_gate + 4, ARMV4_5_B(0xfffffe, 0));
699 break;
700 default:
701 LOG_ERROR("BUG: unknown lpc2000_info->variant encountered");
702 exit(-1);
703 }
704
705 int retval = target_write_memory(target, (*iap_working_area)->address, 4, 2, jump_gate);
706 if (retval != ERROR_OK) {
707 LOG_ERROR("Write memory at address 0x%8.8" TARGET_PRIxADDR " failed (check work_area definition)",
708 (*iap_working_area)->address);
709 target_free_working_area(target, *iap_working_area);
710 }
711
712 return retval;
713 }
714
715 /* call LPC8xx/LPC1xxx/LPC4xxx/LPC5410x/LPC2000 IAP function */
716
717 static int lpc2000_iap_call(struct flash_bank *bank, struct working_area *iap_working_area, int code,
718 uint32_t param_table[5], uint32_t result_table[4])
719 {
720 struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
721 struct target *target = bank->target;
722
723 struct arm_algorithm arm_algo; /* for LPC2000 */
724 struct armv7m_algorithm armv7m_info; /* for LPC8xx/LPC1xxx/LPC4xxx/LPC5410x */
725 uint32_t iap_entry_point = 0; /* to make compiler happier */
726
727 switch (lpc2000_info->variant) {
728 case lpc800:
729 case lpc1100:
730 case lpc1700:
731 case lpc_auto:
732 armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
733 armv7m_info.core_mode = ARM_MODE_THREAD;
734 iap_entry_point = 0x1fff1ff1;
735 break;
736 case lpc1500:
737 case lpc54100:
738 armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
739 armv7m_info.core_mode = ARM_MODE_THREAD;
740 iap_entry_point = 0x03000205;
741 break;
742 case lpc2000_v1:
743 case lpc2000_v2:
744 arm_algo.common_magic = ARM_COMMON_MAGIC;
745 arm_algo.core_mode = ARM_MODE_SVC;
746 arm_algo.core_state = ARM_STATE_ARM;
747 iap_entry_point = 0x7ffffff1;
748 break;
749 case lpc4300:
750 armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
751 armv7m_info.core_mode = ARM_MODE_THREAD;
752 /* read out IAP entry point from ROM driver table at 0x10400100 */
753 target_read_u32(target, 0x10400100, &iap_entry_point);
754 break;
755 default:
756 LOG_ERROR("BUG: unknown lpc2000->variant encountered");
757 exit(-1);
758 }
759
760 struct mem_param mem_params[2];
761
762 /* command parameter table */
763 init_mem_param(&mem_params[0], iap_working_area->address + 8, 6 * 4, PARAM_OUT);
764 target_buffer_set_u32(target, mem_params[0].value, code);
765 target_buffer_set_u32(target, mem_params[0].value + 0x04, param_table[0]);
766 target_buffer_set_u32(target, mem_params[0].value + 0x08, param_table[1]);
767 target_buffer_set_u32(target, mem_params[0].value + 0x0c, param_table[2]);
768 target_buffer_set_u32(target, mem_params[0].value + 0x10, param_table[3]);
769 target_buffer_set_u32(target, mem_params[0].value + 0x14, param_table[4]);
770
771 struct reg_param reg_params[5];
772
773 init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
774 buf_set_u32(reg_params[0].value, 0, 32, iap_working_area->address + 0x08);
775
776 /* command result table */
777 init_mem_param(&mem_params[1], iap_working_area->address + 0x20, 5 * 4, PARAM_IN);
778
779 init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
780 buf_set_u32(reg_params[1].value, 0, 32, iap_working_area->address + 0x20);
781
782 /* IAP entry point */
783 init_reg_param(&reg_params[2], "r12", 32, PARAM_OUT);
784 buf_set_u32(reg_params[2].value, 0, 32, iap_entry_point);
785
786 switch (lpc2000_info->variant) {
787 case lpc800:
788 case lpc1100:
789 case lpc1500:
790 case lpc1700:
791 case lpc4300:
792 case lpc54100:
793 case lpc_auto:
794 /* IAP stack */
795 init_reg_param(&reg_params[3], "sp", 32, PARAM_OUT);
796 buf_set_u32(reg_params[3].value, 0, 32,
797 iap_working_area->address + IAP_CODE_LEN + lpc2000_info->iap_max_stack);
798
799 /* return address */
800 init_reg_param(&reg_params[4], "lr", 32, PARAM_OUT);
801 buf_set_u32(reg_params[4].value, 0, 32, (iap_working_area->address + 0x04) | 1);
802 /* bit0 of LR = 1 to return in Thumb mode */
803
804 target_run_algorithm(target, 2, mem_params, 5, reg_params, iap_working_area->address, 0, 10000,
805 &armv7m_info);
806 break;
807 case lpc2000_v1:
808 case lpc2000_v2:
809 /* IAP stack */
810 init_reg_param(&reg_params[3], "sp_svc", 32, PARAM_OUT);
811 buf_set_u32(reg_params[3].value, 0, 32,
812 iap_working_area->address + IAP_CODE_LEN + lpc2000_info->iap_max_stack);
813
814 /* return address */
815 init_reg_param(&reg_params[4], "lr_svc", 32, PARAM_OUT);
816 buf_set_u32(reg_params[4].value, 0, 32, iap_working_area->address + 0x04);
817
818 target_run_algorithm(target, 2, mem_params, 5, reg_params, iap_working_area->address,
819 iap_working_area->address + 0x4, 10000, &arm_algo);
820 break;
821 default:
822 LOG_ERROR("BUG: unknown lpc2000->variant encountered");
823 exit(-1);
824 }
825
826 int status_code = target_buffer_get_u32(target, mem_params[1].value);
827 result_table[0] = target_buffer_get_u32(target, mem_params[1].value + 0x04);
828 result_table[1] = target_buffer_get_u32(target, mem_params[1].value + 0x08);
829 result_table[2] = target_buffer_get_u32(target, mem_params[1].value + 0x0c);
830 result_table[3] = target_buffer_get_u32(target, mem_params[1].value + 0x10);
831
832 LOG_DEBUG("IAP command = %i (0x%8.8" PRIx32 ", 0x%8.8" PRIx32 ", 0x%8.8" PRIx32 ", 0x%8.8" PRIx32 ", 0x%8.8" PRIx32
833 ") completed with result = %8.8x",
834 code, param_table[0], param_table[1], param_table[2], param_table[3], param_table[4], status_code);
835
836 destroy_mem_param(&mem_params[0]);
837 destroy_mem_param(&mem_params[1]);
838
839 destroy_reg_param(&reg_params[0]);
840 destroy_reg_param(&reg_params[1]);
841 destroy_reg_param(&reg_params[2]);
842 destroy_reg_param(&reg_params[3]);
843 destroy_reg_param(&reg_params[4]);
844
845 return status_code;
846 }
847
848 static int lpc2000_iap_blank_check(struct flash_bank *bank, int first, int last)
849 {
850 if ((first < 0) || (last >= bank->num_sectors))
851 return ERROR_FLASH_SECTOR_INVALID;
852
853 uint32_t param_table[5] = {0};
854 uint32_t result_table[4];
855 struct working_area *iap_working_area;
856
857 int retval = lpc2000_iap_working_area_init(bank, &iap_working_area);
858
859 if (retval != ERROR_OK)
860 return retval;
861
862 struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
863 if (lpc2000_info->variant == lpc4300)
864 param_table[2] = lpc2000_info->lpc4300_bank;
865
866 for (int i = first; i <= last && retval == ERROR_OK; i++) {
867 /* check single sector */
868 param_table[0] = param_table[1] = i;
869 int status_code = lpc2000_iap_call(bank, iap_working_area, 53, param_table, result_table);
870
871 switch (status_code) {
872 case ERROR_FLASH_OPERATION_FAILED:
873 retval = ERROR_FLASH_OPERATION_FAILED;
874 break;
875 case LPC2000_CMD_SUCCESS:
876 bank->sectors[i].is_erased = 1;
877 break;
878 case LPC2000_SECTOR_NOT_BLANK:
879 bank->sectors[i].is_erased = 0;
880 break;
881 case LPC2000_INVALID_SECTOR:
882 bank->sectors[i].is_erased = 0;
883 break;
884 case LPC2000_BUSY:
885 retval = ERROR_FLASH_BUSY;
886 break;
887 default:
888 LOG_ERROR("BUG: unknown LPC2000 status code %i", status_code);
889 exit(-1);
890 }
891 }
892
893 struct target *target = bank->target;
894 target_free_working_area(target, iap_working_area);
895
896 return retval;
897 }
898
899 /*
900 * flash bank lpc2000 <base> <size> 0 0 <target#> <lpc_variant> <cclk> [calc_checksum]
901 */
902 FLASH_BANK_COMMAND_HANDLER(lpc2000_flash_bank_command)
903 {
904 if (CMD_ARGC < 8)
905 return ERROR_COMMAND_SYNTAX_ERROR;
906
907 struct lpc2000_flash_bank *lpc2000_info = calloc(1, sizeof(*lpc2000_info));
908 lpc2000_info->probed = false;
909
910 bank->driver_priv = lpc2000_info;
911
912 if (strcmp(CMD_ARGV[6], "lpc2000_v1") == 0) {
913 lpc2000_info->variant = lpc2000_v1;
914 } else if (strcmp(CMD_ARGV[6], "lpc2000_v2") == 0) {
915 lpc2000_info->variant = lpc2000_v2;
916 } else if (strcmp(CMD_ARGV[6], "lpc1700") == 0 || strcmp(CMD_ARGV[6], "lpc4000") == 0) {
917 lpc2000_info->variant = lpc1700;
918 } else if (strcmp(CMD_ARGV[6], "lpc1800") == 0 || strcmp(CMD_ARGV[6], "lpc4300") == 0) {
919 lpc2000_info->variant = lpc4300;
920 } else if (strcmp(CMD_ARGV[6], "lpc800") == 0) {
921 lpc2000_info->variant = lpc800;
922 } else if (strcmp(CMD_ARGV[6], "lpc1100") == 0) {
923 lpc2000_info->variant = lpc1100;
924 } else if (strcmp(CMD_ARGV[6], "lpc1500") == 0) {
925 lpc2000_info->variant = lpc1500;
926 } else if (strcmp(CMD_ARGV[6], "lpc54100") == 0) {
927 lpc2000_info->variant = lpc54100;
928 } else if (strcmp(CMD_ARGV[6], "auto") == 0) {
929 lpc2000_info->variant = lpc_auto;
930 } else {
931 LOG_ERROR("unknown LPC2000 variant: %s", CMD_ARGV[6]);
932 free(lpc2000_info);
933 return ERROR_FLASH_BANK_INVALID;
934 }
935
936 /* Maximum size required for the IAP stack.
937 This value only gets used when probing, only for auto, lpc1100 and lpc1700.
938 We use the maximum size for any part supported by the driver(!) to be safe
939 in case the auto variant is mistakenly used on a MCU from one of the series
940 for which we don't support auto-probing. */
941 lpc2000_info->iap_max_stack = 208;
942
943 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[7], lpc2000_info->cclk);
944 lpc2000_info->calc_checksum = 0;
945
946 uint32_t temp_base = 0;
947 COMMAND_PARSE_NUMBER(u32, CMD_ARGV[1], temp_base);
948 if (temp_base >= 0x1B000000)
949 lpc2000_info->lpc4300_bank = 1; /* bank B */
950 else
951 lpc2000_info->lpc4300_bank = 0; /* bank A */
952
953 if (CMD_ARGC >= 9) {
954 if (strcmp(CMD_ARGV[8], "calc_checksum") == 0)
955 lpc2000_info->calc_checksum = 1;
956 }
957
958 return ERROR_OK;
959 }
960
961 static int lpc2000_erase(struct flash_bank *bank, int first, int last)
962 {
963 if (bank->target->state != TARGET_HALTED) {
964 LOG_ERROR("Target not halted");
965 return ERROR_TARGET_NOT_HALTED;
966 }
967
968 struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
969 uint32_t param_table[5] = {0};
970
971 param_table[0] = first;
972 param_table[1] = last;
973
974 if (lpc2000_info->variant == lpc4300)
975 param_table[2] = lpc2000_info->lpc4300_bank;
976 else
977 param_table[2] = lpc2000_info->cclk;
978
979 uint32_t result_table[4];
980 struct working_area *iap_working_area;
981
982 int retval = lpc2000_iap_working_area_init(bank, &iap_working_area);
983
984 if (retval != ERROR_OK)
985 return retval;
986
987 if (lpc2000_info->variant == lpc4300)
988 /* Init IAP Anyway */
989 lpc2000_iap_call(bank, iap_working_area, 49, param_table, result_table);
990
991 /* Prepare sectors */
992 int status_code = lpc2000_iap_call(bank, iap_working_area, 50, param_table, result_table);
993 switch (status_code) {
994 case ERROR_FLASH_OPERATION_FAILED:
995 retval = ERROR_FLASH_OPERATION_FAILED;
996 break;
997 case LPC2000_CMD_SUCCESS:
998 break;
999 case LPC2000_INVALID_SECTOR:
1000 retval = ERROR_FLASH_SECTOR_INVALID;
1001 break;
1002 default:
1003 LOG_WARNING("lpc2000 prepare sectors returned %i", status_code);
1004 retval = ERROR_FLASH_OPERATION_FAILED;
1005 break;
1006 }
1007
1008 if (retval == ERROR_OK) {
1009 /* Erase sectors */
1010 param_table[2] = lpc2000_info->cclk;
1011 if (lpc2000_info->variant == lpc4300)
1012 param_table[3] = lpc2000_info->lpc4300_bank;
1013
1014 status_code = lpc2000_iap_call(bank, iap_working_area, 52, param_table, result_table);
1015 switch (status_code) {
1016 case ERROR_FLASH_OPERATION_FAILED:
1017 retval = ERROR_FLASH_OPERATION_FAILED;
1018 break;
1019 case LPC2000_CMD_SUCCESS:
1020 break;
1021 case LPC2000_INVALID_SECTOR:
1022 retval = ERROR_FLASH_SECTOR_INVALID;
1023 break;
1024 default:
1025 LOG_WARNING("lpc2000 erase sectors returned %i", status_code);
1026 retval = ERROR_FLASH_OPERATION_FAILED;
1027 break;
1028 }
1029 }
1030
1031 struct target *target = bank->target;
1032 target_free_working_area(target, iap_working_area);
1033
1034 return retval;
1035 }
1036
1037 static int lpc2000_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
1038 {
1039 struct target *target = bank->target;
1040
1041 if (bank->target->state != TARGET_HALTED) {
1042 LOG_ERROR("Target not halted");
1043 return ERROR_TARGET_NOT_HALTED;
1044 }
1045
1046 if (offset + count > bank->size)
1047 return ERROR_FLASH_DST_OUT_OF_BANK;
1048
1049 struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
1050
1051 uint32_t dst_min_alignment = lpc2000_info->cmd51_dst_boundary;
1052
1053 if (offset % dst_min_alignment) {
1054 LOG_WARNING("offset 0x%" PRIx32 " breaks required alignment 0x%" PRIx32, offset, dst_min_alignment);
1055 return ERROR_FLASH_DST_BREAKS_ALIGNMENT;
1056 }
1057
1058 int first_sector = 0;
1059 int last_sector = 0;
1060
1061 for (int i = 0; i < bank->num_sectors; i++) {
1062 if (offset >= bank->sectors[i].offset)
1063 first_sector = i;
1064 if (offset + DIV_ROUND_UP(count, dst_min_alignment) * dst_min_alignment > bank->sectors[i].offset)
1065 last_sector = i;
1066 }
1067
1068 LOG_DEBUG("first_sector: %i, last_sector: %i", first_sector, last_sector);
1069
1070 /* check if exception vectors should be flashed */
1071 if ((offset == 0) && (count >= 0x20) && lpc2000_info->calc_checksum) {
1072 assert(lpc2000_info->checksum_vector < 8);
1073 uint32_t checksum = 0;
1074 for (int i = 0; i < 8; i++) {
1075 LOG_DEBUG("Vector 0x%2.2x: 0x%8.8" PRIx32, i * 4, buf_get_u32(buffer + (i * 4), 0, 32));
1076 if (i != lpc2000_info->checksum_vector)
1077 checksum += buf_get_u32(buffer + (i * 4), 0, 32);
1078 }
1079 checksum = 0 - checksum;
1080 LOG_DEBUG("checksum: 0x%8.8" PRIx32, checksum);
1081
1082 uint32_t original_value = buf_get_u32(buffer + (lpc2000_info->checksum_vector * 4), 0, 32);
1083 if (original_value != checksum) {
1084 LOG_WARNING("Verification will fail since checksum in image (0x%8.8" PRIx32 ") to be written to flash is "
1085 "different from calculated vector checksum (0x%8.8" PRIx32 ").", original_value, checksum);
1086 LOG_WARNING("To remove this warning modify build tools on developer PC to inject correct LPC vector "
1087 "checksum.");
1088 }
1089
1090 /* FIXME: WARNING! This code is broken because it modifies the callers buffer in place. */
1091 buf_set_u32((uint8_t *)buffer + (lpc2000_info->checksum_vector * 4), 0, 32, checksum);
1092 }
1093
1094 struct working_area *iap_working_area;
1095
1096 int retval = lpc2000_iap_working_area_init(bank, &iap_working_area);
1097
1098 if (retval != ERROR_OK)
1099 return retval;
1100
1101 struct working_area *download_area;
1102
1103 /* allocate a working area */
1104 if (target_alloc_working_area(target, lpc2000_info->cmd51_max_buffer, &download_area) != ERROR_OK) {
1105 LOG_ERROR("no working area specified, can't write LPC2000 internal flash");
1106 target_free_working_area(target, iap_working_area);
1107 return ERROR_FLASH_OPERATION_FAILED;
1108 }
1109
1110 uint32_t bytes_remaining = count;
1111 uint32_t bytes_written = 0;
1112 uint32_t param_table[5] = {0};
1113 uint32_t result_table[4];
1114
1115 if (lpc2000_info->variant == lpc4300)
1116 /* Init IAP Anyway */
1117 lpc2000_iap_call(bank, iap_working_area, 49, param_table, result_table);
1118
1119 while (bytes_remaining > 0) {
1120 uint32_t thisrun_bytes;
1121 if (bytes_remaining >= lpc2000_info->cmd51_max_buffer)
1122 thisrun_bytes = lpc2000_info->cmd51_max_buffer;
1123 else
1124 thisrun_bytes = lpc2000_info->cmd51_dst_boundary;
1125
1126 /* Prepare sectors */
1127 param_table[0] = first_sector;
1128 param_table[1] = last_sector;
1129
1130 if (lpc2000_info->variant == lpc4300)
1131 param_table[2] = lpc2000_info->lpc4300_bank;
1132 else
1133 param_table[2] = lpc2000_info->cclk;
1134
1135 int status_code = lpc2000_iap_call(bank, iap_working_area, 50, param_table, result_table);
1136 switch (status_code) {
1137 case ERROR_FLASH_OPERATION_FAILED:
1138 retval = ERROR_FLASH_OPERATION_FAILED;
1139 break;
1140 case LPC2000_CMD_SUCCESS:
1141 break;
1142 case LPC2000_INVALID_SECTOR:
1143 retval = ERROR_FLASH_SECTOR_INVALID;
1144 break;
1145 default:
1146 LOG_WARNING("lpc2000 prepare sectors returned %i", status_code);
1147 retval = ERROR_FLASH_OPERATION_FAILED;
1148 break;
1149 }
1150
1151 /* Exit if error occured */
1152 if (retval != ERROR_OK)
1153 break;
1154
1155 if (bytes_remaining >= thisrun_bytes) {
1156 retval = target_write_buffer(bank->target, download_area->address, thisrun_bytes, buffer + bytes_written);
1157 if (retval != ERROR_OK) {
1158 retval = ERROR_FLASH_OPERATION_FAILED;
1159 break;
1160 }
1161 } else {
1162 uint8_t *last_buffer = malloc(thisrun_bytes);
1163 memcpy(last_buffer, buffer + bytes_written, bytes_remaining);
1164 memset(last_buffer + bytes_remaining, 0xff, thisrun_bytes - bytes_remaining);
1165 target_write_buffer(bank->target, download_area->address, thisrun_bytes, last_buffer);
1166 free(last_buffer);
1167 }
1168
1169 LOG_DEBUG("writing 0x%" PRIx32 " bytes to address 0x%" PRIx32, thisrun_bytes,
1170 bank->base + offset + bytes_written);
1171
1172 /* Write data */
1173 param_table[0] = bank->base + offset + bytes_written;
1174 param_table[1] = download_area->address;
1175 param_table[2] = thisrun_bytes;
1176 param_table[3] = lpc2000_info->cclk;
1177 status_code = lpc2000_iap_call(bank, iap_working_area, 51, param_table, result_table);
1178 switch (status_code) {
1179 case ERROR_FLASH_OPERATION_FAILED:
1180 retval = ERROR_FLASH_OPERATION_FAILED;
1181 break;
1182 case LPC2000_CMD_SUCCESS:
1183 break;
1184 case LPC2000_INVALID_SECTOR:
1185 retval = ERROR_FLASH_SECTOR_INVALID;
1186 break;
1187 default:
1188 LOG_WARNING("lpc2000 returned %i", status_code);
1189 retval = ERROR_FLASH_OPERATION_FAILED;
1190 break;
1191 }
1192
1193 /* Exit if error occured */
1194 if (retval != ERROR_OK)
1195 break;
1196
1197 if (bytes_remaining > thisrun_bytes)
1198 bytes_remaining -= thisrun_bytes;
1199 else
1200 bytes_remaining = 0;
1201 bytes_written += thisrun_bytes;
1202 }
1203
1204 target_free_working_area(target, iap_working_area);
1205 target_free_working_area(target, download_area);
1206
1207 return retval;
1208 }
1209
1210 static int get_lpc2000_part_id(struct flash_bank *bank, uint32_t *part_id)
1211 {
1212 if (bank->target->state != TARGET_HALTED) {
1213 LOG_ERROR("Target not halted");
1214 return ERROR_TARGET_NOT_HALTED;
1215 }
1216
1217 uint32_t param_table[5] = {0};
1218 uint32_t result_table[4];
1219 struct working_area *iap_working_area;
1220
1221 int retval = lpc2000_iap_working_area_init(bank, &iap_working_area);
1222
1223 if (retval != ERROR_OK)
1224 return retval;
1225
1226 /* The status seems to be bogus with the part ID command on some IAP
1227 firmwares, so ignore it. */
1228 lpc2000_iap_call(bank, iap_working_area, 54, param_table, result_table);
1229
1230 struct target *target = bank->target;
1231 target_free_working_area(target, iap_working_area);
1232
1233 /* If the result is zero, the command probably didn't work out. */
1234 if (result_table[0] == 0)
1235 return LPC2000_INVALID_COMMAND;
1236
1237 *part_id = result_table[0];
1238 return LPC2000_CMD_SUCCESS;
1239 }
1240
1241 static int lpc2000_auto_probe_flash(struct flash_bank *bank)
1242 {
1243 uint32_t part_id;
1244 int retval;
1245 struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
1246
1247 if (bank->target->state != TARGET_HALTED) {
1248 LOG_ERROR("Target not halted");
1249 return ERROR_TARGET_NOT_HALTED;
1250 }
1251
1252 retval = get_lpc2000_part_id(bank, &part_id);
1253 if (retval != LPC2000_CMD_SUCCESS) {
1254 LOG_ERROR("Could not get part ID");
1255 return retval;
1256 }
1257
1258 switch (part_id) {
1259 case LPC1110_1:
1260 case LPC1110_2:
1261 lpc2000_info->variant = lpc1100;
1262 bank->size = 4 * 1024;
1263 break;
1264
1265 case LPC1111_002_1:
1266 case LPC1111_002_2:
1267 case LPC1111_101_1:
1268 case LPC1111_101_2:
1269 case LPC1111_103_1:
1270 case LPC1111_201_1:
1271 case LPC1111_201_2:
1272 case LPC1111_203_1:
1273 case LPC11A11_001_1:
1274 case LPC11E11_101:
1275 case LPC1311:
1276 case LPC1311_1:
1277 lpc2000_info->variant = lpc1100;
1278 bank->size = 8 * 1024;
1279 break;
1280
1281 case LPC1112_101_1:
1282 case LPC1112_101_2:
1283 case LPC1112_102_1:
1284 case LPC1112_102_2:
1285 case LPC1112_103_1:
1286 case LPC1112_201_1:
1287 case LPC1112_201_2:
1288 case LPC1112_203_1:
1289 case LPC11A02_1:
1290 case LPC11C12_301_1:
1291 case LPC11C22_301_1:
1292 case LPC11A12_101_1:
1293 case LPC11E12_201:
1294 case LPC11U12_201_1:
1295 case LPC11U12_201_2:
1296 case LPC1342:
1297 lpc2000_info->variant = lpc1100;
1298 bank->size = 16 * 1024;
1299 break;
1300
1301 case LPC1113_201_1:
1302 case LPC1113_201_2:
1303 case LPC1113_203_1:
1304 case LPC1113_301_1:
1305 case LPC1113_301_2:
1306 case LPC1113_303_1:
1307 case LPC11A13_201_1:
1308 case LPC11E13_301:
1309 case LPC11U13_201_1:
1310 case LPC11U13_201_2:
1311 case LPC11U23_301:
1312 lpc2000_info->variant = lpc1100;
1313 bank->size = 24 * 1024;
1314 break;
1315
1316 case LPC1114_102_1:
1317 case LPC1114_102_2:
1318 case LPC1114_201_1:
1319 case LPC1114_201_2:
1320 case LPC1114_203_1:
1321 case LPC1114_301_1:
1322 case LPC1114_301_2:
1323 case LPC1114_303_1:
1324 case LPC11A04_1:
1325 case LPC11A14_301_1:
1326 case LPC11A14_301_2:
1327 case LPC11C14_301_1:
1328 case LPC11C24_301_1:
1329 case LPC11E14_401:
1330 case LPC11U14_201_1:
1331 case LPC11U14_201_2:
1332 case LPC11U24_301:
1333 case LPC11U24_401:
1334 case LPC1313:
1335 case LPC1313_1:
1336 case LPC1315:
1337 case LPC1343:
1338 case LPC1343_1:
1339 case LPC1345:
1340 lpc2000_info->variant = lpc1100;
1341 bank->size = 32 * 1024;
1342 break;
1343
1344 case LPC1751_1:
1345 case LPC1751_2:
1346 lpc2000_info->variant = lpc1700;
1347 bank->size = 32 * 1024;
1348 break;
1349
1350 case LPC11U34_311:
1351 lpc2000_info->variant = lpc1100;
1352 bank->size = 40 * 1024;
1353 break;
1354
1355 case LPC1114_323_1:
1356 case LPC11U34_421:
1357 case LPC1316:
1358 case LPC1346:
1359 lpc2000_info->variant = lpc1100;
1360 bank->size = 48 * 1024;
1361 break;
1362
1363 case LPC1114_333_1:
1364 lpc2000_info->variant = lpc1100;
1365 bank->size = 56 * 1024;
1366 break;
1367
1368 case LPC1115_303_1:
1369 case LPC11U35_401:
1370 case LPC11U35_501:
1371 case LPC11E66:
1372 case LPC11U66:
1373 case LPC1317:
1374 case LPC1347:
1375 lpc2000_info->variant = lpc1100;
1376 bank->size = 64 * 1024;
1377 break;
1378
1379 case LPC1752:
1380 case LPC4072:
1381 lpc2000_info->variant = lpc1700;
1382 bank->size = 64 * 1024;
1383 break;
1384
1385 case LPC11E36_501:
1386 case LPC11U36_401:
1387 lpc2000_info->variant = lpc1100;
1388 bank->size = 96 * 1024;
1389 break;
1390
1391 case LPC11E37_401:
1392 case LPC11E37_501:
1393 case LPC11U37_401:
1394 case LPC11U37H_401:
1395 case LPC11U37_501:
1396 case LPC11E67:
1397 case LPC11E68:
1398 case LPC11U67_1:
1399 case LPC11U67_2:
1400 lpc2000_info->variant = lpc1100;
1401 bank->size = 128 * 1024;
1402 break;
1403
1404 case LPC1754:
1405 case LPC1764:
1406 case LPC1774:
1407 case LPC4074:
1408 lpc2000_info->variant = lpc1700;
1409 bank->size = 128 * 1024;
1410 break;
1411
1412 case LPC11U68_1:
1413 case LPC11U68_2:
1414 lpc2000_info->variant = lpc1100;
1415 bank->size = 256 * 1024;
1416 break;
1417
1418 case LPC1756:
1419 case LPC1763:
1420 case LPC1765:
1421 case LPC1766:
1422 case LPC1776:
1423 case LPC1785:
1424 case LPC1786:
1425 case LPC4076:
1426 lpc2000_info->variant = lpc1700;
1427 bank->size = 256 * 1024;
1428 break;
1429
1430 case LPC1758:
1431 case LPC1759:
1432 case LPC1767:
1433 case LPC1768:
1434 case LPC1769:
1435 case LPC1777:
1436 case LPC1778:
1437 case LPC1787:
1438 case LPC1788:
1439 case LPC4078:
1440 case LPC4088:
1441 lpc2000_info->variant = lpc1700;
1442 bank->size = 512 * 1024;
1443 break;
1444
1445 case LPC810_021:
1446 lpc2000_info->variant = lpc800;
1447 bank->size = 4 * 1024;
1448 break;
1449
1450 case LPC811_001:
1451 lpc2000_info->variant = lpc800;
1452 bank->size = 8 * 1024;
1453 break;
1454
1455 case LPC812_101:
1456 case LPC812_101_1:
1457 case LPC812_101_2:
1458 case LPC812_101_3:
1459 case LPC822_101:
1460 case LPC822_101_1:
1461 lpc2000_info->variant = lpc800;
1462 bank->size = 16 * 1024;
1463 break;
1464
1465 case LPC824_201:
1466 case LPC824_201_1:
1467 lpc2000_info->variant = lpc800;
1468 bank->size = 32 * 1024;
1469 break;
1470
1471 case LPC8N04:
1472 case NHS3100:
1473 case NHS3152:
1474 case NHS3153:
1475 lpc2000_info->variant = lpc800;
1476 bank->size = 30 * 1024;
1477 break;
1478
1479 default:
1480 LOG_ERROR("BUG: unknown Part ID encountered: 0x%" PRIx32, part_id);
1481 exit(-1);
1482 }
1483
1484 return ERROR_OK;
1485 }
1486
1487 static int lpc2000_probe(struct flash_bank *bank)
1488 {
1489 int status;
1490 uint32_t part_id;
1491 struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
1492
1493 if (!lpc2000_info->probed) {
1494 if (lpc2000_info->variant == lpc_auto) {
1495 status = lpc2000_auto_probe_flash(bank);
1496 if (status != ERROR_OK)
1497 return status;
1498 } else if (lpc2000_info->variant == lpc1100 || lpc2000_info->variant == lpc1700) {
1499 status = get_lpc2000_part_id(bank, &part_id);
1500 if (status == LPC2000_CMD_SUCCESS)
1501 LOG_INFO("If auto-detection fails for this part, please email "
1502 "openocd-devel@lists.sourceforge.net, citing part id 0x%" PRIx32 ".\n", part_id);
1503 }
1504
1505 lpc2000_build_sector_list(bank);
1506 lpc2000_info->probed = true;
1507 }
1508
1509 return ERROR_OK;
1510 }
1511
1512 static int lpc2000_erase_check(struct flash_bank *bank)
1513 {
1514 if (bank->target->state != TARGET_HALTED) {
1515 LOG_ERROR("Target not halted");
1516 return ERROR_TARGET_NOT_HALTED;
1517 }
1518
1519 return lpc2000_iap_blank_check(bank, 0, bank->num_sectors - 1);
1520 }
1521
1522 static int get_lpc2000_info(struct flash_bank *bank, char *buf, int buf_size)
1523 {
1524 struct lpc2000_flash_bank *lpc2000_info = bank->driver_priv;
1525
1526 snprintf(buf, buf_size, "lpc2000 flash driver variant: %i, clk: %" PRIi32 "kHz", lpc2000_info->variant,
1527 lpc2000_info->cclk);
1528
1529 return ERROR_OK;
1530 }
1531
1532 COMMAND_HANDLER(lpc2000_handle_part_id_command)
1533 {
1534 if (CMD_ARGC < 1)
1535 return ERROR_COMMAND_SYNTAX_ERROR;
1536
1537 struct flash_bank *bank;
1538 int retval = CALL_COMMAND_HANDLER(flash_command_get_bank, 0, &bank);
1539 if (ERROR_OK != retval)
1540 return retval;
1541
1542 if (bank->target->state != TARGET_HALTED) {
1543 LOG_ERROR("Target not halted");
1544 return ERROR_TARGET_NOT_HALTED;
1545 }
1546
1547 uint32_t part_id;
1548 int status_code = get_lpc2000_part_id(bank, &part_id);
1549 if (status_code != 0x0) {
1550 if (status_code == ERROR_FLASH_OPERATION_FAILED) {
1551 command_print(CMD_CTX, "no sufficient working area specified, can't access LPC2000 IAP interface");
1552 } else
1553 command_print(CMD_CTX, "lpc2000 IAP returned status code %i", status_code);
1554 } else
1555 command_print(CMD_CTX, "lpc2000 part id: 0x%8.8" PRIx32, part_id);
1556
1557 return retval;
1558 }
1559
1560 static const struct command_registration lpc2000_exec_command_handlers[] = {
1561 {
1562 .name = "part_id",
1563 .handler = lpc2000_handle_part_id_command,
1564 .mode = COMMAND_EXEC,
1565 .help = "print part id of lpc2000 flash bank <num>",
1566 .usage = "<bank>",
1567 },
1568 COMMAND_REGISTRATION_DONE
1569 };
1570 static const struct command_registration lpc2000_command_handlers[] = {
1571 {
1572 .name = "lpc2000",
1573 .mode = COMMAND_ANY,
1574 .help = "lpc2000 flash command group",
1575 .usage = "",
1576 .chain = lpc2000_exec_command_handlers,
1577 },
1578 COMMAND_REGISTRATION_DONE
1579 };
1580
1581 struct flash_driver lpc2000_flash = {
1582 .name = "lpc2000",
1583 .commands = lpc2000_command_handlers,
1584 .flash_bank_command = lpc2000_flash_bank_command,
1585 .erase = lpc2000_erase,
1586 .write = lpc2000_write,
1587 .read = default_flash_read,
1588 .probe = lpc2000_probe,
1589 .auto_probe = lpc2000_probe,
1590 .erase_check = lpc2000_erase_check,
1591 .info = get_lpc2000_info,
1592 .free_driver_priv = default_flash_free_driver_priv,
1593 };

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)