This is an automated email from Gerrit.

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

-- gerrit

commit f7d51f73b8b24450ada1dcfaefc0b8b6ac43b646
Author: Spencer Oliver <[email protected]>
Date:   Fri Dec 7 11:13:15 2012 +0000

    flash: cleanup stm32lx driver
    
    No functional changes:
    use memcpy for byte writes and change loader to using bytes.
    
    Change-Id: Ie0164a30388f018dd00e752cf5ff87d4f96ced97
    Signed-off-by: Spencer Oliver <[email protected]>

diff --git a/src/flash/nor/stm32lx.c b/src/flash/nor/stm32lx.c
index ce41f94..1295064 100644
--- a/src/flash/nor/stm32lx.c
+++ b/src/flash/nor/stm32lx.c
@@ -212,44 +212,34 @@ static int stm32lx_write_half_pages(struct flash_bank 
*bank, uint8_t *buffer,
                uint32_t offset, uint32_t count)
 {
        struct target *target = bank->target;
-       uint32_t buffer_size = 4096 * 4;
+       uint32_t buffer_size = 16384;
        struct working_area *write_algorithm;
        struct working_area *source;
        uint32_t address = bank->base + offset;
 
-       struct reg_param reg_params[5];
+       struct reg_param reg_params[3];
        struct armv7m_algorithm armv7m_info;
 
        int retval = ERROR_OK;
-       uint32_t reg32;
-
-       /* see contib/loaders/flash/stm32lx.s for src */
 
-       static const uint16_t stm32lx_flash_write_code_16[] = {
-       /*      00000000 <write_word-0x4>: */
-                       0x2300, /* 0:   2300            movs    r3, #0 */
-                       0xe004, /* 2:   e004            b.n     e <test_done> */
+       /* see contib/loaders/flash/stm32lx.S for src */
 
-                       /*      00000004 <write_word>: */
-                       0xf851, 0xcb04, /* 4:   f851 cb04       ldr.w   ip, 
[r1], #4 */
-                       0xf840, 0xcb04, /* 8:   f840 cb04       str.w   ip, 
[r0], #4 */
-                       0x3301, /* c:   3301            adds    r3, #1 */
+       static const uint8_t stm32lx_flash_write_code[] = {
+               /* write_word: */
+               0x00, 0x23,             /* movs r3, #0 */
+               0x04, 0xe0,             /* b test_done */
 
-                       /*      0000000e <test_done>: */
-                       0x4293, /* e:   4293            cmp     r3, r2 */
-                       0xd3f8, /* 10:  d3f8            bcc.n   4 <write_word> 
*/
-                       0xbe00, /* 12:  be00            bkpt    0x0000 */
+               /* write_word: */
+               0x51, 0xf8, 0x04, 0xcb, /* ldr ip, [r1], #4 */
+               0x40, 0xf8, 0x04, 0xcb, /* str ip, [r0], #4 */
+               0x01, 0x33,             /* adds r3, #1 */
 
-                       };
+               /* test_done: */
+               0x93, 0x42,             /* cmp r3, r2 */
+               0xf8, 0xd3,             /* bcc write_word */
+               0x00, 0xbe,             /* bkpt 0 */
+       };
 
-       /* Flip endian */
-       uint8_t stm32lx_flash_write_code[sizeof(stm32lx_flash_write_code_16)];
-       for (unsigned int i = 0; i < sizeof(stm32lx_flash_write_code_16) / 2; 
i++) {
-               stm32lx_flash_write_code[i * 2 + 0] = 
stm32lx_flash_write_code_16[i]
-                               & 0xff;
-               stm32lx_flash_write_code[i * 2 + 1] = 
(stm32lx_flash_write_code_16[i]
-                               >> 8) & 0xff;
-       }
        /* Check if there is an even number of half pages (128bytes) */
        if (count % 128) {
                LOG_ERROR("there should be an even number "
@@ -257,14 +247,12 @@ static int stm32lx_write_half_pages(struct flash_bank 
*bank, uint8_t *buffer,
                return ERROR_FAIL;
        }
 
-       /* Allocate working area */
-       reg32 = sizeof(stm32lx_flash_write_code);
-       /* Add bytes to make 4byte aligned */
-       reg32 += (4 - (reg32 % 4)) % 4;
-       retval = target_alloc_working_area(target, reg32,
-                       &write_algorithm);
-       if (retval != ERROR_OK)
-               return retval;
+       /* flash write code */
+       if (target_alloc_working_area(target, sizeof(stm32lx_flash_write_code),
+                       &write_algorithm) != ERROR_OK) {
+               LOG_DEBUG("no working area for block memory writes");
+               return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+       };
 
        /* Write the flashing code */
        retval = target_write_buffer(target,
@@ -277,8 +265,7 @@ static int stm32lx_write_half_pages(struct flash_bank 
*bank, uint8_t *buffer,
        }
 
        /* Allocate half pages memory */
-       while (target_alloc_working_area_try(target, buffer_size, &source)
-                       != ERROR_OK) {
+       while (target_alloc_working_area_try(target, buffer_size, &source) != 
ERROR_OK) {
                if (buffer_size > 1024)
                        buffer_size -= 1024;
                else
@@ -293,15 +280,12 @@ static int stm32lx_write_half_pages(struct flash_bank 
*bank, uint8_t *buffer,
                        return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
                }
        }
-       LOG_DEBUG("allocated working area for data (%" PRIx32 " bytes)", 
buffer_size);
 
        armv7m_info.common_magic = ARMV7M_COMMON_MAGIC;
        armv7m_info.core_mode = ARMV7M_MODE_ANY;
        init_reg_param(&reg_params[0], "r0", 32, PARAM_OUT);
        init_reg_param(&reg_params[1], "r1", 32, PARAM_OUT);
        init_reg_param(&reg_params[2], "r2", 32, PARAM_OUT);
-       init_reg_param(&reg_params[3], "r3", 32, PARAM_IN_OUT);
-       init_reg_param(&reg_params[4], "r4", 32, PARAM_OUT);
 
        /* Enable half-page write */
        retval = stm32lx_enable_write_half_page(bank);
@@ -312,7 +296,6 @@ static int stm32lx_write_half_pages(struct flash_bank 
*bank, uint8_t *buffer,
                destroy_reg_param(&reg_params[0]);
                destroy_reg_param(&reg_params[1]);
                destroy_reg_param(&reg_params[2]);
-               destroy_reg_param(&reg_params[3]);
                return retval;
        }
 
@@ -322,8 +305,7 @@ static int stm32lx_write_half_pages(struct flash_bank 
*bank, uint8_t *buffer,
                this_count = (count > buffer_size) ? buffer_size : count;
 
                /* Write the next half pages */
-               retval = target_write_buffer(target, source->address, 
this_count,
-                               buffer);
+               retval = target_write_buffer(target, source->address, 
this_count, buffer);
                if (retval != ERROR_OK)
                        break;
 
@@ -361,10 +343,10 @@ static int stm32lx_write_half_pages(struct flash_bank 
*bank, uint8_t *buffer,
        destroy_reg_param(&reg_params[0]);
        destroy_reg_param(&reg_params[1]);
        destroy_reg_param(&reg_params[2]);
-       destroy_reg_param(&reg_params[3]);
 
        return retval;
 }
+
 static int stm32lx_write(struct flash_bank *bank, uint8_t *buffer,
                uint32_t offset, uint32_t count)
 {
@@ -420,10 +402,7 @@ static int stm32lx_write(struct flash_bank *bank, uint8_t 
*buffer,
 
        while (words_remaining > 0) {
                uint32_t value;
-               uint8_t *p = buffer + bytes_written;
-
-               /* Prepare the word, Little endian conversion */
-               value = p[0] + (p[1] << 8) + (p[2] << 16) + (p[3] << 24);
+               memcpy(&value, buffer + bytes_written, sizeof(uint32_t));
 
                retval = target_write_u32(target, address, value);
                if (retval != ERROR_OK)
@@ -442,7 +421,7 @@ static int stm32lx_write(struct flash_bank *bank, uint8_t 
*buffer,
                uint8_t last_word[4] = {0xff, 0xff, 0xff, 0xff};
 
                /* copy the last remaining bytes into the write buffer */
-               memcpy(last_word, buffer+bytes_written, bytes_remaining);
+               memcpy(last_word, buffer + bytes_written, bytes_remaining);
 
                retval = target_write_buffer(target, address, 4, last_word);
                if (retval != ERROR_OK)

-- 

------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to