lpc2000: Add LPC407x/8x flash size auto detection
[openocd.git] / src / flash / nor / lpc2000.c
index a7f8e8320f884087b79da438f8b4cadb7d77d375..c2a1fc203784cd1f0908af6d06972773fc1a2652 100644 (file)
@@ -40,7 +40,7 @@
 
 /**
  * @file
- * flash programming support for NXP LPC8xx,LPC1xxx,LPC43xx,LP5410x and LPC2xxx devices.
+ * flash programming support for NXP LPC8xx,LPC1xxx,LPC4xxx,LP5410x and LPC2xxx devices.
  *
  * @todo Provide a way to update CCLK after declaring the flash bank. The value which is correct after chip reset will
  * rarely still work right after the clocks switch to use the PLL (e.g. 4MHz --> 100 MHz).
  * lpc1700:
  * - 175x
  * - 176x (tested with LPC1768)
+ * - 177x
+ * - 178x (tested with LPC1788)
  *
- * lpc4300 (also available as lpc1800 - alias)
+ * lpc4000: (lpc1700's alias)
+ * - 407x
+ * - 408x (tested with LPC4088)
+ *
+ * lpc4300: (also available as lpc1800 - alias)
  * - 43x2 | 3 | 5 | 7 (tested with LPC4337/LPC4357)
  * - 18x2 | 3 | 5 | 7
  *
  * lpc800:
  * - 810 | 1 | 2 (tested with LPC810/LPC811/LPC812)
+ * - 822 | 4 (tested with LPC824)
  *
  * lpc1100:
  * - 11xx
  * - 134x
  * - 175x
  * - 176x
+ * - 177x
+ * - 178x
+ * - 407x
+ * - 408x
  * - 81x
  * - 82x
  */
 #define LPC11U37H_401  0x00007C44
 #define LPC11U37_501   0x00007C40
 
+#define LPC11E66       0x0000DCC1
+#define LPC11E67       0x0000BC81
+#define LPC11E68       0x00007C01
+
+#define LPC11U66       0x0000DCC8
+#define LPC11U67_1     0x0000BC88
+#define LPC11U67_2     0x0000BC80
+#define LPC11U68_1     0x00007C08
+#define LPC11U68_2     0x00007C00
+
 #define LPC1311        0x2C42502B
 #define LPC1311_1      0x1816902B
 #define LPC1313        0x2C40102B
 #define LPC1787        0x281D3747
 #define LPC1788        0x281D3F47
 
+#define LPC4072        0x47011121
+#define LPC4074        0x47011132
+#define LPC4076        0x47191F43
+#define LPC4078        0x47193F47
+#define LPC4088        0x481D3F47
+
 #define LPC810_021     0x00008100
 #define LPC811_001     0x00008110
 #define LPC812_101     0x00008120
@@ -457,7 +484,7 @@ static int lpc2000_build_sector_list(struct flash_bank *bank)
 
                for (int i = 0; i < bank->num_sectors; i++) {
                        bank->sectors[i].offset = offset;
-                       /* sectors 0-15 are 4kB-sized, 16 and above are 32kB-sized for LPC17xx devices */
+                       /* sectors 0-15 are 4kB-sized, 16 and above are 32kB-sized for LPC17xx/LPC40xx devices */
                        bank->sectors[i].size = (i < 16) ? 4 * 1024 : 32 * 1024;
                        offset += bank->sectors[i].size;
                        bank->sectors[i].is_erased = -1;
@@ -887,7 +914,7 @@ FLASH_BANK_COMMAND_HANDLER(lpc2000_flash_bank_command)
                lpc2000_info->variant = lpc2000_v1;
        } else if (strcmp(CMD_ARGV[6], "lpc2000_v2") == 0) {
                lpc2000_info->variant = lpc2000_v2;
-       } else if (strcmp(CMD_ARGV[6], "lpc1700") == 0) {
+       } else if (strcmp(CMD_ARGV[6], "lpc1700") == 0 || strcmp(CMD_ARGV[6], "lpc4000") == 0) {
                lpc2000_info->variant = lpc1700;
        } else if (strcmp(CMD_ARGV[6], "lpc1800") == 0 || strcmp(CMD_ARGV[6], "lpc4300") == 0) {
                lpc2000_info->variant = lpc4300;
@@ -1350,6 +1377,8 @@ static int lpc2000_auto_probe_flash(struct flash_bank *bank)
                case LPC1115_303_1:
                case LPC11U35_401:
                case LPC11U35_501:
+               case LPC11E66:
+               case LPC11U66:
                case LPC1317:
                case LPC1347:
                        lpc2000_info->variant = lpc1100;
@@ -1357,6 +1386,7 @@ static int lpc2000_auto_probe_flash(struct flash_bank *bank)
                        break;
 
                case LPC1752:
+               case LPC4072:
                        lpc2000_info->variant = lpc1700;
                        bank->size = 64 * 1024;
                        break;
@@ -1372,6 +1402,10 @@ static int lpc2000_auto_probe_flash(struct flash_bank *bank)
                case LPC11U37_401:
                case LPC11U37H_401:
                case LPC11U37_501:
+               case LPC11E67:
+               case LPC11E68:
+               case LPC11U67_1:
+               case LPC11U67_2:
                        lpc2000_info->variant = lpc1100;
                        bank->size = 128 * 1024;
                        break;
@@ -1379,10 +1413,17 @@ static int lpc2000_auto_probe_flash(struct flash_bank *bank)
                case LPC1754:
                case LPC1764:
                case LPC1774:
+               case LPC4074:
                        lpc2000_info->variant = lpc1700;
                        bank->size = 128 * 1024;
                        break;
 
+               case LPC11U68_1:
+               case LPC11U68_2:
+                       lpc2000_info->variant = lpc1100;
+                       bank->size = 256 * 1024;
+                       break;
+
                case LPC1756:
                case LPC1763:
                case LPC1765:
@@ -1390,6 +1431,7 @@ static int lpc2000_auto_probe_flash(struct flash_bank *bank)
                case LPC1776:
                case LPC1785:
                case LPC1786:
+               case LPC4076:
                        lpc2000_info->variant = lpc1700;
                        bank->size = 256 * 1024;
                        break;
@@ -1403,6 +1445,8 @@ static int lpc2000_auto_probe_flash(struct flash_bank *bank)
                case LPC1778:
                case LPC1787:
                case LPC1788:
+               case LPC4078:
+               case LPC4088:
                        lpc2000_info->variant = lpc1700;
                        bank->size = 512 * 1024;
                        break;

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)