mirror of https://github.com/wolfSSL/wolfBoot.git
Fixed address alignment, TZEN=0 mode not yet working
parent
d642231344
commit
5614c75f1e
3
arch.mk
3
arch.mk
|
@ -76,7 +76,8 @@ ifeq ($(ARCH),ARM)
|
||||||
|
|
||||||
ifeq ($(TARGET),stm32l5)
|
ifeq ($(TARGET),stm32l5)
|
||||||
CORTEX_M33=1
|
CORTEX_M33=1
|
||||||
CFLAGS+=-Ihal
|
CFLAGS+=-Ihal -DCORTEX_M33
|
||||||
|
ARCH_FLASH_OFFSET=0x08000000
|
||||||
endif
|
endif
|
||||||
|
|
||||||
## Cortex-M CPU
|
## Cortex-M CPU
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
ARCH?=ARM
|
ARCH?=ARM
|
||||||
|
TZEN?=1
|
||||||
TARGET?=stm32l5
|
TARGET?=stm32l5
|
||||||
SIGN?=ECC256
|
SIGN?=ECC256
|
||||||
HASH?=SHA256
|
HASH?=SHA256
|
||||||
DEBUG?=0
|
DEBUG?=1
|
||||||
VTOR?=1
|
VTOR?=1
|
||||||
CORTEX_M0?=0
|
CORTEX_M0?=0
|
||||||
CORTEX_M33?=1
|
CORTEX_M33?=1
|
||||||
|
@ -10,7 +11,7 @@ NO_ASM?=0
|
||||||
EXT_FLASH?=0
|
EXT_FLASH?=0
|
||||||
SPI_FLASH?=0
|
SPI_FLASH?=0
|
||||||
ALLOW_DOWNGRADE?=0
|
ALLOW_DOWNGRADE?=0
|
||||||
NVM_FLASH_WRITEONCE?=0
|
NVM_FLASH_WRITEONCE?=1
|
||||||
WOLFBOOT_VERSION?=1
|
WOLFBOOT_VERSION?=1
|
||||||
V?=0
|
V?=0
|
||||||
SPMATH?=1
|
SPMATH?=1
|
||||||
|
|
|
@ -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
|
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)
|
- NOTE: STM32CubeProgrammer V2.3.0 is required (v2.4.0 has a known bug for STM32L5)
|
||||||
- typical path: C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin
|
|
||||||
|
|
||||||
### How to use it
|
### 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`
|
- `STM32_Programmer_CLI -c port=swd -d .\test-app\image_v1_signed.bin 0x8040000`
|
||||||
6. RED LD9 will be on
|
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
|
## STM32L0x3
|
||||||
|
|
||||||
|
|
|
@ -280,7 +280,7 @@ int RAMFUNCTION hal_flash_write(uint32_t address, const uint8_t *data, int len)
|
||||||
flash_clear_errors(0);
|
flash_clear_errors(0);
|
||||||
|
|
||||||
src = (uint32_t *)data;
|
src = (uint32_t *)data;
|
||||||
dst = (uint32_t *)(address + FLASHMEM_ADDRESS_SPACE);
|
dst = (uint32_t *)address;
|
||||||
|
|
||||||
while (i < len) {
|
while (i < len) {
|
||||||
FLASH_CR |= FLASH_CR_PG;
|
FLASH_CR |= FLASH_CR_PG;
|
||||||
|
@ -326,18 +326,22 @@ int RAMFUNCTION hal_flash_erase(uint32_t address, int len)
|
||||||
return -1;
|
return -1;
|
||||||
end_address = address + len - 1;
|
end_address = address + len - 1;
|
||||||
for (p = address; p < end_address; p += FLASH_PAGE_SIZE) {
|
for (p = address; p < end_address; p += FLASH_PAGE_SIZE) {
|
||||||
// considering DBANK = 1
|
uint32_t reg;
|
||||||
if (p < (FLASH_BANK2_BASE -FLASHMEM_ADDRESS_SPACE) )
|
uint32_t base;
|
||||||
|
// considering DBANK = 1
|
||||||
|
if (p < (FLASH_BANK2_BASE) )
|
||||||
{
|
{
|
||||||
FLASH_CR &= ~FLASH_CR_BKER;
|
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;
|
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));
|
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 );
|
FLASH_CR = reg | ((((p - base) >> 11) << FLASH_CR_PNB_SHIFT) | FLASH_CR_PER );
|
||||||
DMB();
|
DMB();
|
||||||
FLASH_CR |= FLASH_CR_STRT;
|
FLASH_CR |= FLASH_CR_STRT;
|
||||||
flash_wait_complete(0);
|
flash_wait_complete(0);
|
||||||
|
|
|
@ -225,26 +225,37 @@ void isr_empty(void)
|
||||||
#else
|
#else
|
||||||
#define VTOR (*(volatile uint32_t *)(0xE000ED08))
|
#define VTOR (*(volatile uint32_t *)(0xE000ED08))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void *app_entry;
|
static void *app_entry;
|
||||||
static uint32_t app_end_stack;
|
static uint32_t app_end_stack;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
|
#if defined CORTEX_M33
|
||||||
|
|
||||||
/* Armv8 boot procedure */
|
/* Armv8 boot procedure */
|
||||||
void RAMFUNCTION do_boot(const uint32_t *app_offset)
|
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 */
|
/* Disable interrupts */
|
||||||
asm volatile("cpsid i");
|
asm volatile("cpsid i");
|
||||||
/* Update IV */
|
/* Update IV */
|
||||||
VTOR = ((uint32_t)app_offset);
|
VTOR = ((uint32_t)app_offset);
|
||||||
asm volatile("msr msplim, %0" ::"r"(0));
|
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));
|
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("mov r7, %0" ::"r"(app_entry));
|
||||||
asm volatile("bic.w r7, r7, #1");
|
asm volatile("bic.w r7, r7, #1");
|
||||||
/* Jump to non secure app_entry */
|
|
||||||
asm volatile("blxns r7" );
|
asm volatile("blxns r7" );
|
||||||
|
#else
|
||||||
|
asm volatile("msr msp, %0" ::"r"(app_end_stack));
|
||||||
|
asm volatile("mov pc, %0":: "r"(app_entry));
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
/* Armv6/v7 */
|
/* Armv6/v7 */
|
||||||
|
|
|
@ -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));
|
|
@ -1,7 +1,7 @@
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
FLASH (rx) : ORIGIN = ##WOLFBOOT_TEST_APP_ADDRESS##, LENGTH = ##WOLFBOOT_TEST_APP_SIZE##
|
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
|
SECTIONS
|
||||||
|
|
|
@ -60,11 +60,17 @@ ifeq ($(TARGET),stm32f7)
|
||||||
LSCRIPT_TEMPLATE=ARM-stm32f7.ld
|
LSCRIPT_TEMPLATE=ARM-stm32f7.ld
|
||||||
CFLAGS+=-DDUALBANK_SWAP
|
CFLAGS+=-DDUALBANK_SWAP
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(TARGET),stm32l5)
|
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
|
CFLAGS+=-mcpu=cortex-m33
|
||||||
|
LDFLAGS+=-mcpu=cortex-m33
|
||||||
endif
|
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)
|
ifeq ($(EXT_FLASH),1)
|
||||||
CFLAGS+=-DEXT_FLASH=1 -DPART_UPDATE_EXT=1
|
CFLAGS+=-DEXT_FLASH=1 -DPART_UPDATE_EXT=1
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue