]> git.sur5r.net Git - openocd/blobdiff - src/target/armv7m.c
flash/nor: Add erased_value to drivers and pass it to targets
[openocd] / src / target / armv7m.c
index e2f710f147aeab260927253525d59982b18a0d17..60b244aae38b51a879a03ebaea6f148752a636f6 100644 (file)
@@ -726,26 +726,42 @@ cleanup:
        return retval;
 }
 
-/** Checks whether a memory region is zeroed. */
+/** Checks whether a memory region is erased. */
 int armv7m_blank_check_memory(struct target *target,
-       uint32_t address, uint32_t count, uint32_t *blank)
+       uint32_t address, uint32_t count, uint32_t *blank, uint8_t erased_value)
 {
        struct working_area *erase_check_algorithm;
        struct reg_param reg_params[3];
        struct armv7m_algorithm armv7m_info;
+       const uint8_t *code;
+       uint32_t code_size;
        int retval;
 
        static const uint8_t erase_check_code[] = {
 #include "../../contrib/loaders/erase_check/armv7m_erase_check.inc"
        };
+       static const uint8_t zero_erase_check_code[] = {
+#include "../../contrib/loaders/erase_check/armv7m_0_erase_check.inc"
+       };
+
+       switch (erased_value) {
+       case 0x00:
+               code = zero_erase_check_code;
+               code_size = sizeof(zero_erase_check_code);
+               break;
+       case 0xff:
+       default:
+               code = erase_check_code;
+               code_size = sizeof(erase_check_code);
+       }
 
        /* make sure we have a working area */
-       if (target_alloc_working_area(target, sizeof(erase_check_code),
+       if (target_alloc_working_area(target, code_size,
                &erase_check_algorithm) != ERROR_OK)
                return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
 
        retval = target_write_buffer(target, erase_check_algorithm->address,
-                       sizeof(erase_check_code), (uint8_t *)erase_check_code);
+                       code_size, code);
        if (retval != ERROR_OK)
                goto cleanup;
 
@@ -759,7 +775,7 @@ int armv7m_blank_check_memory(struct target *target,
        buf_set_u32(reg_params[1].value, 0, 32, count);
 
        init_reg_param(&reg_params[2], "r2", 32, PARAM_IN_OUT);
-       buf_set_u32(reg_params[2].value, 0, 32, 0xff);
+       buf_set_u32(reg_params[2].value, 0, 32, erased_value);
 
        retval = target_run_algorithm(target,
                        0,
@@ -767,7 +783,7 @@ int armv7m_blank_check_memory(struct target *target,
                        3,
                        reg_params,
                        erase_check_algorithm->address,
-                       erase_check_algorithm->address + (sizeof(erase_check_code) - 2),
+                       erase_check_algorithm->address + (code_size - 2),
                        10000,
                        &armv7m_info);