- /* Read the RDP byte and check if it is 0xAA */
- uint8_t rdp;
- retval = target_read_u32(target, FLASH_OBR, ®32);
- if (retval != ERROR_OK)
- return retval;
- rdp = reg32 & 0xFF;
- if (rdp != 0xAA) {
- /*
- * Unlocking the option byte is done by unlocking the PECR, then
- * by writing the 2 option byte keys to OPTKEYR
- */
-
- /* To unlock the PECR write the 2 PEKEY to the PEKEYR register */
- retval = target_write_u32(target, FLASH_PEKEYR, PEKEY1);
- if (retval != ERROR_OK)
- return retval;
-
- retval = target_write_u32(target, FLASH_PEKEYR, PEKEY2);
- if (retval != ERROR_OK)
- return retval;
-
- /* Make sure it worked */
- retval = target_read_u32(target, FLASH_PECR, ®32);
- if (retval != ERROR_OK)
- return retval;
-
- if (reg32 & FLASH_PECR__PELOCK)
- return ERROR_FLASH_OPERATION_FAILED;
-
- retval = target_write_u32(target, FLASH_OPTKEYR, OPTKEY1);
- if (retval != ERROR_OK)
- return retval;
- retval = target_write_u32(target, FLASH_OPTKEYR, OPTKEY2);
- if (retval != ERROR_OK)
- return retval;
-
- retval = target_read_u32(target, FLASH_PECR, ®32);
- if (retval != ERROR_OK)
- return retval;
-
- if (reg32 & FLASH_PECR__OPTLOCK) {
- LOG_ERROR("OPTLOCK is not cleared");
- return ERROR_FLASH_OPERATION_FAILED;
+ if ((device_id & 0xfff) == 0x416) {
+ /* check for early silicon */
+ if (flash_size_in_kb == 0xffff) {
+ /* number of sectors may be incorrrect on early silicon */
+ LOG_WARNING("STM32 flash size failed, probe inaccurate - assuming 128k flash");
+ flash_size_in_kb = 128;