-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge commit 'refs/changes/86/8086/2' of https://review.openocd.org/o…
…penocd into h7rx_patch stm32h7rs_cfg
- Loading branch information
Showing
4 changed files
with
614 additions
and
112 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
/* SPDX-License-Identifier: GPL-2.0-or-later */ | ||
|
||
/*************************************************************************** | ||
* Copyright (C) 2017 by STMicroelectronics * | ||
***************************************************************************/ | ||
|
||
.text | ||
.syntax unified | ||
.cpu cortex-m4 | ||
.thumb | ||
|
||
/* | ||
* Code limitations: | ||
* The workarea must have size multiple of 4 bytes, since R/W | ||
* operations are all at 32 bits. | ||
* The workarea must be big enough to contain rp, wp and data, thus the minimum | ||
* workarea size is: min_wa_size = sizeof(rp, wp, data) = 4 + 4 + sizeof(data). | ||
* - for 0x450 devices: sizeof(data) = 32 bytes, thus min_wa_size = 40 bytes. | ||
* - for 0x480 devices: sizeof(data) = 16 bytes, thus min_wa_size = 24 bytes. | ||
* To benefit from concurrent host write-to-buffer and target | ||
* write-to-flash, the workarea must be way bigger than the minimum. | ||
* | ||
* To avoid confusions the write word size is got from .block_size member of | ||
* struct stm32h7x_part_info defined in stm32h7x.c | ||
*/ | ||
|
||
/* | ||
* Params : | ||
* r0 = workarea start, status (out) | ||
* r1 = workarea end | ||
* r2 = target address | ||
* r3 = count (of write words) | ||
* r4 = size of write word | ||
* r5 = flash reg base | ||
* | ||
* Clobbered: | ||
* r6 - rp | ||
* r7 - wp, status, tmp | ||
* r8 - loop index, tmp | ||
*/ | ||
|
||
#define STM32_FLASH_CR_OFFSET 0x10 /* offset of CR register in FLASH struct */ | ||
#define STM32_FLASH_SR_OFFSET 0x14 /* offset of SR register in FLASH struct */ | ||
#define STM32_FLASH_ICR_OFFSET 0x28 /* offset of SR register in FLASH struct */ | ||
#define STM32_CR_PROG 0x00000002 /* PG */ | ||
#define STM32_SR_QW_MASK 0x00000004 /* QW */ | ||
#define STM32_SR_ERROR_MASK 0x1F2E0000 /* DBECCERR | SNECCERR | RDSERR | RDPERR | OPERR | ||
| INCERR | STRBERR | PGSERR | WRPERR */ | ||
|
||
.thumb_func | ||
.global _start | ||
_start: | ||
ldr r6, [r0, #4] /* read rp */ | ||
|
||
wait_fifo: | ||
ldr r7, [r0, #0] /* read wp */ | ||
cbz r7, exit /* abort if wp == 0, status = 0 */ | ||
subs r7, r7, r6 /* number of bytes available for read in r7 */ | ||
ittt mi /* if wrapped around */ | ||
addmi r7, r1 /* add size of buffer */ | ||
submi r7, r0 | ||
submi r7, #8 | ||
cmp r7, r4 /* wait until data buffer is full */ | ||
bcc wait_fifo | ||
|
||
mov r7, #STM32_CR_PROG | ||
str r7, [r5, #STM32_FLASH_CR_OFFSET] | ||
|
||
mov r8, #4 | ||
udiv r8, r4, r8 /* number of words is size of write word divided by 4*/ | ||
write_flash: | ||
dsb | ||
ldr r7, [r6], #0x04 /* read one word from src, increment ptr */ | ||
str r7, [r2], #0x04 /* write one word to dst, increment ptr */ | ||
dsb | ||
cmp r6, r1 /* if rp >= end of buffer ... */ | ||
it cs | ||
addcs r6, r0, #8 /* ... then wrap at buffer start */ | ||
subs r8, r8, #1 /* decrement loop index */ | ||
bne write_flash /* loop if not done */ | ||
|
||
busy: | ||
ldr r7, [r5, #STM32_FLASH_SR_OFFSET] | ||
tst r7, #STM32_SR_QW_MASK | ||
bne busy /* operation in progress, wait ... */ | ||
|
||
ldr r7, [r5, #STM32_FLASH_ICR_OFFSET] | ||
ldr r8, =STM32_SR_ERROR_MASK | ||
tst r7, r8 | ||
bne error /* fail... */ | ||
|
||
str r6, [r0, #4] /* store rp */ | ||
subs r3, r3, #1 /* decrement count */ | ||
bne wait_fifo /* loop if not done */ | ||
b exit | ||
|
||
error: | ||
movs r8, #0 | ||
str r8, [r0, #4] /* set rp = 0 on error */ | ||
|
||
exit: | ||
mov r0, r7 /* return status in r0 */ | ||
bkpt #0x00 | ||
|
||
.pool |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
/* Autogenerated with ../../../../src/helper/bin2char.sh */ | ||
0x46,0x68,0x07,0x68,0x77,0xb3,0xbf,0x1b,0x42,0xbf,0x7f,0x18,0x3f,0x1a,0x08,0x3f, | ||
0xa7,0x42,0xf6,0xd3,0x4f,0xf0,0x02,0x07,0x2f,0x61,0x4f,0xf0,0x04,0x08,0xb4,0xfb, | ||
0xf8,0xf8,0xbf,0xf3,0x4f,0x8f,0x56,0xf8,0x04,0x7b,0x42,0xf8,0x04,0x7b,0xbf,0xf3, | ||
0x4f,0x8f,0x8e,0x42,0x28,0xbf,0x00,0xf1,0x08,0x06,0xb8,0xf1,0x01,0x08,0xf0,0xd1, | ||
0x6f,0x69,0x17,0xf0,0x04,0x0f,0xfb,0xd1,0xaf,0x6a,0xdf,0xf8,0x1c,0x80,0x17,0xea, | ||
0x08,0x0f,0x03,0xd1,0x46,0x60,0x01,0x3b,0xd3,0xd1,0x03,0xe0,0x5f,0xf0,0x00,0x08, | ||
0xc0,0xf8,0x04,0x80,0x38,0x46,0x00,0xbe,0x00,0x00,0x2e,0x1f, |
Oops, something went wrong.