Fixed address alignment, TZEN=0 mode not yet working

pull/50/head
Daniele Lacamera 2020-06-23 12:28:59 +02:00 committed by David Garske
parent d642231344
commit 5614c75f1e
9 changed files with 105 additions and 16 deletions

View File

@ -76,7 +76,8 @@ ifeq ($(ARCH),ARM)
ifeq ($(TARGET),stm32l5)
CORTEX_M33=1
CFLAGS+=-Ihal
CFLAGS+=-Ihal -DCORTEX_M33
ARCH_FLASH_OFFSET=0x08000000
endif
## Cortex-M CPU

View File

@ -1,8 +1,9 @@
ARCH?=ARM
TZEN?=1
TARGET?=stm32l5
SIGN?=ECC256
HASH?=SHA256
DEBUG?=0
DEBUG?=1
VTOR?=1
CORTEX_M0?=0
CORTEX_M33?=1
@ -10,7 +11,7 @@ NO_ASM?=0
EXT_FLASH?=0
SPI_FLASH?=0
ALLOW_DOWNGRADE?=0
NVM_FLASH_WRITEONCE?=0
NVM_FLASH_WRITEONCE?=1
WOLFBOOT_VERSION?=1
V?=0
SPMATH?=1

View File

@ -84,8 +84,7 @@ SECWM1_PSTRT=0x0 SECWM1_PEND=0x7F All 128 pages of internal Flash Bank1 set as
SECWM2_PSTRT=0x1 SECWM2_PEND=0x0 No page of internal Flash Bank2 set as secure, hence Bank2 non-secure
```
- NOTE: STM32CubeProgrammer V2.3.0 is recommended (v2.4.0 has a known bug for STM32L5)
- typical path: C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin
- NOTE: STM32CubeProgrammer V2.3.0 is required (v2.4.0 has a known bug for STM32L5)
### How to use it
@ -100,6 +99,16 @@ SECWM2_PSTRT=0x1 SECWM2_PEND=0x0 No page of internal Flash Bank2 set as secur
- `STM32_Programmer_CLI -c port=swd -d .\test-app\image_v1_signed.bin 0x8040000`
6. RED LD9 will be on
### Debugging
- STM32CubeIDE v.1.3.0 required
- Run the debugger via:
`ST-LINK_gdbserver -d -cp /opt/st/stm32cubeide_1.3.0/plugins/com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.linux64_1.3.0.202002181050/tools/bin -e -r 1 -p 3333`
- Connect with arm-none-eabi-gdb
## STM32L0x3

View File

@ -280,7 +280,7 @@ int RAMFUNCTION hal_flash_write(uint32_t address, const uint8_t *data, int len)
flash_clear_errors(0);
src = (uint32_t *)data;
dst = (uint32_t *)(address + FLASHMEM_ADDRESS_SPACE);
dst = (uint32_t *)address;
while (i < len) {
FLASH_CR |= FLASH_CR_PG;
@ -326,18 +326,22 @@ int RAMFUNCTION hal_flash_erase(uint32_t address, int len)
return -1;
end_address = address + len - 1;
for (p = address; p < end_address; p += FLASH_PAGE_SIZE) {
// considering DBANK = 1
if (p < (FLASH_BANK2_BASE -FLASHMEM_ADDRESS_SPACE) )
uint32_t reg;
uint32_t base;
// considering DBANK = 1
if (p < (FLASH_BANK2_BASE) )
{
FLASH_CR &= ~FLASH_CR_BKER;
base = FLASHMEM_ADDRESS_SPACE;
}
if(p>=(FLASH_BANK2_BASE -FLASHMEM_ADDRESS_SPACE) && (p <= (FLASH_TOP -FLASHMEM_ADDRESS_SPACE) ))
if(p>=(FLASH_BANK2_BASE) && (p <= (FLASH_TOP) ))
{
FLASH_CR |= FLASH_CR_BKER;
base = FLASH_BANK2_BASE;
}
uint32_t reg = FLASH_CR & (~((FLASH_CR_PNB_MASK << FLASH_CR_PNB_SHIFT)| FLASH_CR_PER));
FLASH_CR = reg | (((p >> 11) << FLASH_CR_PNB_SHIFT) | FLASH_CR_PER );
reg = FLASH_CR & (~((FLASH_CR_PNB_MASK << FLASH_CR_PNB_SHIFT)| FLASH_CR_PER));
FLASH_CR = reg | ((((p - base) >> 11) << FLASH_CR_PNB_SHIFT) | FLASH_CR_PER );
DMB();
FLASH_CR |= FLASH_CR_STRT;
flash_wait_complete(0);

View File

@ -225,26 +225,37 @@ void isr_empty(void)
#else
#define VTOR (*(volatile uint32_t *)(0xE000ED08))
#endif
static void *app_entry;
static uint32_t app_end_stack;
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
#if defined CORTEX_M33
/* Armv8 boot procedure */
void RAMFUNCTION do_boot(const uint32_t *app_offset)
{
/* Get stack pointer, entry point */
app_end_stack = (*((uint32_t *)(app_offset)));
app_entry = (void *)(*((uint32_t *)(app_offset + 1)));
/* Disable interrupts */
asm volatile("cpsid i");
/* Update IV */
VTOR = ((uint32_t)app_offset);
asm volatile("msr msplim, %0" ::"r"(0));
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
asm volatile("msr msp_ns, %0" ::"r"(app_end_stack));
/* Jump to non secure app_entry */
asm volatile("mov r7, %0" ::"r"(app_entry));
asm volatile("bic.w r7, r7, #1");
/* Jump to non secure app_entry */
asm volatile("blxns r7" );
#else
asm volatile("msr msp, %0" ::"r"(app_end_stack));
asm volatile("mov pc, %0":: "r"(app_entry));
#endif
}
#else
/* Armv6/v7 */

View File

@ -0,0 +1,47 @@
MEMORY
{
FLASH (rx) : ORIGIN = ##WOLFBOOT_TEST_APP_ADDRESS##, LENGTH = ##WOLFBOOT_TEST_APP_SIZE##
RAM (rwx) : ORIGIN = 0x20018000, LENGTH = 16K /* Run in lowmem */
}
SECTIONS
{
.text :
{
_start_text = .;
. = ALIGN(8);
KEEP(*(.isr_vector))
. = ALIGN(8);
*(.init)
*(.fini)
*(.text*)
*(.rodata*)
. = ALIGN(8);
_end_text = .;
} > FLASH
_stored_data = .;
.data : AT (_stored_data)
{
_start_data = .;
KEEP(*(.data*))
. = ALIGN(8);
KEEP(*(.ramcode))
. = ALIGN(8);
_end_data = .;
} > RAM
.bss :
{
_start_bss = .;
*(.bss*)
*(COMMON)
. = ALIGN(8);
_end_bss = .;
_end = .;
} > RAM
}
PROVIDE(_start_heap = _end);
PROVIDE(_end_stack = ORIGIN(RAM) + LENGTH(RAM));

View File

@ -1,7 +1,7 @@
MEMORY
{
FLASH (rx) : ORIGIN = ##WOLFBOOT_TEST_APP_ADDRESS##, LENGTH = ##WOLFBOOT_TEST_APP_SIZE##
RAM (rwx) : ORIGIN = 0x20018000, LENGTH = 16K /* Run in lowmem */
RAM (rwx) : ORIGIN = 0x30000000, LENGTH = 16K /* Run in lowmem */
}
SECTIONS

View File

@ -60,11 +60,17 @@ ifeq ($(TARGET),stm32f7)
LSCRIPT_TEMPLATE=ARM-stm32f7.ld
CFLAGS+=-DDUALBANK_SWAP
endif
ifeq ($(TARGET),stm32l5)
LSCRIPT_TEMPLATE=ARM-stm32l5.ld
ifeq ($(TZEN),1)
LSCRIPT_TEMPLATE=ARM-stm32l5-ns.ld
else
LSCRIPT_TEMPLATE=ARM-stm32l5.ld
endif
CFLAGS+=-mcpu=cortex-m33
LDFLAGS+=-mcpu=cortex-m33
endif
LDFLAGS:=$(CFLAGS) -T $(LSCRIPT) -Wl,-gc-sections -Wl,-Map=image.map
LDFLAGS+=$(CFLAGS) -T $(LSCRIPT) -Wl,-gc-sections -Wl,-Map=image.map
ifeq ($(EXT_FLASH),1)
CFLAGS+=-DEXT_FLASH=1 -DPART_UPDATE_EXT=1

View File

@ -0,0 +1,10 @@
#!/bin/bash
# SIZE is WOLFBOOT_PARTITION_SIZE - 5
SIZE=129019
VERSION=8
APP=test-app/image_v"$VERSION"_signed.bin
./tools/keytools/sign.py test-app/image.bin ecc256.der $VERSION
dd if=/dev/zero bs=$SIZE count=1 2>/dev/null | tr "\000" "\377" > update.bin
dd if=$APP of=update.bin bs=1 conv=notrunc
printf "pBOOT" >> update.bin