fix flash info - now reports erased state properly
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 2 Apr 2008 14:40:35 +0000 (14:40 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 2 Apr 2008 14:40:35 +0000 (14:40 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@534 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/flash/ecos.c
src/flash/flash.c
src/flash/flash.h
src/flash/str7x.c
src/flash/str9x.c

index 55e54e059f180bdb391c2c54c04092a6375815a0..f467b74d8c4b17547bd14a4b8f80f413630549b8 100644 (file)
@@ -45,7 +45,6 @@ int ecosflash_erase(struct flash_bank_s *bank, int first, int last);
 int ecosflash_protect(struct flash_bank_s *bank, int set, int first, int last);
 int ecosflash_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count);
 int ecosflash_probe(struct flash_bank_s *bank);
-int ecosflash_erase_check(struct flash_bank_s *bank);
 int ecosflash_protect_check(struct flash_bank_s *bank);
 int ecosflash_info(struct flash_bank_s *bank, char *buf, int buf_size);
 
@@ -64,7 +63,7 @@ flash_driver_t ecosflash_flash =
        .write = ecosflash_write,
        .probe = ecosflash_probe,
        .auto_probe = ecosflash_probe,
-       .erase_check = ecosflash_erase_check,
+       .erase_check = default_flash_blank_check,
        .protect_check = ecosflash_protect_check,
        .info = ecosflash_info
 };
@@ -444,11 +443,6 @@ int ecosflash_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count
 }
 
 
-int ecosflash_erase_check(struct flash_bank_s *bank)
-{
-       return ERROR_OK;
-}
-
 int ecosflash_protect_check(struct flash_bank_s *bank)
 {
        return ERROR_OK;
index a0c8984124445fc5e766df5f617d61e107ceedb8..d5159b97f254c55d7efda85f58a957bc445306ff 100644 (file)
@@ -334,7 +334,11 @@ int handle_flash_info_command(struct command_context_s *cmd_ctx, char *cmd, char
                        char buf[1024];
 
                        /* attempt auto probe */
-                       p->driver->auto_probe(p);
+                       if ((retval = p->driver->auto_probe(p)) != ERROR_OK)
+                               return retval;
+                       
+                       if ((retval = p->driver->erase_check(p)) != ERROR_OK)
+                               return retval;
 
                        command_print(cmd_ctx, "#%i: %s at 0x%8.8x, size 0x%8.8x, buswidth %i, chipwidth %i",
                                                i, p->driver->name, p->base, p->size, p->bus_width, p->chip_width);
@@ -1049,3 +1053,51 @@ int handle_flash_auto_erase_command(struct command_context_s *cmd_ctx, char *cmd
 
        return ERROR_OK;
 }
+
+
+int default_flash_blank_check(struct flash_bank_s *bank)
+{
+       target_t *target = bank->target;
+       u8 buffer[1024];
+       int buffer_size=sizeof(buffer);
+       int i;
+       int nBytes;
+       
+       if (bank->target->state != TARGET_HALTED)
+       {
+               return ERROR_TARGET_NOT_HALTED;
+       }
+       
+       
+       for (i = 0; i < bank->num_sectors; i++)
+       {
+               int j;
+               bank->sectors[i].is_erased = 1;
+               
+               for (j=0; j<bank->sectors[i].size; j+=buffer_size)
+               {
+                       int chunk;
+                       int retval;
+                       chunk=buffer_size;
+                       if (chunk>(j-bank->sectors[i].size))
+                       {
+                               chunk=(j-bank->sectors[i].size);
+                       }
+                       
+                       retval=target->type->read_memory(target, bank->base + bank->sectors[i].offset, 4, chunk/4, buffer);
+                       if (retval!=ERROR_OK)
+                               return retval;
+               
+                       for (nBytes = 0; nBytes < chunk; nBytes++)
+                       {
+                               if (buffer[nBytes] != 0xFF)
+                               {
+                                       bank->sectors[i].is_erased = 0;
+                                       break;
+                               }
+                       }
+               }
+       }
+       
+       return ERROR_OK;
+}
index 846ddc4b196c07aef5795244744f5f416cd20e85..e2f788554f066e31cd5e9b46146adbbd86e7f066 100644 (file)
@@ -78,6 +78,7 @@ extern int flash_erase_address_range(target_t *target, u32 addr, u32 length);
 extern int flash_write(target_t *target, image_t *image, u32 *written, int erase);
 extern void flash_set_dirty(void);
 extern int flash_get_bank_count();
+int default_flash_blank_check(struct flash_bank_s *bank);
 
 extern flash_bank_t *get_flash_bank_by_num(int num);
 extern flash_bank_t *get_flash_bank_by_num_noprobe(int num);
index c7a486e2846ade8615a40b815615f1b567154c91..70f312d359beec3aca6421efad148561eabe0826 100644 (file)
@@ -56,7 +56,6 @@ int str7x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count);
 int str7x_probe(struct flash_bank_s *bank);
 int str7x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int str7x_protect_check(struct flash_bank_s *bank);
-int str7x_erase_check(struct flash_bank_s *bank);
 int str7x_info(struct flash_bank_s *bank, char *buf, int buf_size);
 
 int str7x_handle_disable_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -71,7 +70,7 @@ flash_driver_t str7x_flash =
        .write = str7x_write,
        .probe = str7x_probe,
        .auto_probe = str7x_probe,
-       .erase_check = str7x_erase_check,
+       .erase_check = default_flash_blank_check,
        .protect_check = str7x_protect_check,
        .info = str7x_info
 };
@@ -240,43 +239,6 @@ u32 str7x_result(struct flash_bank_s *bank)
        return retval;
 }
 
-int str7x_blank_check(struct flash_bank_s *bank, int first, int last)
-{
-       target_t *target = bank->target;
-       u8 *buffer;
-       int i;
-       int nBytes;
-       
-       if ((first < 0) || (last > bank->num_sectors))
-               return ERROR_FLASH_SECTOR_INVALID;
-
-       if (bank->target->state != TARGET_HALTED)
-       {
-               return ERROR_TARGET_NOT_HALTED;
-       }
-       
-       buffer = malloc(256);
-       
-       for (i = first; i <= last; i++)
-       {
-               bank->sectors[i].is_erased = 1;
-
-               target->type->read_memory(target, bank->base + bank->sectors[i].offset, 4, 256/4, buffer);
-               
-               for (nBytes = 0; nBytes < 256; nBytes++)
-               {
-                       if (buffer[nBytes] != 0xFF)
-                       {
-                               bank->sectors[i].is_erased = 0;
-                               break;
-                       }
-               }       
-       }
-       
-       free(buffer);
-
-       return ERROR_OK;
-}
 
 int str7x_protect_check(struct flash_bank_s *bank)
 {
@@ -729,11 +691,6 @@ int str7x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, c
        return ERROR_OK;
 }
 
-int str7x_erase_check(struct flash_bank_s *bank)
-{
-       return str7x_blank_check(bank, 0, bank->num_sectors - 1);
-}
-
 int str7x_info(struct flash_bank_s *bank, char *buf, int buf_size)
 {
        snprintf(buf, buf_size, "str7x flash driver info" );
index bd823820769e49917142735c9919d11b7b24e852..68fefc1bd93baa4bdf8352453b6a21e66fa66c2a 100644 (file)
@@ -64,7 +64,6 @@ int str9x_write(struct flash_bank_s *bank, u8 *buffer, u32 offset, u32 count);
 int str9x_probe(struct flash_bank_s *bank);
 int str9x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 int str9x_protect_check(struct flash_bank_s *bank);
-int str9x_erase_check(struct flash_bank_s *bank);
 int str9x_info(struct flash_bank_s *bank, char *buf, int buf_size);
 
 int str9x_handle_flash_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -79,7 +78,7 @@ flash_driver_t str9x_flash =
        .write = str9x_write,
        .probe = str9x_probe,
        .auto_probe = str9x_probe,
-       .erase_check = str9x_erase_check,
+       .erase_check = default_flash_blank_check,
        .protect_check = str9x_protect_check,
        .info = str9x_info
 };
@@ -170,44 +169,6 @@ int str9x_flash_bank_command(struct command_context_s *cmd_ctx, char *cmd, char
        return ERROR_OK;
 }
 
-int str9x_blank_check(struct flash_bank_s *bank, int first, int last)
-{
-       target_t *target = bank->target;
-       u8 *buffer;
-       int i;
-       int nBytes;
-       
-       if ((first < 0) || (last > bank->num_sectors))
-               return ERROR_FLASH_SECTOR_INVALID;
-
-       if (bank->target->state != TARGET_HALTED)
-       {
-               return ERROR_TARGET_NOT_HALTED;
-       }
-       
-       buffer = malloc(256);
-       
-       for (i = first; i <= last; i++)
-       {
-               bank->sectors[i].is_erased = 1;
-
-               target->type->read_memory(target, bank->base + bank->sectors[i].offset, 4, 256/4, buffer);
-               
-               for (nBytes = 0; nBytes < 256; nBytes++)
-               {
-                       if (buffer[nBytes] != 0xFF)
-                       {
-                               bank->sectors[i].is_erased = 0;
-                               break;
-                       }
-               }       
-       }
-       
-       free(buffer);
-
-       return ERROR_OK;
-}
-
 int str9x_protect_check(struct flash_bank_s *bank)
 {
        str9x_flash_bank_t *str9x_info = bank->driver_priv;
@@ -581,11 +542,6 @@ int str9x_handle_part_id_command(struct command_context_s *cmd_ctx, char *cmd, c
        return ERROR_OK;
 }
 
-int str9x_erase_check(struct flash_bank_s *bank)
-{
-       return str9x_blank_check(bank, 0, bank->num_sectors - 1);
-}
-
 int str9x_info(struct flash_bank_s *bank, char *buf, int buf_size)
 {
        snprintf(buf, buf_size, "str9x flash driver info" );

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)