Files
2025-08-20 07:21:32 +08:00

315 lines
12 KiB
CMake

cmake_minimum_required(VERSION 3.15.0)
# ==========================
# Toolchain Setup
# ==========================
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_SOURCE_DIR}/cmake/arm-none-eabi-gcc.cmake)
# ==========================
# Project Setup
# ==========================
project(elite_bootlaoder VERSION 0.1.0 LANGUAGES C ASM)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS ON)
set(EXECUTABLE ${PROJECT_NAME}.elf)
set(NRF_SDK_DIR ${CMAKE_SOURCE_DIR}/../bmd380_sdk)
set(NRF_SDK_LINKER_DIR ${NRF_SDK_DIR}/modules/nrfx/mdk)
set(SD_LINKER_DIR ${CMAKE_SOURCE_DIR}/SoftdeviceLibraries/hard)
set(LINKER_FILE ${CMAKE_SOURCE_DIR}/linkscripts/secure_bootloader_gcc_nrf52.ld)
# ==========================
# Compiler Flags and Defines
# ==========================
set(COMMON_COMPILE_OPT
-mcpu=cortex-m4
-mfpu=fpv4-sp-d16
-mfloat-abi=hard
-mthumb
-fdata-sections
-ffunction-sections
-Wall
-Os
-g3
-Wno-unused-variable
-Wno-pointer-sign
-Wno-array-bounds
)
set(COMMON_COMPILE_DEF
-DDEBUG=1
-DBLE_STACK_SUPPORT_REQD
-DBOARD_CUSTOM
-DDEBUG_NRF
-DFLOAT_ABI_HARD
-DNRF52840_XXAA
-DNRF_DFU_SETTINGS_VERSION=2
-DNRF_DFU_SVCI_ENABLED
-DNRF_SD_BLE_API_VERSION=7
-DS140
-DSOFTDEVICE_PRESENT
-DSVC_INTERFACE_CALL_AS_NORMAL_FUNCTION
-DUSE_APP_CONFIG
-DAPP_TIMER_V2
-DAPP_TIMER_V2_RTC1_ENABLED
-DBL_SETTINGS_ACCESS_ONLY
-DCONFIG_GPIO_AS_PINRESET
-DNRF_DFU_TRANSPORT_BLE=1
-D__HEAP_SIZE=8192
-D__STACK_SIZE=8192
)
set(COMMON_COMPILE_INC
## Timing & Events
${NRF_SDK_DIR}/components/libraries/delay
${NRF_SDK_DIR}/components/libraries/led_softblink
${NRF_SDK_DIR}/components/libraries/low_power_pwm
${NRF_SDK_DIR}/components/libraries/scheduler
${NRF_SDK_DIR}/components/libraries/timer
## Others
${NRF_SDK_DIR}/components/libraries/experimental_section_vars
${NRF_SDK_DIR}/components/libraries/ringbuf
${NRF_SDK_DIR}/components/libraries/slip
${NRF_SDK_DIR}/components/libraries/svc
## Boards
${NRF_SDK_DIR}/bmd380_sdk/components/boards
${NRF_SDK_DIR}/components/boards
## BLE
${NRF_SDK_DIR}/components/ble/common
## External
${NRF_SDK_DIR}/external/fprintf
${NRF_SDK_DIR}/external/nano-pb
${NRF_SDK_DIR}/external/nrf_cc310_bl/include
${NRF_SDK_DIR}/external/segger_rtt
${NRF_SDK_DIR}/external/utf_converter
## USB
${NRF_SDK_DIR}/components/libraries/usbd
${NRF_SDK_DIR}/components/libraries/usbd/class/cdc
${NRF_SDK_DIR}/components/libraries/usbd/class/cdc/acm
## Crypto
${NRF_SDK_DIR}/components/libraries/crypto
${NRF_SDK_DIR}/components/libraries/crypto/backend/cc310
${NRF_SDK_DIR}/components/libraries/crypto/backend/cc310_bl
${NRF_SDK_DIR}/components/libraries/crypto/backend/cifra
${NRF_SDK_DIR}/components/libraries/crypto/backend/mbedtls
${NRF_SDK_DIR}/components/libraries/crypto/backend/micro_ecc
${NRF_SDK_DIR}/components/libraries/crypto/backend/nrf_hw
${NRF_SDK_DIR}/components/libraries/crypto/backend/nrf_sw
${NRF_SDK_DIR}/components/libraries/crypto/backend/oberon
${NRF_SDK_DIR}/components/libraries/crypto/backend/optiga
## Bootloader
${CMAKE_SOURCE_DIR}/bootloader/inc
${NRF_SDK_DIR}/components/libraries/bootloader
${NRF_SDK_DIR}/components/libraries/bootloader/ble_dfu
${NRF_SDK_DIR}/components/libraries/bootloader/dfu
## Utility
${NRF_SDK_DIR}/components/libraries/crc32
${NRF_SDK_DIR}/components/libraries/fstorage
${NRF_SDK_DIR}/components/libraries/sortlist
${NRF_SDK_DIR}/components/libraries/strerror
## Log
${NRF_SDK_DIR}/components/libraries/log
${NRF_SDK_DIR}/components/libraries/log/src
## Toolchain
${ARM_TOOLCHAIN_DIR}/../arm-none-eabi/include
${NRF_SDK_DIR}/components/toolchain/cmsis/include
## Core Libs
${NRF_SDK_DIR}/components/libraries/atomic
${NRF_SDK_DIR}/components/libraries/atomic_fifo
${NRF_SDK_DIR}/components/libraries/balloc
${NRF_SDK_DIR}/components/libraries/memobj
${NRF_SDK_DIR}/components/libraries/mutex
${NRF_SDK_DIR}/components/libraries/util
## NRFX
${NRF_SDK_DIR}/integration/nrfx
${NRF_SDK_DIR}/integration/nrfx/legacy
${NRF_SDK_DIR}/modules/nrfx
${NRF_SDK_DIR}/modules/nrfx/drivers/include
${NRF_SDK_DIR}/modules/nrfx/hal
${NRF_SDK_DIR}/modules/nrfx/mdk
## SoftDevice
${NRF_SDK_DIR}/components/softdevice/common
${NRF_SDK_DIR}/components/softdevice/mbr/headers
${NRF_SDK_DIR}/components/softdevice/s140/headers
${NRF_SDK_DIR}/components/softdevice/s140/headers/nrf52
)
# ==========================
# Configuration Interface
# ==========================
add_library(prj_config INTERFACE)
target_include_directories(prj_config INTERFACE ${COMMON_COMPILE_INC})
target_compile_definitions(prj_config INTERFACE ${COMMON_COMPILE_DEF})
target_compile_options(prj_config INTERFACE ${COMMON_COMPILE_OPT})
# ==========================
# Subdirectories
# ==========================
# ==========================
# Source Files
# ==========================
set(STARTUP_SRC
${NRF_SDK_DIR}/modules/nrfx/mdk/gcc_startup_nrf52840.S
${NRF_SDK_DIR}/modules/nrfx/mdk/system_nrf52.c
)
file(GLOB_RECURSE BOOTLOADER_SOURCES "bootloader/*.c")
# ==========================
# Executable and Linker
# ==========================
add_executable(${EXECUTABLE}
${STARTUP_SRC}
${BOOTLOADER_SOURCES}
### Bootloader (DFU)
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/dfu-cc.pb.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_flash.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_handling_error.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_mbr.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_req_handler.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_settings.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_settings_svci.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_svci.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_svci_handler.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_transport.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_utils.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_validation.c
${NRF_SDK_DIR}/components/libraries/bootloader/dfu/nrf_dfu_ver_validation.c
${NRF_SDK_DIR}/components/libraries/bootloader/serial_dfu/nrf_dfu_serial_usb.c
${NRF_SDK_DIR}/components/libraries/bootloader/serial_dfu/nrf_dfu_serial.c
${NRF_SDK_DIR}/components/libraries/bootloader/ble_dfu/nrf_dfu_ble.c
### Bootloader Core
${NRF_SDK_DIR}/components/libraries/bootloader/nrf_bootloader.c
${NRF_SDK_DIR}/components/libraries/bootloader/nrf_bootloader_app_start.c
${NRF_SDK_DIR}/components/libraries/bootloader/nrf_bootloader_app_start_final.c
${NRF_SDK_DIR}/components/libraries/bootloader/nrf_bootloader_dfu_timers.c
${NRF_SDK_DIR}/components/libraries/bootloader/nrf_bootloader_fw_activation.c
${NRF_SDK_DIR}/components/libraries/bootloader/nrf_bootloader_info.c
${NRF_SDK_DIR}/components/libraries/bootloader/nrf_bootloader_wdt.c
### USBD
${NRF_SDK_DIR}/components/libraries/usbd/class/cdc/acm/app_usbd_cdc_acm.c
${NRF_SDK_DIR}/components/libraries/usbd/app_usbd.c
${NRF_SDK_DIR}/components/libraries/usbd/app_usbd_string_desc.c
${NRF_SDK_DIR}/components/libraries/usbd/app_usbd_serial_num.c
${NRF_SDK_DIR}/components/libraries/usbd/app_usbd_core.c
### Crypto
${NRF_SDK_DIR}/components/libraries/crypto/backend/cc310_bl/cc310_bl_backend_ecc.c
${NRF_SDK_DIR}/components/libraries/crypto/backend/cc310_bl/cc310_bl_backend_ecdsa.c
${NRF_SDK_DIR}/components/libraries/crypto/backend/cc310_bl/cc310_bl_backend_hash.c
${NRF_SDK_DIR}/components/libraries/crypto/backend/cc310_bl/cc310_bl_backend_init.c
${NRF_SDK_DIR}/components/libraries/crypto/backend/cc310_bl/cc310_bl_backend_shared.c
${NRF_SDK_DIR}/components/libraries/crypto/nrf_crypto_ecc.c
${NRF_SDK_DIR}/components/libraries/crypto/nrf_crypto_ecdsa.c
${NRF_SDK_DIR}/components/libraries/crypto/nrf_crypto_hash.c
${NRF_SDK_DIR}/components/libraries/crypto/nrf_crypto_init.c
${NRF_SDK_DIR}/components/libraries/crypto/nrf_crypto_shared.c
### Core Libraries
${NRF_SDK_DIR}/components/libraries/atomic/nrf_atomic.c
${NRF_SDK_DIR}/components/libraries/atomic_fifo/nrf_atfifo.c
${NRF_SDK_DIR}/components/libraries/balloc/nrf_balloc.c
${NRF_SDK_DIR}/components/libraries/crc32/crc32.c
${NRF_SDK_DIR}/components/libraries/experimental_section_vars/nrf_section_iter.c
${NRF_SDK_DIR}/components/libraries/fstorage/nrf_fstorage.c
${NRF_SDK_DIR}/components/libraries/fstorage/nrf_fstorage_nvmc.c
${NRF_SDK_DIR}/components/libraries/fstorage/nrf_fstorage_sd.c
${NRF_SDK_DIR}/components/libraries/led_softblink/led_softblink.c
${NRF_SDK_DIR}/components/libraries/low_power_pwm/low_power_pwm.c
${NRF_SDK_DIR}/components/libraries/memobj/nrf_memobj.c
${NRF_SDK_DIR}/components/libraries/ringbuf/nrf_ringbuf.c
${NRF_SDK_DIR}/components/libraries/scheduler/app_scheduler.c
${NRF_SDK_DIR}/components/libraries/sortlist/nrf_sortlist.c
${NRF_SDK_DIR}/components/libraries/strerror/nrf_strerror.c
${NRF_SDK_DIR}/components/libraries/svc/nrf_svc_handler.c
${NRF_SDK_DIR}/components/libraries/timer/app_timer2.c
${NRF_SDK_DIR}/components/libraries/timer/drv_rtc.c
${NRF_SDK_DIR}/components/libraries/util/app_util_platform.c
${NRF_SDK_DIR}/components/libraries/util/nrf_assert.c
### Logging
${NRF_SDK_DIR}/components/libraries/log/src/nrf_log_backend_rtt.c
${NRF_SDK_DIR}/components/libraries/log/src/nrf_log_backend_serial.c
${NRF_SDK_DIR}/components/libraries/log/src/nrf_log_default_backends.c
${NRF_SDK_DIR}/components/libraries/log/src/nrf_log_frontend.c
${NRF_SDK_DIR}/components/libraries/log/src/nrf_log_str_formatter.c
### External Libraries
${NRF_SDK_DIR}/external/fprintf/nrf_fprintf.c
${NRF_SDK_DIR}/external/fprintf/nrf_fprintf_format.c
${NRF_SDK_DIR}/external/nano-pb/pb_common.c
${NRF_SDK_DIR}/external/nano-pb/pb_decode.c
${NRF_SDK_DIR}/external/segger_rtt/SEGGER_RTT.c
${NRF_SDK_DIR}/components/libraries/slip/slip.c
### HAL/Drivers
${NRF_SDK_DIR}/integration/nrfx/legacy/nrf_drv_clock.c
${NRF_SDK_DIR}/integration/nrfx/legacy/nrf_drv_power.c
${NRF_SDK_DIR}/modules/nrfx/drivers/src/nrfx_clock.c
${NRF_SDK_DIR}/modules/nrfx/drivers/src/nrfx_usbd.c
${NRF_SDK_DIR}/modules/nrfx/drivers/src/nrfx_power.c
${NRF_SDK_DIR}/modules/nrfx/hal/nrf_nvmc.c
${NRF_SDK_DIR}/modules/nrfx/soc/nrfx_atomic.c
### SoftDevice & Board
${NRF_SDK_DIR}/components/boards/boards.c
${NRF_SDK_DIR}/components/softdevice/common/nrf_sdh.c
${NRF_SDK_DIR}/components/softdevice/common/nrf_sdh_ble.c
${NRF_SDK_DIR}/components/softdevice/common/nrf_sdh_soc.c
${NRF_SDK_DIR}/components/ble/common/ble_srv_common.c
)
target_link_options(${EXECUTABLE} PRIVATE
-T${LINKER_FILE}
-L${LINKER_DIR}
-L${SD_LINKER_DIR}
-L${NRF_SDK_LINKER_DIR}
-L${NRF_SDK_DIR}/external/nrf_cc310_bl/lib/cortex-m4/hard-float
-mcpu=cortex-m4
-mfpu=fpv4-sp-d16
-mfloat-abi=hard
-mthumb
--specs=nano.specs
--specs=nosys.specs
-Wl,-Map=${PROJECT_NAME}.map,--cref
-Wl,--gc-sections
-Xlinker -print-memory-usage -Xlinker
)
target_link_libraries(${EXECUTABLE} PRIVATE
prj_config
nrf_cc310_bl_0.9.13
)
# Optional: Print executable size as part of the post build process
add_custom_command(TARGET ${EXECUTABLE}
POST_BUILD
COMMAND ${CMAKE_SIZE} ${EXECUTABLE})
# Optional: Create hex, bin and S-Record files after the build
add_custom_command(TARGET ${EXECUTABLE}
POST_BUILD
COMMAND ${CMAKE_OBJCOPY} -O srec --srec-len=64 ${EXECUTABLE} ${PROJECT_NAME}.s19
COMMAND ${CMAKE_OBJCOPY} -O ihex ${EXECUTABLE} ${PROJECT_NAME}.hex
COMMAND ${CMAKE_OBJCOPY} -O binary ${EXECUTABLE} ${PROJECT_NAME}.bin
)