Merge commit 'origin/master'
[fw/openocd] / src / flash / stm32x.c
index dd1c1d8c993f7339705281fd22d9c63bcff418bd..22bd4f978b5b65b4fbe2ede6d595f2ff55e5c2b5 100644 (file)
@@ -122,9 +122,9 @@ static uint32_t stm32x_wait_status_busy(flash_bank_t *bank, int timeout)
                alive_sleep(1);
        }
        /* Clear but report errors */
-       if (status & (FLASH_WRPRTERR|FLASH_PGERR))
+       if (status & (FLASH_WRPRTERR | FLASH_PGERR))
        {
-               target_write_u32(target, STM32_FLASH_SR, FLASH_WRPRTERR|FLASH_PGERR);
+               target_write_u32(target, STM32_FLASH_SR, FLASH_WRPRTERR | FLASH_PGERR);
        }
        return status;
 }
@@ -140,7 +140,7 @@ static int stm32x_read_options(struct flash_bank_s *bank)
        /* read current option bytes */
        target_read_u32(target, STM32_FLASH_OBR, &optiondata);
 
-       stm32x_info->option_bytes.user_options = (uint16_t)0xFFF8|((optiondata >> 2) & 0x07);
+       stm32x_info->option_bytes.user_options = (uint16_t)0xFFF8 | ((optiondata >> 2) & 0x07);
        stm32x_info->option_bytes.RDP = (optiondata & (1 << OPT_READOUT)) ? 0xFFFF : 0x5AA5;
 
        if (optiondata & (1 << OPT_READOUT))
@@ -177,14 +177,14 @@ static int stm32x_erase_options(struct flash_bank_s *bank)
        target_write_u32(target, STM32_FLASH_OPTKEYR, KEY2);
 
        /* erase option bytes */
-       target_write_u32(target, STM32_FLASH_CR, FLASH_OPTER|FLASH_OPTWRE);
-       target_write_u32(target, STM32_FLASH_CR, FLASH_OPTER|FLASH_STRT|FLASH_OPTWRE);
+       target_write_u32(target, STM32_FLASH_CR, FLASH_OPTER | FLASH_OPTWRE);
+       target_write_u32(target, STM32_FLASH_CR, FLASH_OPTER | FLASH_STRT | FLASH_OPTWRE);
 
        status = stm32x_wait_status_busy(bank, 10);
 
-       if ( status & FLASH_WRPRTERR )
+       if (status & FLASH_WRPRTERR)
                return ERROR_FLASH_OPERATION_FAILED;
-       if ( status & FLASH_PGERR )
+       if (status & FLASH_PGERR)
                return ERROR_FLASH_OPERATION_FAILED;
 
        /* clear readout protection and complementary option bytes
@@ -211,16 +211,16 @@ static int stm32x_write_options(struct flash_bank_s *bank)
        target_write_u32(target, STM32_FLASH_OPTKEYR, KEY2);
 
        /* program option bytes */
-       target_write_u32(target, STM32_FLASH_CR, FLASH_OPTPG|FLASH_OPTWRE);
+       target_write_u32(target, STM32_FLASH_CR, FLASH_OPTPG | FLASH_OPTWRE);
 
        /* write user option byte */
        target_write_u16(target, STM32_OB_USER, stm32x_info->option_bytes.user_options);
 
        status = stm32x_wait_status_busy(bank, 10);
 
-       if ( status & FLASH_WRPRTERR )
+       if (status & FLASH_WRPRTERR)
                return ERROR_FLASH_OPERATION_FAILED;
-       if ( status & FLASH_PGERR )
+       if (status & FLASH_PGERR)
                return ERROR_FLASH_OPERATION_FAILED;
 
        /* write protection byte 1 */
@@ -228,9 +228,9 @@ static int stm32x_write_options(struct flash_bank_s *bank)
 
        status = stm32x_wait_status_busy(bank, 10);
 
-       if ( status & FLASH_WRPRTERR )
+       if (status & FLASH_WRPRTERR)
                return ERROR_FLASH_OPERATION_FAILED;
-       if ( status & FLASH_PGERR )
+       if (status & FLASH_PGERR)
                return ERROR_FLASH_OPERATION_FAILED;
 
        /* write protection byte 2 */
@@ -238,9 +238,9 @@ static int stm32x_write_options(struct flash_bank_s *bank)
 
        status = stm32x_wait_status_busy(bank, 10);
 
-       if ( status & FLASH_WRPRTERR )
+       if (status & FLASH_WRPRTERR)
                return ERROR_FLASH_OPERATION_FAILED;
-       if ( status & FLASH_PGERR )
+       if (status & FLASH_PGERR)
                return ERROR_FLASH_OPERATION_FAILED;
 
        /* write protection byte 3 */
@@ -248,9 +248,9 @@ static int stm32x_write_options(struct flash_bank_s *bank)
 
        status = stm32x_wait_status_busy(bank, 10);
 
-       if ( status & FLASH_WRPRTERR )
+       if (status & FLASH_WRPRTERR)
                return ERROR_FLASH_OPERATION_FAILED;
-       if ( status & FLASH_PGERR )
+       if (status & FLASH_PGERR)
                return ERROR_FLASH_OPERATION_FAILED;
 
        /* write protection byte 4 */
@@ -258,9 +258,9 @@ static int stm32x_write_options(struct flash_bank_s *bank)
 
        status = stm32x_wait_status_busy(bank, 10);
 
-       if ( status & FLASH_WRPRTERR )
+       if (status & FLASH_WRPRTERR)
                return ERROR_FLASH_OPERATION_FAILED;
-       if ( status & FLASH_PGERR )
+       if (status & FLASH_PGERR)
                return ERROR_FLASH_OPERATION_FAILED;
 
        /* write readout protection bit */
@@ -268,9 +268,9 @@ static int stm32x_write_options(struct flash_bank_s *bank)
 
        status = stm32x_wait_status_busy(bank, 10);
 
-       if ( status & FLASH_WRPRTERR )
+       if (status & FLASH_WRPRTERR)
                return ERROR_FLASH_OPERATION_FAILED;
-       if ( status & FLASH_PGERR )
+       if (status & FLASH_PGERR)
                return ERROR_FLASH_OPERATION_FAILED;
 
        target_write_u32(target, STM32_FLASH_CR, FLASH_LOCK);
@@ -304,14 +304,15 @@ static int stm32x_protect_check(struct flash_bank_s *bank)
 
        if (stm32x_info->ppage_size == 2)
        {
-               /* high density flash */
+               /* high density flash/connectivity line protection */
 
                set = 1;
 
                if (protection & (1 << 31))
                        set = 0;
 
-               /* bit 31 controls sector 62 - 255 protection */
+               /* bit 31 controls sector 62 - 255 protection for high density
+                * bit 31 controls sector 62 - 127 protection for connectivity line */
                for (s = 62; s < bank->num_sectors; s++)
                {
                        bank->sectors[s].is_protected = set;
@@ -333,12 +334,12 @@ static int stm32x_protect_check(struct flash_bank_s *bank)
        }
        else
        {
-               /* medium density flash */
+               /* low/medium density flash protection */
                for (i = 0; i < num_bits; i++)
                {
                        set = 1;
 
-                       if ( protection & (1 << i))
+                       if (protection & (1 << i))
                                set = 0;
 
                        for (s = 0; s < stm32x_info->ppage_size; s++)
@@ -374,13 +375,13 @@ static int stm32x_erase(struct flash_bank_s *bank, int first, int last)
        {
                target_write_u32(target, STM32_FLASH_CR, FLASH_PER);
                target_write_u32(target, STM32_FLASH_AR, bank->base + bank->sectors[i].offset);
-               target_write_u32(target, STM32_FLASH_CR, FLASH_PER|FLASH_STRT);
+               target_write_u32(target, STM32_FLASH_CR, FLASH_PER | FLASH_STRT);
 
                status = stm32x_wait_status_busy(bank, 10);
 
-               if ( status & FLASH_WRPRTERR )
+               if (status & FLASH_WRPRTERR)
                        return ERROR_FLASH_OPERATION_FAILED;
-               if ( status & FLASH_PGERR )
+               if (status & FLASH_PGERR)
                        return ERROR_FLASH_OPERATION_FAILED;
                bank->sectors[i].is_erased = 1;
        }
@@ -409,7 +410,7 @@ static int stm32x_protect(struct flash_bank_s *bank, int set, int first, int las
 
        if ((first && (first % stm32x_info->ppage_size)) || ((last + 1) && (last + 1) % stm32x_info->ppage_size))
        {
-               LOG_WARNING("sector start/end incorrect - stm32 has %dK sector protection", stm32x_info->ppage_size);
+               LOG_WARNING("Error: start and end sectors must be on a %d sector boundary", stm32x_info->ppage_size);
                return ERROR_FLASH_SECTOR_INVALID;
        }
 
@@ -445,7 +446,7 @@ static int stm32x_protect(struct flash_bank_s *bank, int set, int first, int las
                        reg = (i / stm32x_info->ppage_size) / 8;
                        bit = (i / stm32x_info->ppage_size) - (reg * 8);
 
-                       if ( set )
+                       if (set)
                                prot_reg[reg] &= ~(1 << bit);
                        else
                                prot_reg[reg] |= (1 << bit);
@@ -459,7 +460,7 @@ static int stm32x_protect(struct flash_bank_s *bank, int set, int first, int las
                        reg = (i / stm32x_info->ppage_size) / 8;
                        bit = (i / stm32x_info->ppage_size) - (reg * 8);
 
-                       if ( set )
+                       if (set)
                                prot_reg[reg] &= ~(1 << bit);
                        else
                                prot_reg[reg] |= (1 << bit);
@@ -517,7 +518,7 @@ static int stm32x_write_block(struct flash_bank_s *bank, uint8_t *buffer, uint32
                return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
        };
 
-       if ((retval=target_write_buffer(target, stm32x_info->write_algorithm->address, sizeof(stm32x_flash_write_code), stm32x_flash_write_code))!=ERROR_OK)
+       if ((retval = target_write_buffer(target, stm32x_info->write_algorithm->address, sizeof(stm32x_flash_write_code), stm32x_flash_write_code)) != ERROR_OK)
                return retval;
 
        /* memory buffer */
@@ -547,7 +548,7 @@ static int stm32x_write_block(struct flash_bank_s *bank, uint8_t *buffer, uint32
        {
                uint32_t thisrun_count = (count > (buffer_size / 2)) ? (buffer_size / 2) : count;
 
-               if ((retval = target_write_buffer(target, source->address, thisrun_count * 2, buffer))!=ERROR_OK)
+               if ((retval = target_write_buffer(target, source->address, thisrun_count * 2, buffer)) != ERROR_OK)
                        break;
 
                buf_set_u32(reg_params[0].value, 0, 32, source->address);
@@ -658,12 +659,12 @@ static int stm32x_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t off
 
                status = stm32x_wait_status_busy(bank, 5);
 
-               if ( status & FLASH_WRPRTERR )
+               if (status & FLASH_WRPRTERR)
                {
                        LOG_ERROR("flash memory not erased before writing");
                        return ERROR_FLASH_OPERATION_FAILED;
                }
-               if ( status & FLASH_PGERR )
+               if (status & FLASH_PGERR)
                {
                        LOG_ERROR("flash memory write protected");
                        return ERROR_FLASH_OPERATION_FAILED;
@@ -684,12 +685,12 @@ static int stm32x_write(struct flash_bank_s *bank, uint8_t *buffer, uint32_t off
 
                status = stm32x_wait_status_busy(bank, 5);
 
-               if ( status & FLASH_WRPRTERR )
+               if (status & FLASH_WRPRTERR)
                {
                        LOG_ERROR("flash memory not erased before writing");
                        return ERROR_FLASH_OPERATION_FAILED;
                }
-               if ( status & FLASH_PGERR )
+               if (status & FLASH_PGERR)
                {
                        LOG_ERROR("flash memory write protected");
                        return ERROR_FLASH_OPERATION_FAILED;
@@ -720,7 +721,7 @@ static int stm32x_probe(struct flash_bank_s *bank)
 
        /* read stm32 device id register */
        target_read_u32(target, 0xE0042000, &device_id);
-       LOG_INFO( "device id = 0x%08" PRIx32 "", device_id );
+       LOG_INFO("device id = 0x%08" PRIx32 "", device_id);
 
        /* get flash size from target */
        if (target_read_u16(target, 0x1FFFF7E0, &num_pages) != ERROR_OK)
@@ -740,7 +741,7 @@ static int stm32x_probe(struct flash_bank_s *bank)
                if (num_pages == 0xffff)
                {
                        /* number of sectors incorrect on revA */
-                       LOG_WARNING( "STM32 flash size failed, probe inaccurate - assuming 128k flash" );
+                       LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 128k flash");
                        num_pages = 128;
                }
        }
@@ -755,7 +756,7 @@ static int stm32x_probe(struct flash_bank_s *bank)
                if (num_pages == 0xffff)
                {
                        /* number of sectors incorrect on revA */
-                       LOG_WARNING( "STM32 flash size failed, probe inaccurate - assuming 32k flash" );
+                       LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 32k flash");
                        num_pages = 32;
                }
        }
@@ -770,32 +771,32 @@ static int stm32x_probe(struct flash_bank_s *bank)
                if (num_pages == 0xffff)
                {
                        /* number of sectors incorrect on revZ */
-                       LOG_WARNING( "STM32 flash size failed, probe inaccurate - assuming 512k flash" );
+                       LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 512k flash");
                        num_pages = 512;
                }
        }
        else if ((device_id & 0x7ff) == 0x418)
        {
-               /* connectivity line density - we have 1k pages
-                * 4 pages for a protection area */
-               page_size = 1024;
-               stm32x_info->ppage_size = 4;
+               /* connectivity line density - we have 2k pages
+                * 2 pages for a protection area */
+               page_size = 2048;
+               stm32x_info->ppage_size = 2;
 
                /* check for early silicon */
                if (num_pages == 0xffff)
                {
                        /* number of sectors incorrect on revZ */
-                       LOG_WARNING( "STM32 flash size failed, probe inaccurate - assuming 256k flash" );
+                       LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 256k flash");
                        num_pages = 256;
                }
        }
        else
        {
-               LOG_WARNING( "Cannot identify target as a STM32 family." );
+               LOG_WARNING("Cannot identify target as a STM32 family.");
                return ERROR_FLASH_OPERATION_FAILED;
        }
 
-       LOG_INFO( "flash size = %dkbytes", num_pages );
+       LOG_INFO("flash size = %dkbytes", num_pages);
 
        /* calculate numbers of pages */
        num_pages /= (page_size / 1024);
@@ -921,6 +922,10 @@ static int stm32x_info(struct flash_bank_s *bank, char *buf, int buf_size)
                                snprintf(buf, buf_size, "A");
                                break;
 
+                       case 0x1001:
+                               snprintf(buf, buf_size, "Z");
+                               break;
+
                        default:
                                snprintf(buf, buf_size, "unknown");
                                break;
@@ -1098,7 +1103,7 @@ static int stm32x_handle_options_write_command(struct command_context_s *cmd_ctx
 
        if (argc < 4)
        {
-               command_print(cmd_ctx, "stm32x options_write <bank> <SWWDG|HWWDG> <RSTSTNDBY|NORSTSTNDBY> <RSTSTOP|NORSTSTOP>");
+               command_print(cmd_ctx, "stm32x options_write <bank> <SWWDG | HWWDG> <RSTSTNDBY | NORSTSTNDBY> <RSTSTOP | NORSTSTOP>");
                return ERROR_OK;
        }
 
@@ -1121,29 +1126,29 @@ static int stm32x_handle_options_write_command(struct command_context_s *cmd_ctx
 
        if (strcmp(args[1], "SWWDG") == 0)
        {
-               optionbyte |= (1<<0);
+               optionbyte |= (1 << 0);
        }
        else
        {
-               optionbyte &= ~(1<<0);
+               optionbyte &= ~(1 << 0);
        }
 
        if (strcmp(args[2], "NORSTSTNDBY") == 0)
        {
-               optionbyte |= (1<<1);
+               optionbyte |= (1 << 1);
        }
        else
        {
-               optionbyte &= ~(1<<1);
+               optionbyte &= ~(1 << 1);
        }
 
        if (strcmp(args[3], "NORSTSTOP") == 0)
        {
-               optionbyte |= (1<<2);
+               optionbyte |= (1 << 2);
        }
        else
        {
-               optionbyte &= ~(1<<2);
+               optionbyte &= ~(1 << 2);
        }
 
        if (stm32x_erase_options(bank) != ERROR_OK)
@@ -1182,19 +1187,19 @@ static int stm32x_mass_erase(struct flash_bank_s *bank)
 
        /* mass erase flash memory */
        target_write_u32(target, STM32_FLASH_CR, FLASH_MER);
-       target_write_u32(target, STM32_FLASH_CR, FLASH_MER|FLASH_STRT);
+       target_write_u32(target, STM32_FLASH_CR, FLASH_MER | FLASH_STRT);
 
        status = stm32x_wait_status_busy(bank, 10);
 
        target_write_u32(target, STM32_FLASH_CR, FLASH_LOCK);
 
-       if ( status & FLASH_WRPRTERR )
+       if (status & FLASH_WRPRTERR)
        {
                LOG_ERROR("stm32x device protected");
                return ERROR_OK;
        }
 
-       if ( status & FLASH_PGERR )
+       if (status & FLASH_PGERR)
        {
                LOG_ERROR("stm32x device programming failed");
                return ERROR_OK;