]> git.sur5r.net Git - openocd/blobdiff - src/flash/stm32x.c
ocd_flash_banks now returns empty list when no flash banks are configured instead...
[openocd] / src / flash / stm32x.c
index 899dad99b1d17004a683bab5c85074f590ac58cd..0f62da91194de04a46a690ccd5736e5fc625bd4c 100644 (file)
@@ -2,6 +2,9 @@
  *   Copyright (C) 2005 by Dominic Rath                                    *
  *   Dominic.Rath@gmx.de                                                   *
  *                                                                         *
+ *   Copyright (C) 2008 by Spencer Oliver                                  *
+ *   spen@spen-soft.co.uk                                                  *
+ *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
  *   it under the terms of the GNU General Public License as published by  *
  *   the Free Software Foundation; either version 2 of the License, or     *
@@ -123,7 +126,7 @@ u32 stm32x_wait_status_busy(flash_bank_t *bank, int timeout)
        while (((status = stm32x_get_flash_status(bank)) & FLASH_BSY) && (timeout-- > 0))
        {
                LOG_DEBUG("status: 0x%x", status);
-               usleep(1000);
+               alive_sleep(1);
        }
        
        return status;
@@ -286,9 +289,11 @@ int stm32x_protect_check(struct flash_bank_s *bank)
        u32 protection;
        int i, s;
        int num_bits;
+       int set;
        
        if (target->state != TARGET_HALTED)
        {
+               LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
        
@@ -300,17 +305,50 @@ int stm32x_protect_check(struct flash_bank_s *bank)
         * high density - each protection bit is for 2 * 2K pages */
        num_bits = (bank->num_sectors / stm32x_info->ppage_size);
        
-       for (i = 0; i < num_bits; i++)
+       if (stm32x_info->ppage_size == 2)
        {
-               int set = 1;
+               /* high density flash */
+               
+               set = 1;
                
-               if( protection & (1 << i))
+               if (protection & (1 << 31))
                        set = 0;
                
-               for (s = 0; s < stm32x_info->ppage_size; s++)
-                       bank->sectors[(i * stm32x_info->ppage_size) + s].is_protected = set;
+               /* bit 31 controls sector 62 - 255 protection */        
+               for (s = 62; s < bank->num_sectors; s++)
+               {
+                       bank->sectors[s].is_protected = set;
+               }
+               
+               if (bank->num_sectors > 61)
+                       num_bits = 31;
+               
+               for (i = 0; i < num_bits; i++)
+               {
+                       set = 1;
+                       
+                       if (protection & (1 << i))
+                               set = 0;
+                       
+                       for (s = 0; s < stm32x_info->ppage_size; s++)
+                               bank->sectors[(i * stm32x_info->ppage_size) + s].is_protected = set;
+               }
        }
-
+       else
+       {               
+               /* medium density flash */
+               for (i = 0; i < num_bits; i++)
+               {
+                       set = 1;
+                       
+                       if( protection & (1 << i))
+                               set = 0;
+                       
+                       for (s = 0; s < stm32x_info->ppage_size; s++)
+                               bank->sectors[(i * stm32x_info->ppage_size) + s].is_protected = set;
+               }
+       }
+       
        return ERROR_OK;
 }
 
@@ -322,6 +360,7 @@ int stm32x_erase(struct flash_bank_s *bank, int first, int last)
        
        if (bank->target->state != TARGET_HALTED)
        {
+               LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
        
@@ -367,6 +406,7 @@ int stm32x_protect(struct flash_bank_s *bank, int set, int first, int last)
        
        if (target->state != TARGET_HALTED)
        {
+               LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
        
@@ -390,11 +430,16 @@ int stm32x_protect(struct flash_bank_s *bank, int set, int first, int last)
                /* high density flash */
                
                /* bit 7 controls sector 62 - 255 protection */
-               if (first > 61 || last <= 255)
-                       prot_reg[3] |= (1 << 7);
+               if (last > 61)
+               {
+                       if (set)
+                               prot_reg[3] &= ~(1 << 7);
+                       else
+                               prot_reg[3] |= (1 << 7);
+               }
                
                if (first > 61)
-                       first = 61;
+                       first = 62;
                if (last > 61)
                        last = 61;
                
@@ -554,6 +599,7 @@ int stm32x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count)
        
        if (bank->target->state != TARGET_HALTED)
        {
+               LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
 
@@ -649,6 +695,7 @@ int stm32x_probe(struct flash_bank_s *bank)
        
        if (bank->target->state != TARGET_HALTED)
        {
+               LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
 
@@ -739,7 +786,69 @@ int stm32x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd,
 
 int stm32x_info(struct flash_bank_s *bank, char *buf, int buf_size)
 {
-       snprintf(buf, buf_size, "stm32x flash driver info" );
+       target_t *target = bank->target;
+       u32 device_id;
+       int printed;
+       
+       /* read stm32 device id register */
+       target_read_u32(target, 0xE0042000, &device_id);
+       
+       if ((device_id & 0x7ff) == 0x410)
+       {
+               printed = snprintf(buf, buf_size, "stm32x (Medium Density) - Rev: ");
+               buf += printed;
+               buf_size -= printed;
+               
+               switch(device_id >> 16)
+               {
+                       case 0x0000:
+                               snprintf(buf, buf_size, "A");
+                               break;
+                       
+                       case 0x2000:
+                               snprintf(buf, buf_size, "B");
+                               break;
+                       
+                       case 0x2001:
+                               snprintf(buf, buf_size, "Z");
+                               break;
+                       
+                       case 0x2003:
+                               snprintf(buf, buf_size, "Y");
+                               break;
+                       
+                       default:
+                               snprintf(buf, buf_size, "unknown");
+                               break;
+               }
+       }
+       else if ((device_id & 0x7ff) == 0x414)
+       {
+               printed = snprintf(buf, buf_size, "stm32x (High Density) - 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;
+               }
+       }
+       else
+       {
+               snprintf(buf, buf_size, "Cannot identify target as a stm32x\n");
+               return ERROR_FLASH_OPERATION_FAILED;
+       }
+       
        return ERROR_OK;
 }
 
@@ -768,6 +877,7 @@ int stm32x_handle_lock_command(struct command_context_s *cmd_ctx, char *cmd, cha
        
        if (target->state != TARGET_HALTED)
        {
+               LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
        
@@ -816,6 +926,7 @@ int stm32x_handle_unlock_command(struct command_context_s *cmd_ctx, char *cmd, c
        
        if (target->state != TARGET_HALTED)
        {
+               LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
                
@@ -862,6 +973,7 @@ int stm32x_handle_options_read_command(struct command_context_s *cmd_ctx, char *
        
        if (target->state != TARGET_HALTED)
        {
+               LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
        
@@ -920,6 +1032,7 @@ int stm32x_handle_options_write_command(struct command_context_s *cmd_ctx, char
        
        if (target->state != TARGET_HALTED)
        {
+               LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }
        
@@ -976,6 +1089,7 @@ int stm32x_mass_erase(struct flash_bank_s *bank)
        
        if (target->state != TARGET_HALTED)
        {
+               LOG_ERROR("Target not halted");
                return ERROR_TARGET_NOT_HALTED;
        }