This is an automated email from Gerrit.

Andrey Smirnov ([email protected]) just uploaded a new patch set to 
Gerrit, which you can find at http://openocd.zylin.com/2025

-- gerrit

commit 3166e4d81eb55c53bdcbdb2346359a0e02365d09
Author: Andrey Smirnov <[email protected]>
Date:   Sat Feb 8 12:23:45 2014 -0800

    at91samd: Bail early if trying to write to protected sector
    
    Bail early if trying to write to protected sector also mark the sector
    we are writing to as dirty.
    
    Change-Id: I892f83461792e1cc2dcccade7aa65717831a6805
    Signed-off-by: Andrey Smirnov <[email protected]>

diff --git a/src/flash/nor/at91samd.c b/src/flash/nor/at91samd.c
index d3fe2f3..2c816c9 100644
--- a/src/flash/nor/at91samd.c
+++ b/src/flash/nor/at91samd.c
@@ -375,6 +375,17 @@ static int samd_erase(struct flash_bank *bank, int first, 
int last)
        return ERROR_OK;
 }
 
+static struct flash_sector *samd_find_sector_by_address(struct flash_bank 
*bank, uint32_t address)
+{
+       struct samd_info *chip = (struct samd_info *)bank->driver_priv;
+
+       for (int i = 0; i < bank->num_sectors; i++)
+               if (bank->sectors[i].offset <= address &&
+                   address < bank->sectors[i].offset + chip->sector_size)
+                       return &bank->sectors[i];
+       return NULL;
+}
+
 /* Write an entire row (four pages) from host buffer 'buf' to row-aligned
  * 'address' in the Flash. */
 static int samd_write_row(struct flash_bank *bank, uint32_t address,
@@ -383,6 +394,18 @@ static int samd_write_row(struct flash_bank *bank, 
uint32_t address,
        int res;
        struct samd_info *chip = (struct samd_info *)bank->driver_priv;
 
+       struct flash_sector *sector = samd_find_sector_by_address(bank, 
address);
+
+       if (!sector) {
+               LOG_ERROR("Can't find sector corresponding to address 0x%08" 
PRIx32, address);
+               return ERROR_FLASH_OPERATION_FAILED;
+       }
+
+       if (sector->is_protected) {
+               LOG_ERROR("Trying to write to a protected sector at 0x%08" 
PRIx32, address);
+               return ERROR_FLASH_OPERATION_FAILED;
+       }
+
        /* Erase the row that we'll be writing to */
        res = samd_erase_row(bank, address);
        if (res != ERROR_OK)
@@ -411,6 +434,8 @@ static int samd_write_row(struct flash_bank *bank, uint32_t 
address,
                buf += chip->page_size;
        }
 
+       sector->is_erased = 0;
+
        return res;
 }
 

-- 

------------------------------------------------------------------------------
Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce.
With Perforce, you get hassle-free workflows. Merge that actually works. 
Faster operations. Version large binaries.  Built-in WAN optimization and the
freedom to use Git, Perforce or both. Make the move to Perforce.
http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to