stm32f2x: Detect STM32F42x rev Y
[fw/openocd] / src / flash / nor / stm32f2x.c
index 1922a8c9afaadef910e5083005335083330a46ed..de11b377572119d24630b2f622361b8a832fa81f 100644 (file)
@@ -770,7 +770,9 @@ static int stm32x_probe(struct flash_bank *bank)
                break;
        case 0x419:
                max_flash_size_in_kb = 2048;
-               stm32x_info->has_large_mem = true;
+               break;
+       case 0x423:
+               max_flash_size_in_kb = 256;
                break;
        default:
                LOG_WARNING("Cannot identify target as a STM32 family.");
@@ -795,6 +797,10 @@ static int stm32x_probe(struct flash_bank *bank)
                flash_size_in_kb = stm32x_info->user_bank_size / 1024;
        }
 
+       /* only devices with > 1024kB have dual banks */
+       if (flash_size_in_kb > 1024)
+               stm32x_info->has_large_mem = true;
+
        LOG_INFO("flash size = %dkbytes", flash_size_in_kb);
 
        /* did we assign flash size? */
@@ -857,68 +863,88 @@ static int stm32x_auto_probe(struct flash_bank *bank)
 
 static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
 {
-       uint32_t device_id;
-       int printed;
+       uint32_t dbgmcu_idcode;
 
        /* read stm32 device id register */
-       int retval = stm32x_get_device_id(bank, &device_id);
+       int retval = stm32x_get_device_id(bank, &dbgmcu_idcode);
        if (retval != ERROR_OK)
                return retval;
 
-       if ((device_id & 0xfff) == 0x411) {
-               printed = snprintf(buf, buf_size, "stm32f2x - Rev: ");
-               buf += printed;
-               buf_size -= printed;
+       uint16_t device_id = dbgmcu_idcode & 0xfff;
+       uint16_t rev_id = dbgmcu_idcode >> 16;
+       const char *device_str;
+       const char *rev_str = NULL;
 
-               switch (device_id >> 16) {
-                       case 0x1000:
-                               snprintf(buf, buf_size, "A");
-                               break;
+       switch (device_id) {
+       case 0x411:
+               device_str = "STM32F2xx";
 
-                       case 0x2000:
-                               snprintf(buf, buf_size, "B");
-                               break;
+               switch (rev_id) {
+               case 0x1000:
+                       rev_str = "A";
+                       break;
 
-                       case 0x1001:
-                               snprintf(buf, buf_size, "Z");
-                               break;
+               case 0x2000:
+                       rev_str = "B";
+                       break;
 
-                       case 0x2001:
-                               snprintf(buf, buf_size, "Y");
-                               break;
+               case 0x1001:
+                       rev_str = "Z";
+                       break;
 
-                       case 0x2003:
-                               snprintf(buf, buf_size, "X");
-                               break;
+               case 0x2001:
+                       rev_str = "Y";
+                       break;
 
-                       default:
-                               snprintf(buf, buf_size, "unknown");
-                               break;
+               case 0x2003:
+                       rev_str = "X";
+                       break;
                }
-       } else if (((device_id & 0xfff) == 0x413) ||
-                       ((device_id & 0xfff) == 0x419)) {
-               printed = snprintf(buf, buf_size, "stm32f4x - Rev: ");
-               buf += printed;
-               buf_size -= printed;
-
-               switch (device_id >> 16) {
-                       case 0x1000:
-                               snprintf(buf, buf_size, "A");
-                               break;
-
-                       case 0x1001:
-                               snprintf(buf, buf_size, "Z");
-                               break;
-
-                       default:
-                               snprintf(buf, buf_size, "unknown");
-                               break;
+               break;
+
+       case 0x413:
+       case 0x419:
+               device_str = "STM32F4xx";
+
+               switch (rev_id) {
+               case 0x1000:
+                       rev_str = "A";
+                       break;
+
+               case 0x1001:
+                       rev_str = "Z";
+                       break;
+
+               case 0x1003:
+                       rev_str = "Y";
+                       break;
                }
-       } else {
-               snprintf(buf, buf_size, "Cannot identify target as a stm32x\n");
+               break;
+
+       case 0x423:
+               device_str = "STM32F4xx (Low Power)";
+
+               switch (rev_id) {
+               case 0x1000:
+                       rev_str = "A";
+                       break;
+
+               case 0x1001:
+                       rev_str = "Z";
+                       break;
+               }
+               break;
+
+       default:
+               snprintf(buf, buf_size, "Cannot identify target as a STM32F2/4\n");
                return ERROR_FAIL;
        }
 
+       if (rev_str != NULL)
+               snprintf(buf, buf_size, "%s - Rev: %s", device_str, rev_str);
+       else
+               snprintf(buf, buf_size, "%s - Rev: unknown (0x%04x)", device_str, rev_id);
+
        return ERROR_OK;
 }