flash/stm32fxx.c: do not read CPUID as this info is stored in cortex_m_common
authorTarek BOCHKATI <tarek.bouchkati@gmail.com>
Thu, 13 May 2021 13:28:24 +0000 (14:28 +0100)
committerAntonio Borneo <borneo.antonio@gmail.com>
Fri, 18 Jun 2021 22:13:33 +0000 (23:13 +0100)
In these drivers we read CPUID to check the Cortex-M PARTNO,
but now the PARTNO is stored in struct cortex_m_common.core_info.

Change-Id: I5bb3b95210ab6e23b8e1252686dd81015740bf68
Signed-off-by: Tarek BOCHKATI <tarek.bouchkati@gmail.com>
Reviewed-on: http://openocd.zylin.com/6240
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
src/flash/nor/stm32f1x.c
src/flash/nor/stm32f2x.c

index 91f2aef86246f11d5450aa5a870a9b59efc17637..fbcf83afbe98f47213fc05ef2305f164ffe2548c 100644 (file)
@@ -29,7 +29,7 @@
 #include "imp.h"
 #include <helper/binarybuffer.h>
 #include <target/algorithm.h>
-#include <target/armv7m.h>
+#include <target/cortex_m.h>
 
 /* stm32x register locations */
 
@@ -623,34 +623,32 @@ cleanup:
 
 static int stm32x_get_device_id(struct flash_bank *bank, uint32_t *device_id)
 {
-       /* This check the device CPUID core register to detect
-        * the M0 from the M3 devices. */
-
        struct target *target = bank->target;
-       uint32_t cpuid, device_id_register = 0;
+       struct cortex_m_common *cortex_m = target_to_cm(target);
+       uint32_t device_id_register = 0;
 
-       /* Get the CPUID from the ARM Core
-        * http://infocenter.arm.com/help/topic/com.arm.doc.ddi0432c/DDI0432C_cortex_m0_r0p0_trm.pdf 4.2.1 */
-       int retval = target_read_u32(target, 0xE000ED00, &cpuid);
-       if (retval != ERROR_OK)
-               return retval;
+       if (!target_was_examined(target)) {
+               LOG_ERROR("Target not examined yet");
+               return ERROR_FAIL;
+       }
 
-       if (((cpuid >> 4) & 0xFFF) == 0xC20) {
-               /* 0xC20 is M0 devices */
+       switch (cortex_m->core_info->partno) {
+       case CORTEX_M0_PARTNO: /* STM32F0x devices */
                device_id_register = 0x40015800;
-       } else if (((cpuid >> 4) & 0xFFF) == 0xC23) {
-               /* 0xC23 is M3 devices */
+               break;
+       case CORTEX_M3_PARTNO: /* STM32F1x devices */
                device_id_register = 0xE0042000;
-       } else if (((cpuid >> 4) & 0xFFF) == 0xC24) {
-               /* 0xC24 is M4 devices */
+               break;
+       case CORTEX_M4_PARTNO: /* STM32F3x devices */
                device_id_register = 0xE0042000;
-       } else {
+               break;
+       default:
                LOG_ERROR("Cannot identify target as a stm32x");
                return ERROR_FAIL;
        }
 
        /* read stm32 device id register */
-       retval = target_read_u32(target, device_id_register, device_id);
+       int retval = target_read_u32(target, device_id_register, device_id);
        if (retval != ERROR_OK)
                return retval;
 
@@ -660,27 +658,30 @@ static int stm32x_get_device_id(struct flash_bank *bank, uint32_t *device_id)
 static int stm32x_get_flash_size(struct flash_bank *bank, uint16_t *flash_size_in_kb)
 {
        struct target *target = bank->target;
-       uint32_t cpuid, flash_size_reg;
+       struct cortex_m_common *cortex_m = target_to_cm(target);
+       uint32_t flash_size_reg;
 
-       int retval = target_read_u32(target, 0xE000ED00, &cpuid);
-       if (retval != ERROR_OK)
-               return retval;
+       if (!target_was_examined(target)) {
+               LOG_ERROR("Target not examined yet");
+               return ERROR_FAIL;
+       }
 
-       if (((cpuid >> 4) & 0xFFF) == 0xC20) {
-               /* 0xC20 is M0 devices */
+       switch (cortex_m->core_info->partno) {
+       case CORTEX_M0_PARTNO: /* STM32F0x devices */
                flash_size_reg = 0x1FFFF7CC;
-       } else if (((cpuid >> 4) & 0xFFF) == 0xC23) {
-               /* 0xC23 is M3 devices */
+               break;
+       case CORTEX_M3_PARTNO: /* STM32F1x devices */
                flash_size_reg = 0x1FFFF7E0;
-       } else if (((cpuid >> 4) & 0xFFF) == 0xC24) {
-               /* 0xC24 is M4 devices */
+               break;
+       case CORTEX_M4_PARTNO: /* STM32F3x devices */
                flash_size_reg = 0x1FFFF7CC;
-       } else {
+               break;
+       default:
                LOG_ERROR("Cannot identify target as a stm32x");
                return ERROR_FAIL;
        }
 
-       retval = target_read_u16(target, flash_size_reg, flash_size_in_kb);
+       int retval = target_read_u16(target, flash_size_reg, flash_size_in_kb);
        if (retval != ERROR_OK)
                return retval;
 
index 44f06f4fde32a2d0d956395239eebbee5e5121ae..f718e3b982e1ee1d7f125744c11184272f9d4878 100644 (file)
@@ -29,7 +29,7 @@
 #include "imp.h"
 #include <helper/binarybuffer.h>
 #include <target/algorithm.h>
-#include <target/armv7m.h>
+#include <target/cortex_m.h>
 
 /* Regarding performance:
  *
@@ -968,25 +968,17 @@ static int stm32x_get_device_id(struct flash_bank *bank, uint32_t *device_id)
         * Only effects Rev A silicon */
 
        struct target *target = bank->target;
-       uint32_t cpuid;
+       struct cortex_m_common *cortex_m = target_to_cm(target);
 
        /* read stm32 device id register */
        int retval = target_read_u32(target, 0xE0042000, device_id);
        if (retval != ERROR_OK)
                return retval;
 
-       if ((*device_id & 0xfff) == 0x411) {
-               /* read CPUID reg to check core type */
-               retval = target_read_u32(target, 0xE000ED00, &cpuid);
-               if (retval != ERROR_OK)
-                       return retval;
-
-               /* check for cortex_m4 */
-               if (((cpuid >> 4) & 0xFFF) == 0xC24) {
-                       *device_id &= ~((0xFFFF << 16) | 0xfff);
-                       *device_id |= (0x1000 << 16) | 0x413;
-                       LOG_INFO("stm32f4x errata detected - fixing incorrect MCU_IDCODE");
-               }
+       if ((*device_id & 0xfff) == 0x411 && cortex_m->core_info->partno == CORTEX_M4_PARTNO) {
+               *device_id &= ~((0xFFFF << 16) | 0xfff);
+               *device_id |= (0x1000 << 16) | 0x413;
+               LOG_INFO("stm32f4x errata detected - fixing incorrect MCU_IDCODE");
        }
        return retval;
 }