Skip to content

Commit b6b77f0

Browse files
authored
Merge pull request #494 from danielinux/atsama5d3
Support for Microchip SAMA5D3
2 parents 0367597 + c80937b commit b6b77f0

16 files changed

Lines changed: 1861 additions & 60 deletions

File tree

.gdbinit

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
tar rem:3333
21
file wolfboot.elf
2+
tar rem:3333
33
add-symbol-file test-app/image.elf
44
foc c
55

.github/workflows/test-configs.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ jobs:
2222
# arch: riscv
2323
# config-file: ./config/examples/hifive.config
2424
#
25+
#
26+
sama5d3_test:
27+
uses: ./.github/workflows/test-build.yml
28+
with:
29+
arch: arm
30+
config-file: ./config/examples/sama5d3.config
31+
2532
same51_test:
2633
uses: ./.github/workflows/test-build.yml
2734
with:

Makefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,11 @@ ifeq ($(TARGET),nxp_t1024)
130130
MAIN_TARGET:=factory_wstage1.bin
131131
endif
132132

133+
ifeq ($(TARGET),sama5d3)
134+
MAIN_TARGET:=wolfboot.bin test-app/image_v1_signed.bin
135+
endif
136+
137+
133138
ifeq ($(FLASH_OTP_KEYSTORE),1)
134139
MAIN_TARGET+=tools/keytools/otp/otp-keystore-primer.bin
135140
endif

arch.mk

Lines changed: 80 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ ifeq ($(ARCH),ARM)
7070
CROSS_COMPILE?=arm-none-eabi-
7171
CFLAGS+=-mthumb -mlittle-endian -mthumb-interwork -DARCH_ARM
7272
LDFLAGS+=-mthumb -mlittle-endian -mthumb-interwork
73-
OBJS+=src/boot_arm.o
7473

7574
## Target specific configuration
7675
ifeq ($(TARGET),samr21)
@@ -176,88 +175,111 @@ ifeq ($(ARCH),ARM)
176175
SPI_TARGET=stm32
177176
endif
178177

179-
## Cortex-M CPU
180-
ifeq ($(CORTEX_M33),1)
181-
CFLAGS+=-mcpu=cortex-m33 -DCORTEX_M33
182-
LDFLAGS+=-mcpu=cortex-m33
183-
ifeq ($(TZEN),1)
184-
OBJS+=hal/stm32_tz.o
185-
CFLAGS+=-mcmse
186-
ifeq ($(WOLFCRYPT_TZ),1)
187-
SECURE_OBJS+=./src/wc_callable.o
188-
SECURE_OBJS+=./lib/wolfssl/wolfcrypt/src/random.o
189-
CFLAGS+=-DWOLFCRYPT_SECURE_MODE
190-
SECURE_LDFLAGS+=-Wl,--cmse-implib -Wl,--out-implib=./src/wc_secure_calls.o
191-
endif
192-
endif # TZEN=1
178+
ifeq ($(TARGET),sama5d3)
179+
CORTEX_A5=1
180+
UPDATE_OBJS:=src/update_ram.o
181+
CFLAGS+=-DWOLFBOOT_DUALBOOT -DEXT_FLASH -DNAND_FLASH -fno-builtin -ffreestanding
182+
#CFLAGS+=-DWOLFBOOT_USE_STDLIBC
183+
endif
184+
185+
## Cortex CPU
186+
187+
ifeq ($(CORTEX_A5),1)
188+
FPU=-mfpu=vfp4-d16
189+
CFLAGS+=-mcpu=cortex-a5 -mtune=cortex-a5 -static -z noexecstack
190+
LDLAGS+=-mcpu=cortex-a5 -mtune=cortex-a5 -mtune=cortex-a5 -static -z noexecstack -Ttext 0x300000
191+
# Cortex-A uses boot_arm32.o
192+
OBJS+=src/boot_arm32.o src/boot_arm32_start.o
193193
ifeq ($(NO_ASM),1)
194-
ifeq ($(SPMATH),1)
195-
ifeq ($(NO_ASM),1)
196-
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
197-
else
198-
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM
199-
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o
200-
endif
201-
endif
194+
MATH_OBJS+=./lib/wolfssl/wolfcrypt/src/sp_c32.o
202195
else
203-
ifeq ($(SPMATH),1)
204-
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM
205-
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o
206-
endif
196+
MATH_OBJS+=./lib/wolfssl/wolfcrypt/src/sp_arm32.o
197+
CFLAGS+=-DWOLFSSL_SP_ARM32_ASM
207198
endif
208199
else
209-
ifeq ($(CORTEX_M7),1)
210-
CFLAGS+=-mcpu=cortex-m7
211-
LDFLAGS+=-mcpu=cortex-m7
212-
ifeq ($(SPMATH),1)
213-
ifeq ($(NO_ASM),1)
214-
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
215-
else
200+
# All others use boot_arm.o
201+
OBJS+=src/boot_arm.o
202+
ifeq ($(CORTEX_M33),1)
203+
CFLAGS+=-mcpu=cortex-m33 -DCORTEX_M33
204+
LDFLAGS+=-mcpu=cortex-m33
205+
ifeq ($(TZEN),1)
206+
OBJS+=hal/stm32_tz.o
207+
CFLAGS+=-mcmse
208+
ifeq ($(WOLFCRYPT_TZ),1)
209+
SECURE_OBJS+=./src/wc_callable.o
210+
SECURE_OBJS+=./lib/wolfssl/wolfcrypt/src/random.o
211+
CFLAGS+=-DWOLFCRYPT_SECURE_MODE
212+
SECURE_LDFLAGS+=-Wl,--cmse-implib -Wl,--out-implib=./src/wc_secure_calls.o
213+
endif
214+
endif # TZEN=1
215+
ifeq ($(NO_ASM),1)
216+
ifeq ($(SPMATH),1)
217+
ifeq ($(NO_ASM),1)
218+
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
219+
else
220+
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM
221+
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o
222+
endif
223+
endif
224+
else
225+
ifeq ($(SPMATH),1)
216226
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM
217227
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o
218228
endif
219229
endif
220230
else
221-
ifeq ($(CORTEX_M0),1)
222-
CFLAGS+=-mcpu=cortex-m0
223-
LDFLAGS+=-mcpu=cortex-m0
231+
ifeq ($(CORTEX_M7),1)
232+
CFLAGS+=-mcpu=cortex-m7
233+
LDFLAGS+=-mcpu=cortex-m7
224234
ifeq ($(SPMATH),1)
225235
ifeq ($(NO_ASM),1)
226236
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
227237
else
228-
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_THUMB_ASM
229-
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_armthumb.o
238+
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM
239+
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o
230240
endif
231241
endif
232242
else
233-
ifeq ($(CORTEX_M3),1)
234-
235-
CFLAGS+=-mcpu=cortex-m3
236-
LDFLAGS+=-mcpu=cortex-m3
243+
ifeq ($(CORTEX_M0),1)
244+
CFLAGS+=-mcpu=cortex-m0
245+
LDFLAGS+=-mcpu=cortex-m0
246+
ifeq ($(SPMATH),1)
247+
ifeq ($(NO_ASM),1)
248+
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
249+
else
250+
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_THUMB_ASM
251+
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_armthumb.o
252+
endif
253+
endif
254+
else
255+
ifeq ($(CORTEX_M3),1)
256+
CFLAGS+=-mcpu=cortex-m3
257+
LDFLAGS+=-mcpu=cortex-m3
258+
ifeq ($(NO_ASM),1)
259+
ifeq ($(SPMATH),1)
260+
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
261+
endif
262+
else
263+
ifeq ($(SPMATH),1)
264+
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM -DWOLFSSL_SP_NO_UMAAL
265+
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o
266+
endif
267+
endif
268+
else
269+
# default Cortex M4
270+
CFLAGS+=-mcpu=cortex-m4
271+
LDFLAGS+=-mcpu=cortex-m4
237272
ifeq ($(NO_ASM),1)
238273
ifeq ($(SPMATH),1)
239274
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
240275
endif
241276
else
277+
CFLAGS+=-fomit-frame-pointer # required with debug builds only
242278
ifeq ($(SPMATH),1)
243-
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM -DWOLFSSL_SP_NO_UMAAL
279+
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM
244280
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o
245281
endif
246282
endif
247-
else
248-
# default Cortex M4
249-
CFLAGS+=-mcpu=cortex-m4
250-
LDFLAGS+=-mcpu=cortex-m4
251-
ifeq ($(NO_ASM),1)
252-
ifeq ($(SPMATH),1)
253-
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
254-
endif
255-
else
256-
CFLAGS+=-fomit-frame-pointer # required with debug builds only
257-
ifeq ($(SPMATH),1)
258-
CFLAGS+=-DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM
259-
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o
260-
endif
261283
endif
262284
endif
263285
endif

config/examples/sama5d3.config

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
ARCH?=ARM
2+
TARGET?=sama5d3
3+
SIGN?=ECC256
4+
HASH?=SHA256
5+
DEBUG?=0
6+
VTOR?=1
7+
CORTEX_M0?=0
8+
NO_ASM?=0
9+
EXT_FLASH?=1
10+
NAND_FLASH?=1
11+
SPI_FLASH?=0
12+
V?=0
13+
SPMATH?=1
14+
WOLFBOOT_PARTITION_SIZE?=0x1000000
15+
WOLFBOOT_NO_PARTITIONS=0
16+
WOLFBOOT_SECTOR_SIZE?=0x1000
17+
WOLFBOOT_LOAD_ADDRESS=0x20100800
18+
WOLFBOOT_LOAD_DTS_ADDRESS=0x21100800
19+
WOLFBOOT_PARTITION_BOOT_ADDRESS=0x400000
20+
WOLFBOOT_PARTITION_UPDATE_ADDRESS=0x800000
21+
WOLFBOOT_PARTITION_SWAP_ADDRESS=0x0
22+
NO_XIP=1
23+
IMAGE_HEADER_SIZE=2048

docs/Targets.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ This README describes configuration of supported targets.
88
* [Cypress PSoC-6](#cypress-psoc-6)
99
* [Infineon AURIX TC3xx](#infineon-aurix-tc3xx)
1010
* [Intel x86-64 Intel FSP](#intel-x86_64-with-intel-fsp-support)
11+
* [Microchip SAMA5D3](#microchip-sama5d3)
1112
* [Microchip SAME51](#microchip-same51)
1213
* [NXP Kinetis](#nxp-kinetis)
1314
* [NXP LPC54xxx](#nxp-lpc54xxx)
@@ -1405,6 +1406,60 @@ the monitor command sequence below:
14051406
(gdb) mon psoc6 reset_halt
14061407
```
14071408

1409+
1410+
## Microchip SAMA5D3
1411+
1412+
SAMA5D3 is a Cortex-A5 Microprocessor. The ATSAMA5D3-XPLAINED is the evaluation
1413+
board used for wolfBoot port, which also equips a 2MB NAND flash. WolfBoot
1414+
replaces the default first stage bootloader (at91bootstrap).
1415+
1416+
### Building wolfBoot
1417+
1418+
An example configuration file is provided.
1419+
1420+
`cp config/examples/sama5d3.config .config`
1421+
1422+
Run make to build wolfBoot.bin and the test application
1423+
1424+
`make`
1425+
1426+
### Programming wolfboot.bin into NAND flash
1427+
1428+
To flash any firmware image into the device NVMs, you need the tool `sam-ba`,
1429+
distributed by Microchip.
1430+
1431+
This procedure has been tested using sam-ba v.3.8 using ATSAMA5D3-XPLAINED board,
1432+
with JP6 (aka the `SPI_CS` jumper) removed, so the system boots from NAND by
1433+
default.
1434+
1435+
Step 1: install the tool, connect a J-Link device to the J24 JTAG connector then run the
1436+
following command to activate "lowlevel" mode:
1437+
1438+
`sam-ba -p j-link -b sama5d3-xplained -t 5 -a lowlevel`
1439+
1440+
Step 2: erase the entire NAND flash:
1441+
1442+
`sam-ba -p j-link -b sama5d3-xplained -t 5 -a nandflash -c erase`
1443+
1444+
Step 3: program `wolfboot.bin` to the beginning of the flash:
1445+
1446+
`sam-ba -p j-link -b sama5d3-xplained -t 5 -a nandflash -c writeboot:wolfboot.bin`
1447+
1448+
### Programming the test application into NAND flash
1449+
1450+
The application can be written to a second partition in nand,
1451+
e.g. at address "0x40000"
1452+
1453+
`sam-ba -p j-link -b sama5d3-xplained -t 5 -a nandflash -c write:test-app/image_v1_signed.bin:0x400000`
1454+
1455+
With the example configuration, wolfBoot will evaluate two alternative images
1456+
at addresses 0x400000 and 0x800000, authenticate, load to DRAM and stage from
1457+
`LOAD_ADDRESS`.
1458+
1459+
Ensure that the application is compiled to run from `LOAD_ADDRESS`.
1460+
Check `test-app/ARM-sama5d3.ld` for details.
1461+
1462+
14081463
## Microchip SAME51
14091464

14101465
SAME51 is a Cortex-M4 microcontroller with a dual-bank, 1MB flash memory divided

0 commit comments

Comments
 (0)