diff --git a/targets/stm32l442/Makefile b/targets/stm32l442/Makefile index 54dfb0a..7cc9832 100644 --- a/targets/stm32l442/Makefile +++ b/targets/stm32l442/Makefile @@ -1,93 +1,24 @@ -CC=arm-none-eabi-gcc -CP=arm-none-eabi-objcopy -SZ=arm-none-eabi-size -AR=arm-none-eabi-ar -# ST related -SRC = src/main.c src/init.c src/redirect.c src/flash.c src/rng.c src/led.c src/device.c -SRC += src/fifo.c src/crypto.c src/attestation.c -SRC += src/startup_stm32l432xx.s src/system_stm32l4xx.c -SRC += $(wildcard lib/*.c) $(wildcard lib/usbd/*.c) +all: + $(MAKE) -f application.mk -j8 -# FIDO2 lib -SRC += ../../fido2/util.c ../../fido2/u2f.c ../../fido2/test_power.c -SRC += ../../fido2/stubs.c ../../fido2/log.c ../../fido2/ctaphid.c ../../fido2/ctap.c -SRC += ../../fido2/ctap_parse.c ../../fido2/main.c - -# Crypto libs -SRC += ../../crypto/sha256/sha256.c ../../crypto/micro-ecc/uECC.c ../../crypto/tiny-AES-c/aes.c - - -OBJ1=$(SRC:.c=.o) -OBJ=$(OBJ1:.s=.o) - -INC = -Isrc/ -Isrc/cmsis/ -Ilib/ -Ilib/usbd/ -I../../fido2/ -I../../fido2/extensions -INC += -I../../tinycbor/src -I../../crypto/sha256 -I../../crypto/micro-ecc -INC += -I../../crypto/tiny-AES-c - -SEARCH=-L../../tinycbor/lib - -LDSCRIPT=stm32l432xx.ld - -CFLAGS= $(INC) - -TARGET=solo -HW=-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb - -# Nucleo board -#CHIP=STM32L432xx -# Solo -CHIP=STM32L442xx - -DEFINES = -D$(CHIP) -DAES256=1 -DUSE_FULL_LL_DRIVER -DAPP_CONFIG=\"app.h\" -# DEFINES += -DTEST_SOLO_STM32 -DTEST -DTEST_FIFO=1 - -CFLAGS=$(INC) -c $(DEFINES) -Wall -fdata-sections -ffunction-sections $(HW) -g -LDFLAGS_LIB=$(HW) $(SEARCH) -specs=nano.specs -specs=nosys.specs -Wl,--gc-sections -u _printf_float -lnosys -LDFLAGS=$(HW) $(LDFLAGS_LIB) -T$(LDSCRIPT) -Wl,-Map=$(TARGET).map,--cref -ltinycbor - - -.PRECIOUS: %.o - -all: $(TARGET).elf - $(SZ) $^ - -%.o: %.c - $(CC) $^ $(HW) -Os $(CFLAGS) -o $@ - -../../crypto/micro-ecc/uECC.o: ../../crypto/micro-ecc/uECC.c - $(CC) $^ $(HW) -O3 $(CFLAGS) -o $@ - -%.o: %.s - $(CC) $^ $(HW) -Os $(CFLAGS) -o $@ - -%.elf: $(OBJ) - $(CC) $^ $(HW) $(LDFLAGS) -o $@ - -%.hex: %.elf - $(CP) -O ihex $^ $(TARGET).hex - -bootloader: - $(MAKE) -f bootloader.mk +boot: + $(MAKE) -f bootloader.mk -j8 clean: - rm -f *.o src/*.o src/*.elf bootloader/*.o $(OBJ) + $(MAKE) -f application.mk clean + $(MAKE) -f bootloader.mk clean -flash: $(TARGET).hex - # STM32_Programmer_CLI -c port=SWD -halt -e all --readunprotect - STM32_Programmer_CLI -c port=SWD -halt -d $(TARGET).hex -rst - -flashall: - #$(MAKE) -f bootloader.mk -j8 - python .\merge_hex.py .\solo.hex .\bootloader.hex all.hex +flash: solo.hex bootloader.hex + python merge_hex.py solo.hex bootloader.hex all.hex STM32_Programmer_CLI -c port=SWD -halt -e all --readunprotect STM32_Programmer_CLI -c port=SWD -halt -d all.hex -rst -detach: - STM32_Programmer_CLI -c port=usb1 -ob nBOOT0=1 +bootloader.hex: + echo "You need to build the bootloader first." + +solo.hex: + echo "You need to build the application first." cbor: - cd ../../tinycbor/ && make clean - cd ../../tinycbor/ && make CC="$(CC)" AR=$(AR) \ -LDFLAGS="$(LDFLAGS_LIB)" \ -CFLAGS="$(CFLAGS)" + $(MAKE) -f application.mk -j8 cbor diff --git a/targets/stm32l442/README.md b/targets/stm32l442/README.md new file mode 100644 index 0000000..3c48ddd --- /dev/null +++ b/targets/stm32l442/README.md @@ -0,0 +1,34 @@ +# STM32L4xx Solo + +This documents how to build the firmware for Solo for the STM32L4xx microcontroller. + +# Building + +First build the cbor library. + +```bash +make cbor +``` + +Now build the Solo bootloader. + +``` +make boot +``` + +Now build the Solo application. + +``` +make clean # remove object files from bootloader, keep bootloader.hex +make +``` + +Merge the two files together. This script also patches a spot in memory to +allow the bootloader to boot the application. This memory spot is later used for +signed firmware updates. + +``` +python merge_hex.py solo.hex bootloader.hex all.hex +``` + +You can now program Solo with `all.hex`. diff --git a/targets/stm32l442/application.mk b/targets/stm32l442/application.mk new file mode 100644 index 0000000..4ee26e3 --- /dev/null +++ b/targets/stm32l442/application.mk @@ -0,0 +1,80 @@ +CC=arm-none-eabi-gcc +CP=arm-none-eabi-objcopy +SZ=arm-none-eabi-size +AR=arm-none-eabi-ar + +# ST related +SRC = src/main.c src/init.c src/redirect.c src/flash.c src/rng.c src/led.c src/device.c +SRC += src/fifo.c src/crypto.c src/attestation.c +SRC += src/startup_stm32l432xx.s src/system_stm32l4xx.c +SRC += $(wildcard lib/*.c) $(wildcard lib/usbd/*.c) + +# FIDO2 lib +SRC += ../../fido2/util.c ../../fido2/u2f.c ../../fido2/test_power.c +SRC += ../../fido2/stubs.c ../../fido2/log.c ../../fido2/ctaphid.c ../../fido2/ctap.c +SRC += ../../fido2/ctap_parse.c ../../fido2/main.c + +# Crypto libs +SRC += ../../crypto/sha256/sha256.c ../../crypto/micro-ecc/uECC.c ../../crypto/tiny-AES-c/aes.c + + +OBJ1=$(SRC:.c=.o) +OBJ=$(OBJ1:.s=.o) + +INC = -Isrc/ -Isrc/cmsis/ -Ilib/ -Ilib/usbd/ -I../../fido2/ -I../../fido2/extensions +INC += -I../../tinycbor/src -I../../crypto/sha256 -I../../crypto/micro-ecc +INC += -I../../crypto/tiny-AES-c + +SEARCH=-L../../tinycbor/lib + +LDSCRIPT=stm32l432xx.ld + +CFLAGS= $(INC) + +TARGET=solo +HW=-mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb + +# Nucleo board +#CHIP=STM32L432xx +# Solo +CHIP=STM32L442xx + +DEFINES = -D$(CHIP) -DAES256=1 -DUSE_FULL_LL_DRIVER -DAPP_CONFIG=\"app.h\" +# DEFINES += -DTEST_SOLO_STM32 -DTEST -DTEST_FIFO=1 + +CFLAGS=$(INC) -c $(DEFINES) -Wall -fdata-sections -ffunction-sections $(HW) -g +LDFLAGS_LIB=$(HW) $(SEARCH) -specs=nano.specs -specs=nosys.specs -Wl,--gc-sections -u _printf_float -lnosys +LDFLAGS=$(HW) $(LDFLAGS_LIB) -T$(LDSCRIPT) -Wl,-Map=$(TARGET).map,--cref -ltinycbor + + +.PRECIOUS: %.o + +all: $(TARGET).elf + $(SZ) $^ + +%.o: %.c + $(CC) $^ $(HW) -Os $(CFLAGS) -o $@ + +../../crypto/micro-ecc/uECC.o: ../../crypto/micro-ecc/uECC.c + $(CC) $^ $(HW) -O3 $(CFLAGS) -o $@ + +%.o: %.s + $(CC) $^ $(HW) -Os $(CFLAGS) -o $@ + +%.elf: $(OBJ) + $(CC) $^ $(HW) $(LDFLAGS) -o $@ + +%.hex: %.elf + $(CP) -O ihex $^ $(TARGET).hex + +clean: + rm -f *.o src/*.o src/*.elf bootloader/*.o $(OBJ) + +detach: + STM32_Programmer_CLI -c port=usb1 -ob nBOOT0=1 + +cbor: + cd ../../tinycbor/ && make clean + cd ../../tinycbor/ && make CC="$(CC)" AR=$(AR) \ +LDFLAGS="$(LDFLAGS_LIB)" \ +CFLAGS="$(CFLAGS)" diff --git a/targets/stm32l442/bootloader.mk b/targets/stm32l442/bootloader.mk index b7c2b8b..9aad2b1 100644 --- a/targets/stm32l442/bootloader.mk +++ b/targets/stm32l442/bootloader.mk @@ -16,10 +16,10 @@ SRC += ../../fido2/stubs.c ../../fido2/log.c ../../fido2/ctaphid.c ../../fido2 # Crypto libs SRC += ../../crypto/sha256/sha256.c ../../crypto/micro-ecc/uECC.c - OBJ1=$(SRC:.c=.o) OBJ=$(OBJ1:.s=.o) + INC = -Ibootloader/ -Isrc/ -Isrc/cmsis/ -Ilib/ -Ilib/usbd/ -I../../fido2/ -I../../fido2/extensions INC += -I../../tinycbor/src -I../../crypto/sha256 -I../../crypto/micro-ecc INC += -I../../crypto/tiny-AES-c @@ -49,6 +49,7 @@ LDFLAGS=$(HW) $(LDFLAGS_LIB) -T$(LDSCRIPT) -Wl,-Map=$(TARGET).map,--cref all: $(TARGET).elf $(SZ) $^ + %.o: %.c $(CC) $^ $(HW) -Os $(CFLAGS) -o $@ @@ -66,16 +67,3 @@ all: $(TARGET).elf clean: rm -f *.o src/*.o bootloader/*.o src/*.elf $(OBJ) - -flash: $(TARGET).hex - STM32_Programmer_CLI -c port=SWD -halt -e all --readunprotect - STM32_Programmer_CLI -c port=SWD -halt -d $(TARGET).hex -rst - -detach: - STM32_Programmer_CLI -c port=usb1 -ob nBOOT0=1 - -cbor: - cd ../../tinycbor/ && make clean - cd ../../tinycbor/ && make CC="$(CC)" AR=$(AR) \ -LDFLAGS="$(LDFLAGS_LIB)" \ -CFLAGS="$(CFLAGS)"