contrib: change stm32 flash loader extension
[openocd/dsp568013.git] / contrib / loaders / flash / stm32x.S
blob7269e799fec7d2cfc3d787c7223b98b67bc8ca29
1 /***************************************************************************
2  *   Copyright (C) 2010 by Spencer Oliver                                  *
3  *   spen@spen-soft.co.uk                                                  *
4  *                                                                         *
5  *   This program is free software; you can redistribute it and/or modify  *
6  *   it under the terms of the GNU General Public License as published by  *
7  *   the Free Software Foundation; either version 2 of the License, or     *
8  *   (at your option) any later version.                                   *
9  *                                                                         *
10  *   This program is distributed in the hope that it will be useful,       *
11  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13  *   GNU General Public License for more details.                          *
14  *                                                                         *
15  *   You should have received a copy of the GNU General Public License     *
16  *   along with this program; if not, write to the                         *
17  *   Free Software Foundation, Inc.,                                       *
18  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
21         .text
22         .syntax unified
23         .cpu cortex-m3
24         .thumb
25         .thumb_func
26         .global write
29         r0 - source address
30         r1 - target address
31         r2 - count (halfword-16bit)
32         r3 - result
33         r4 - temp
36 #define STM32_FLASH_CR_OFFSET   0x10                    /* offset of CR register in FLASH struct */
37 #define STM32_FLASH_SR_OFFSET   0x0c                    /* offset of CR register in FLASH struct */
39 write:
40         ldr             r4, STM32_FLASH_BASE
41 write_half_word:
42         movs    r3, #0x01
43         str             r3, [r4, #STM32_FLASH_CR_OFFSET]        /* PG (bit0) == 1 => flash programming enabled */
44         ldrh    r3, [r0], #0x02                                         /* read one half-word from src, increment ptr */
45         strh    r3, [r1], #0x02                                         /* write one half-word from src, increment ptr */
46 busy:
47         ldr     r3, [r4, #STM32_FLASH_SR_OFFSET]
48         tst     r3, #0x01                                                       /* BSY (bit0) == 1 => operation in progress */
49         beq     busy                                                            /* wait more... */
50         tst             r3, #0x14                                                       /* PGERR (bit2) == 1 or WRPRTERR (bit4) == 1 => error */
51         bne             exit                                                            /* fail... */
52         subs    r2, r2, #0x01                                           /* decrement counter */
53         bne             write_half_word                                         /* write next half-word if anything left */
54 exit:
55         bkpt    #0x00
57 STM32_FLASH_BASE: .word 0x40022000                              /* base address of FLASH struct */