summaryrefslogtreecommitdiff
path: root/src/flash/stm32x.c
diff options
context:
space:
mode:
authorntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-07-22 14:30:52 +0000
committerntfreak <ntfreak@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-07-22 14:30:52 +0000
commitdad28d0659f53ae87a85c1fe5663f677594a9ecd (patch)
treea1da45aeb7dad10f2371eb7bdb856bcc8715d71e /src/flash/stm32x.c
parentc77b785505f050c955152059b8244b3db50f27d9 (diff)
downloadopenocd+libswd-dad28d0659f53ae87a85c1fe5663f677594a9ecd.tar.gz
openocd+libswd-dad28d0659f53ae87a85c1fe5663f677594a9ecd.tar.bz2
openocd+libswd-dad28d0659f53ae87a85c1fe5663f677594a9ecd.tar.xz
openocd+libswd-dad28d0659f53ae87a85c1fe5663f677594a9ecd.zip
- fix bug with stm32 high density write protection
git-svn-id: svn://svn.berlios.de/openocd/trunk@858 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/flash/stm32x.c')
-rw-r--r--src/flash/stm32x.c42
1 files changed, 35 insertions, 7 deletions
diff --git a/src/flash/stm32x.c b/src/flash/stm32x.c
index a8125f47..899dad99 100644
--- a/src/flash/stm32x.c
+++ b/src/flash/stm32x.c
@@ -385,15 +385,43 @@ int stm32x_protect(struct flash_bank_s *bank, int set, int first, int last)
prot_reg[2] = (u16)(protection >> 16);
prot_reg[3] = (u16)(protection >> 24);
- for (i = first; i <= last; i++)
+ if (stm32x_info->ppage_size == 2)
{
- reg = (i / stm32x_info->ppage_size) / 8;
- bit = (i / stm32x_info->ppage_size) - (reg * 8);
+ /* high density flash */
- if( set )
- prot_reg[reg] &= ~(1 << bit);
- else
- prot_reg[reg] |= (1 << bit);
+ /* bit 7 controls sector 62 - 255 protection */
+ if (first > 61 || last <= 255)
+ prot_reg[3] |= (1 << 7);
+
+ if (first > 61)
+ first = 61;
+ if (last > 61)
+ last = 61;
+
+ for (i = first; i <= last; i++)
+ {
+ reg = (i / stm32x_info->ppage_size) / 8;
+ bit = (i / stm32x_info->ppage_size) - (reg * 8);
+
+ if( set )
+ prot_reg[reg] &= ~(1 << bit);
+ else
+ prot_reg[reg] |= (1 << bit);
+ }
+ }
+ else
+ {
+ /* medium density flash */
+ for (i = first; i <= last; i++)
+ {
+ reg = (i / stm32x_info->ppage_size) / 8;
+ bit = (i / stm32x_info->ppage_size) - (reg * 8);
+
+ if( set )
+ prot_reg[reg] &= ~(1 << bit);
+ else
+ prot_reg[reg] |= (1 << bit);
+ }
}
if ((status = stm32x_erase_options(bank)) != ERROR_OK)