]> git.sur5r.net Git - openocd/blobdiff - src/flash/nor/stm32f1x.c
stm32f1x: Fix option byte flag parsing
[openocd] / src / flash / nor / stm32f1x.c
index 3c360fcd0f89d748b9a2eeb00a245d4ba176f832..1b67ff0331d0a07619a5cd2da202307261765d53 100644 (file)
@@ -623,7 +623,7 @@ static int stm32x_write_block(struct flash_bank *bank, uint8_t *buffer,
        };
 
        retval = target_write_buffer(target, write_algorithm->address,
-                       sizeof(stm32x_flash_write_code), (uint8_t *)stm32x_flash_write_code);
+                       sizeof(stm32x_flash_write_code), stm32x_flash_write_code);
        if (retval != ERROR_OK)
                return retval;
 
@@ -921,8 +921,8 @@ static int stm32x_probe(struct flash_bank *bank)
                stm32x_info->option_offset = 6;
                stm32x_info->default_rdp = 0x55AA;
                break;
-       case 0x440: /* stm32f0x */
-       case 0x444:
+       case 0x440: /* stm32f05x */
+       case 0x444: /* stm32f03x */
                page_size = 1024;
                stm32x_info->ppage_size = 4;
                max_flash_size_in_kb = 64;
@@ -930,6 +930,14 @@ static int stm32x_probe(struct flash_bank *bank)
                stm32x_info->option_offset = 6;
                stm32x_info->default_rdp = 0x55AA;
                break;
+       case 0x448: /* stm32f07x */
+               page_size = 2048;
+               stm32x_info->ppage_size = 4;
+               max_flash_size_in_kb = 128;
+               stm32x_info->user_data_offset = 16;
+               stm32x_info->option_offset = 6;
+               stm32x_info->default_rdp = 0x55AA;
+               break;
        default:
                LOG_WARNING("Cannot identify target as a STM32 family.");
                return ERROR_FAIL;
@@ -1030,7 +1038,7 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
 
        switch (device_id) {
        case 0x410:
-               device_str = "stm32x (Medium Density)";
+               device_str = "STM32F10x (Medium Density)";
 
                switch (rev_id) {
                case 0x0000:
@@ -1052,7 +1060,7 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                break;
 
        case 0x412:
-               device_str = "stm32x (Low Density)";
+               device_str = "STM32F10x (Low Density)";
 
                switch (rev_id) {
                case 0x1000:
@@ -1062,7 +1070,7 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                break;
 
        case 0x414:
-               device_str = "stm32x (High Density)";
+               device_str = "STM32F10x (High Density)";
 
                switch (rev_id) {
                case 0x1000:
@@ -1072,11 +1080,15 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                case 0x1001:
                        rev_str = "Z";
                        break;
+
+               case 0x1003:
+                       rev_str = "Y";
+                       break;
                }
                break;
 
        case 0x418:
-               device_str = "stm32x (Connectivity)";
+               device_str = "STM32F10x (Connectivity)";
 
                switch (rev_id) {
                case 0x1000:
@@ -1090,7 +1102,7 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                break;
 
        case 0x420:
-               device_str = "stm32x (Value)";
+               device_str = "STM32F100 (Low/Medium Density)";
 
                switch (rev_id) {
                case 0x1000:
@@ -1104,7 +1116,7 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                break;
 
        case 0x422:
-               device_str = "stm32f30x";
+               device_str = "STM32F30x";
 
                switch (rev_id) {
                case 0x1000:
@@ -1115,6 +1127,10 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                        rev_str = "Z";
                        break;
 
+               case 0x1003:
+                       rev_str = "Y";
+                       break;
+
                case 0x2000:
                        rev_str = "B";
                        break;
@@ -1122,7 +1138,7 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                break;
 
        case 0x428:
-               device_str = "stm32x (Value HD)";
+               device_str = "STM32F100 (High Density)";
 
                switch (rev_id) {
                case 0x1000:
@@ -1136,7 +1152,7 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                break;
 
        case 0x430:
-               device_str = "stm32x (XL)";
+               device_str = "STM32F10x (XL Density)";
 
                switch (rev_id) {
                case 0x1000:
@@ -1146,7 +1162,7 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                break;
 
        case 0x432:
-               device_str = "stm32f37x";
+               device_str = "STM32F37x";
 
                switch (rev_id) {
                case 0x1000:
@@ -1159,9 +1175,36 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                }
                break;
 
-       case 0x440:
        case 0x444:
-               device_str = "stm32f0x";
+               device_str = "STM32F03x";
+
+               switch (rev_id) {
+               case 0x1000:
+                       rev_str = "1.0";
+                       break;
+
+               case 0x2000:
+                       rev_str = "2.0";
+                       break;
+               }
+               break;
+
+       case 0x440:
+               device_str = "STM32F05x";
+
+               switch (rev_id) {
+               case 0x1000:
+                       rev_str = "1.0";
+                       break;
+
+               case 0x2000:
+                       rev_str = "2.0";
+                       break;
+               }
+               break;
+
+       case 0x448:
+               device_str = "STM32F07x";
 
                switch (rev_id) {
                case 0x1000:
@@ -1175,7 +1218,7 @@ static int get_stm32x_info(struct flash_bank *bank, char *buf, int buf_size)
                break;
 
        default:
-               snprintf(buf, buf_size, "Cannot identify target as a stm32x\n");
+               snprintf(buf, buf_size, "Cannot identify target as a STM32F0/1/3\n");
                return ERROR_FAIL;
        }
 
@@ -1305,10 +1348,10 @@ COMMAND_HANDLER(stm32x_handle_options_read_command)
 
        int user_data = optionbyte;
 
-       if (buf_get_u32((uint8_t *)&optionbyte, OPT_ERROR, 1))
+       if (optionbyte >> OPT_ERROR & 1)
                command_print(CMD_CTX, "Option Byte Complement Error");
 
-       if (buf_get_u32((uint8_t *)&optionbyte, OPT_READOUT, 1))
+       if (optionbyte >> OPT_READOUT & 1)
                command_print(CMD_CTX, "Readout Protection On");
        else
                command_print(CMD_CTX, "Readout Protection Off");
@@ -1316,32 +1359,32 @@ COMMAND_HANDLER(stm32x_handle_options_read_command)
        /* user option bytes are offset depending on variant */
        optionbyte >>= stm32x_info->option_offset;
 
-       if (buf_get_u32((uint8_t *)&optionbyte, OPT_RDWDGSW, 1))
+       if (optionbyte >> OPT_RDWDGSW & 1)
                command_print(CMD_CTX, "Software Watchdog");
        else
                command_print(CMD_CTX, "Hardware Watchdog");
 
-       if (buf_get_u32((uint8_t *)&optionbyte, OPT_RDRSTSTOP, 1))
+       if (optionbyte >> OPT_RDRSTSTOP & 1)
                command_print(CMD_CTX, "Stop: No reset generated");
        else
                command_print(CMD_CTX, "Stop: Reset generated");
 
-       if (buf_get_u32((uint8_t *)&optionbyte, OPT_RDRSTSTDBY, 1))
+       if (optionbyte >> OPT_RDRSTSTDBY & 1)
                command_print(CMD_CTX, "Standby: No reset generated");
        else
                command_print(CMD_CTX, "Standby: Reset generated");
 
        if (stm32x_info->has_dual_banks) {
-               if (buf_get_u32((uint8_t *)&optionbyte, OPT_BFB2, 1))
+               if (optionbyte >> OPT_BFB2 & 1)
                        command_print(CMD_CTX, "Boot: Bank 0");
                else
                        command_print(CMD_CTX, "Boot: Bank 1");
        }
 
        command_print(CMD_CTX, "User Option0: 0x%02" PRIx8,
-                       (user_data >> stm32x_info->user_data_offset) & 0xff);
+                       (uint8_t)((user_data >> stm32x_info->user_data_offset) & 0xff));
        command_print(CMD_CTX, "User Option1: 0x%02" PRIx8,
-                       (user_data >> (stm32x_info->user_data_offset + 8)) & 0xff);
+                       (uint8_t)((user_data >> (stm32x_info->user_data_offset + 8)) & 0xff));
 
        return ERROR_OK;
 }
@@ -1390,12 +1433,12 @@ COMMAND_HANDLER(stm32x_handle_options_write_command)
                else if (strcmp("HWWDG", CMD_ARGV[0]) == 0)
                        optionbyte &= ~(1 << 0);
                else if (strcmp("NORSTSTOP", CMD_ARGV[0]) == 0)
-                       optionbyte &= ~(1 << 1);
-               else if (strcmp("RSTSTNDBY", CMD_ARGV[0]) == 0)
+                       optionbyte |= (1 << 1);
+               else if (strcmp("RSTSTOP", CMD_ARGV[0]) == 0)
                        optionbyte &= ~(1 << 1);
                else if (strcmp("NORSTSTNDBY", CMD_ARGV[0]) == 0)
-                       optionbyte &= ~(1 << 2);
-               else if (strcmp("RSTSTOP", CMD_ARGV[0]) == 0)
+                       optionbyte |= (1 << 2);
+               else if (strcmp("RSTSTNDBY", CMD_ARGV[0]) == 0)
                        optionbyte &= ~(1 << 2);
                else if (stm32x_info->has_dual_banks) {
                        if (strcmp("BOOT0", CMD_ARGV[0]) == 0)