flash: stm32lx fallback to slow memory writes when no working area
authorSpencer Oliver <spen@spen-soft.co.uk>
Fri, 7 Dec 2012 11:08:33 +0000 (11:08 +0000)
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>
Sun, 30 Dec 2012 11:36:40 +0000 (11:36 +0000)
The current stm32lx driver will fail if no working area is
provided - fallback to using slow writes if this is the case.

Change-Id: I92b1535fec4aebc855c63ce2c54b10f168f3c07e
Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk>
Reviewed-on: http://openocd.zylin.com/1007
Tested-by: jenkins
Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
src/flash/nor/stm32lx.c

index 6d7efb859eae74b787ccf5738f9dcbbc2029ae51..ce41f9421ff18670a405c68f6d7dd0c65fab8944 100644 (file)
@@ -399,10 +399,16 @@ static int stm32lx_write(struct flash_bank *bank, uint8_t *buffer,
        }
 
        if (halfpages_number) {
-               retval = stm32lx_write_half_pages(bank, buffer, offset, 128
-                               * halfpages_number);
-               if (retval != ERROR_OK)
-                       return ERROR_FAIL;
+               retval = stm32lx_write_half_pages(bank, buffer, offset, 128 * halfpages_number);
+               if (retval == ERROR_TARGET_RESOURCE_NOT_AVAILABLE) {
+                       /* attempt slow memory writes */
+                       LOG_WARNING("couldn't use block writes, falling back to single memory accesses");
+                       halfpages_number = 0;
+                       words_remaining = (count / 4);
+               } else {
+                       if (retval != ERROR_OK)
+                               return ERROR_FAIL;
+               }
        }
 
        bytes_written = 128 * halfpages_number;