mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2026-09-11 18:29:22 -07:00
CMake has been implemented to manage ARM projects.
Add the mkversion bat and ps1 implementation to the Windows platform compilation. Make armlib a static library so that bootrom and armsrc can be reused.
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
# Option to build the firmware for the Proxmark3/5. This will include the armsrc and bootrom directories.
|
||||
option(BUILD_FIRMWARE "Build the firmware for the Proxmark3/5" ON)
|
||||
|
||||
# If building for pm3 device, not client, the compiler will be arm-none-eabi-gcc, so the test program will not compile.
|
||||
# This is a workaround to prevent CMake from trying to compile the test program,
|
||||
# which will fail because the compiler is not for the host system.
|
||||
if (BUILD_FIRMWARE)
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/tools/FixCompileTest.cmake)
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/tools/ToolchainForArm.cmake)
|
||||
endif ()
|
||||
|
||||
# Project name and languages
|
||||
project(Proxmark3 C CXX ASM)
|
||||
|
||||
# add subdirectories, which will contain their own CMakeLists.txt files
|
||||
if (BUILD_FIRMWARE)
|
||||
add_subdirectory(armsrc)
|
||||
add_subdirectory(bootrom)
|
||||
else ()
|
||||
add_subdirectory(client)
|
||||
endif ()
|
||||
@@ -0,0 +1,89 @@
|
||||
if (PM5 AND NOT TARGET pm5_at32_armlib)
|
||||
add_library(pm5_at32_armlib STATIC
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/cmsis/cm4/device_support/system_at32f435_437.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_crm.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_misc.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_gpio.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_usb.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_qspi.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_tmr.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_ertc.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_pwc.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_spi.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_i2c.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_dma.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_adc.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_usart.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_exint.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_scfg.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_flash.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_crc.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_wdt.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_wwdt.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_can.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_dac.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_debug.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_dvp.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_edma.c
|
||||
# ${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_emac.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_sdio.c
|
||||
# ${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_xmc.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/src/at32f435_437_acc.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_usb/usb_drivers/src/usb_core.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_usb/usb_drivers/src/usbd_core.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_usb/usb_drivers/src/usbd_int.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_usb/usb_drivers/src/usbd_sdr.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_usb/usbd_class/cdc/cdc_class.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_i2c/at32f435_437_i2c_app.c
|
||||
)
|
||||
|
||||
target_compile_options(pm5_at32_armlib
|
||||
PRIVATE ${CROSS_CFLAGS}
|
||||
PUBLIC -mcpu=cortex-m4 -Wno-missing-prototypes -Wno-missing-declarations
|
||||
)
|
||||
target_compile_definitions(pm5_at32_armlib PUBLIC
|
||||
AT32F435RGT7
|
||||
USE_STDPERIPH_DRIVER
|
||||
AT_START_F435_V1
|
||||
CRM_MODULE_ENABLED
|
||||
MISC_MODULE_ENABLED
|
||||
GPIO_MODULE_ENABLED
|
||||
USB_MODULE_ENABLED
|
||||
QSPI_MODULE_ENABLED
|
||||
TMR_MODULE_ENABLED
|
||||
ERTC_MODULE_ENABLED
|
||||
PWC_MODULE_ENABLED
|
||||
SPI_MODULE_ENABLED
|
||||
I2C_MODULE_ENABLED
|
||||
DMA_MODULE_ENABLED
|
||||
ADC_MODULE_ENABLED
|
||||
USART_MODULE_ENABLED
|
||||
EXINT_MODULE_ENABLED
|
||||
SCFG_MODULE_ENABLED
|
||||
FLASH_MODULE_ENABLED
|
||||
CRC_MODULE_ENABLED
|
||||
WDT_MODULE_ENABLED
|
||||
WWDT_MODULE_ENABLED
|
||||
CAN_MODULE_ENABLED
|
||||
DAC_MODULE_ENABLED
|
||||
DEBUG_MODULE_ENABLED
|
||||
DVP_MODULE_ENABLED
|
||||
EDMA_MODULE_ENABLED
|
||||
# EMAC_MODULE_ENABLED
|
||||
SDIO_MODULE_ENABLED
|
||||
# XMC_MODULE_ENABLED
|
||||
ACC_MODULE_ENABLED
|
||||
USBD_SUPPORT_WINUSB=1
|
||||
)
|
||||
target_include_directories(pm5_at32_armlib PUBLIC
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/cmsis/cm4/core_support
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/cmsis/cm4/device_support
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_sys/drivers/inc
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_usb
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_usb/usb_drivers/inc
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_usb/usbd_class/cdc
|
||||
${CMAKE_CURRENT_LIST_DIR}/at32_i2c
|
||||
)
|
||||
set_property(TARGET pm5_at32_armlib PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||
endif ()
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,185 @@
|
||||
#[[
|
||||
+==========================================================+
|
||||
| STANDALONE | DESCRIPTION |
|
||||
+==========================================================+
|
||||
| (empty) | No standalone mode |
|
||||
+----------------------------------------------------------+
|
||||
| LF_SKELETON | standalone mode skeleton |
|
||||
| | - iceman |
|
||||
+----------------------------------------------------------+
|
||||
| LF_EM4100EMUL | Simulate predefined em4100 tags only |
|
||||
| | |
|
||||
+----------------------------------------------------------+
|
||||
| LF_EM4100RSWB | Read/simulate/brute em4100 tags & |
|
||||
| | clone it to T555x tags |
|
||||
+----------------------------------------------------------+
|
||||
| LF_EM4100RSWW | Read/simulate/validate em4100 tags & |
|
||||
| | clone it to T55xx tags, wipe T55xx tags|
|
||||
+----------------------------------------------------------+
|
||||
| LF_EM4100RWC | Read/simulate em4100 tags & clone it |
|
||||
| | to T555x tags |
|
||||
+----------------------------------------------------------+
|
||||
| LF_HIDBRUTE | HID corporate 1000 bruteforce |
|
||||
| | - Federico dotta & Maurizio Agazzini |
|
||||
+----------------------------------------------------------+
|
||||
| LF_HIDFCBRUTE | HID Facility Code bruteforce |
|
||||
| (RDV4 only) | |
|
||||
+----------------------------------------------------------+
|
||||
| LF_ICEHID | LF HID collector to flashmem |
|
||||
| (RDV4 only) | |
|
||||
+----------------------------------------------------------+
|
||||
| LF_MULTIHID | LF HID 26 Bit (H1031) multi simulator |
|
||||
| | - Shain Lakin |
|
||||
+----------------------------------------------------------+
|
||||
| LF_NEDAP_SIM | LF Nedap ID simple simulator |
|
||||
| | |
|
||||
+----------------------------------------------------------+
|
||||
| LF_NEXID | LF Nexwatch collector to flashmem |
|
||||
| (RDV4 only) | |
|
||||
+----------------------------------------------------------+
|
||||
| LF_PROXBRUTE | HID ProxII bruteforce |
|
||||
| | - Brad Antoniewicz |
|
||||
+----------------------------------------------------------+
|
||||
| LF_PROX2BRUTE | HID ProxII bruteforce v2 |
|
||||
| | |
|
||||
+----------------------------------------------------------+
|
||||
| LF_SAMYRUN | HID26 read/clone/sim |
|
||||
| (default) | - Samy Kamkar |
|
||||
+----------------------------------------------------------+
|
||||
| LF_THAREXDE | Simulate/read EM4x50 tags |
|
||||
| (RDV4 only) | storing in flashmem |
|
||||
+----------------------------------------------------------+
|
||||
| HF_14ASNIFF | 14a sniff to flashmem (rdv4) or ram |
|
||||
| | |
|
||||
+----------------------------------------------------------+
|
||||
| HF_14BSNIFF | 14b sniff to flashmem (rdv4) or ram |
|
||||
| | |
|
||||
+----------------------------------------------------------+
|
||||
| HF_15SNIFF | 15693 sniff to flashmem (rdv4) or ram |
|
||||
| | |
|
||||
+----------------------------------------------------------+
|
||||
| HF_15SIM | 15693 tag simulator |
|
||||
| | |
|
||||
+----------------------------------------------------------+
|
||||
| HF_AVEFUL | Mifare ultralight read/simulation |
|
||||
| | - Ave Ozkal |
|
||||
+----------------------------------------------------------+
|
||||
| HF_BOG | 14a sniff with ULC/ULEV1/NTAG auth |
|
||||
| (RDV4 only) | storing in flashmem - Bogito |
|
||||
+----------------------------------------------------------+
|
||||
| HF_CARDHOPPER | Relay 14a protocols over long distances|
|
||||
| (RDV4 only) | (w/ IP backbone) - Sam Haskins |
|
||||
+----------------------------------------------------------+
|
||||
| HF_COLIN | Mifare ultra fast sniff/sim/clone |
|
||||
| (RDV4 only) | - Colin Brigato |
|
||||
+----------------------------------------------------------+
|
||||
| HF_CRAFTBYTE | UID stealer - Emulates scanned 14a UID |
|
||||
| | - Anze Jensterle |
|
||||
+----------------------------------------------------------+
|
||||
| HF_ICECLASS | Simulate HID iCLASS legacy ags |
|
||||
| (RDV4 only) | storing in flashmem |
|
||||
+----------------------------------------------------------+
|
||||
| HF_LEGIC | Read/simulate Legic Prime tags |
|
||||
| | storing in flashmem |
|
||||
+----------------------------------------------------------+
|
||||
| HF_LEGICSIM | Simulate Legic Prime tags |
|
||||
| (RDV4 only) | stored on flashmem |
|
||||
+----------------------------------------------------------+
|
||||
| HF_MATTYRUN | Mifare sniff/clone |
|
||||
| | - Matías A. Ré Medina |
|
||||
+----------------------------------------------------------+
|
||||
| HF_MFCSIM | Simulate Mifare Classic 1k card |
|
||||
| (RDV4 only) | storing in flashmem - Ray Lee |
|
||||
+----------------------------------------------------------+
|
||||
| HF_MSDSAL | Read and emulate MSD Visa cards |
|
||||
| | - Salvador Mendoza |
|
||||
+----------------------------------------------------------+
|
||||
| HF_REBLAY | 14A Relay over BT |
|
||||
| (RDV4 only) | - Salvador Mendoza |
|
||||
+----------------------------------------------------------+
|
||||
| HF_ST25_TEAROFF | Store/restore ST25TB tags with |
|
||||
| | tear-off for counters - SecLabz |
|
||||
+----------------------------------------------------------+
|
||||
| HF_TCPRST | IKEA Rothult read/sim/dump/emul |
|
||||
| | - Nick Draffen |
|
||||
+----------------------------------------------------------+
|
||||
| HF_TMUDFORD | Read and emulate 15 tags |
|
||||
| | - Tim Mudford |
|
||||
+----------------------------------------------------------+
|
||||
| HF_UNISNIFF | Sniff 14a/14b/15 (optionally to flash) |
|
||||
| | - hazardousvoltage |
|
||||
+----------------------------------------------------------+
|
||||
| HF_YOUNG | Mifare sniff/simulation |
|
||||
| | - Craig Young |
|
||||
+----------------------------------------------------------+
|
||||
| DANKARMULTI | Load multiple standalone modes. |
|
||||
| | - Daniel Karling |
|
||||
+----------------------------------------------------------+
|
||||
| HF_EMVPNG | Read and emulate EMV Visa cards |
|
||||
| | - Davi Mikael (Penegui) |
|
||||
+----------------------------------------------------------+
|
||||
]]
|
||||
|
||||
# Default standalone if no standalone specified
|
||||
set(DEFAULT_STANDALONE LF_SAMYRUN)
|
||||
# (you can set explicitly STANDALONE= to disable standalone modes)
|
||||
if (NOT DEFINED STANDALONE)
|
||||
set(STANDALONE ${DEFAULT_STANDALONE})
|
||||
endif ()
|
||||
set(STANDALONE_REQ_DEFS)
|
||||
|
||||
# List of all standalone modes, and which ones require bluetooth, smartcard or flash.
|
||||
# (for now, we only support one standalone mode at a time)
|
||||
set(STANDALONE_MODES
|
||||
LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RSWW LF_EM4100RWC
|
||||
LF_HIDBRUTE LF_HIDFCBRUTE LF_ICEHID LF_MULTIHID LF_NEDAP_SIM LF_NEXID
|
||||
LF_PROXBRUTE LF_PROX2BRUTE LF_SAMYRUN LF_THAREXDE
|
||||
HF_14ASNIFF HF_14BSNIFF HF_15SNIFF HF_15SIM
|
||||
HF_AVEFUL HF_BOG HF_CARDHOPPER HF_COLIN HF_CRAFTBYTE HF_ICECLASS
|
||||
HF_LEGIC HF_LEGICSIM HF_MATTYRUN HF_MFCSIM HF_MSDSAL HF_REBLAY
|
||||
HF_ST25_TEAROFF HF_TCPRST HF_TMUDFORD HF_UNISNIFF HF_YOUNG HF_EMVPNG DANKARMULTI)
|
||||
# List of modes that require bluetooth
|
||||
set(STANDALONE_MODES_REQ_BT HF_CARDHOPPER HF_REBLAY)
|
||||
# List of modes that require smartcard
|
||||
set(STANDALONE_MODES_REQ_SMARTCARD)
|
||||
# List of modes that require flash
|
||||
set(STANDALONE_MODES_REQ_FLASH
|
||||
LF_HIDFCBRUTE LF_ICEHID LF_NEXID LF_THAREXDE HF_BOG HF_COLIN
|
||||
HF_ICECLASS HF_LEGICSIM HF_MFCSIM)
|
||||
|
||||
message(STATUS "STANDALONE = ${STANDALONE}")
|
||||
message(STATUS "STANDALONE_MODES = ${STANDALONE_MODES}")
|
||||
|
||||
# Check if the specified standalone mode is valid, and set the corresponding definitions.
|
||||
# 'MATCHES' is used to check if the specified standalone mode is in the list of valid modes.
|
||||
if (DEFINED STANDALONE)
|
||||
if ("${STANDALONE_MODES}" MATCHES "${STANDALONE}")
|
||||
string(TOUPPER ${STANDALONE} STANDALONE_UPPER)
|
||||
set(STANDALONE_PLATFORM_DEFS ${STANDALONE_PLATFORM_DEFS} "-DWITH_STANDALONE_${STANDALONE_UPPER}")
|
||||
# Required for SmartCard, set '-DWITH_SMARTCARD'
|
||||
if ("${STANDALONE_MODES_REQ_SMARTCARD}" MATCHES "${STANDALONE}")
|
||||
set(STANDALONE_REQ_DEFS ${STANDALONE_REQ_DEFS} -DWITH_SMARTCARD)
|
||||
endif ()
|
||||
# Required for Flash, set '-DWITH_FLASH'
|
||||
if ("${STANDALONE_MODES_REQ_FLASH}" MATCHES "${STANDALONE}")
|
||||
set(STANDALONE_REQ_DEFS ${STANDALONE_REQ_DEFS} -DWITH_FLASH)
|
||||
endif ()
|
||||
# Required for Bluetooth, set '-DWITH_FPC_USART_HOST'
|
||||
# (we use USART host for bluetooth communication in standalone modes)
|
||||
if ("${STANDALONE_MODES_REQ_BT}" MATCHES "${STANDALONE}")
|
||||
set(STANDALONE_REQ_DEFS ${STANDALONE_REQ_DEFS} -DWITH_FPC_USART_HOST)
|
||||
endif ()
|
||||
else ()
|
||||
message(FATAL_ERROR "Invalid STANDALONE: ${STANDALONE}. ${KNOWN_DEFINITIONS}")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
# Export the definitions for standalone mode to be used in the main CMakeLists.txt
|
||||
# --- Usually referenced externally:
|
||||
# STANDALONE_REQ_DEFS -> Definitions required by the selected standalone mode (e.g., -DWITH_FLASH)
|
||||
# STANDALONE_PLATFORM_DEFS -> Definitions for the selected standalone mode (e.g., -DWITH_STANDALONE_LF_SAMYRUN)
|
||||
# --- It is not usually used externally:
|
||||
# STANDALONE_MODES -> List of all valid standalone modes (for error checking)
|
||||
# STANDALONE_MODES_REQ_BT -> List of standalone modes that require bluetooth (for error checking)
|
||||
# STANDALONE_MODES_REQ_SMARTCARD -> List of standalone modes that require smartcard (for error checking)
|
||||
# STANDALONE_MODES_REQ_FLASH -> List of standalone modes that require flash (for error checking)
|
||||
@@ -0,0 +1,161 @@
|
||||
# --------------------- Standalone Source Files ---------------------
|
||||
|
||||
set(DIR_STANDALONE ${CMAKE_CURRENT_LIST_DIR})
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/placeholder.c")
|
||||
|
||||
# Check which standalone mode is selected, and set the corresponding source file.
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_SKELETON")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_skeleton.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_EM4100EMUL")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_em4100emul.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_EM4100RSWB")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_em4100rswb.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_EM4100RSWW")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_em4100rsww.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_EM4100RWC")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_em4100rwc.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_HIDBRUTE")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_hidbrute.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_HIDFCBRUTE")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_hidfcbrute.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_ICEHID")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_icehid.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_MULTIHID")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_multihid.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_NEDAP_SIM")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_nedap_sim.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_NEXID")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_nexid.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_SAMYRUN")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_samyrun.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_PROXBRUTE")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_proxbrute.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_PROX2BRUTE")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_prox2brute.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_LF_THAREXDE")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/lf_tharexde.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_14ASNIFF")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_14asniff.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_14BSNIFF")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_14bsniff.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_15SNIFF")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_15sniff.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_15SIM")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_15sim.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_AVEFUL")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_aveful.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_BOG")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_bog.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_CARDHOPPER")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_cardhopper.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_COLIN")
|
||||
set(SRC_STANDALONE
|
||||
"${DIR_STANDALONE}/vtsend.c"
|
||||
"${DIR_STANDALONE}/hf_colin.c"
|
||||
"${DIR_STANDALONE}/frozen.c"
|
||||
"${DIR_STANDALONE}/nprintf.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_CRAFTBYTE")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_craftbyte.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_ICECLASS")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_iceclass.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_LEGIC")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_legic.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_LEGICSIM")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_legicsim.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_MATTYRUN")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_mattyrun.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_MFCSIM")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_mfcsim.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_MSDSAL")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_msdsal.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_REBLAY")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_reblay.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_TCPRST")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_tcprst.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_TMUDFORD")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_tmudford.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_UNISNIFF")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_unisniff.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_YOUNG")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_young.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_ST25_TEAROFF")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_st25_tearoff.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_HF_EMVPNG")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/hf_emvpng.c")
|
||||
endif ()
|
||||
|
||||
if ("${APP_CFLAGS}" MATCHES "WITH_STANDALONE_DANKARMULTI")
|
||||
set(SRC_STANDALONE "${DIR_STANDALONE}/dankarmulti.c")
|
||||
endif ()
|
||||
@@ -0,0 +1,131 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
|
||||
# Fix error when 'compile a simple test program.'
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../tools/FixCompileTest.cmake)
|
||||
|
||||
# Ensure direct bootrom builds also select ARM cross-compilers.
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../tools/ToolchainForArm.cmake)
|
||||
|
||||
project(bootrom C ASM) # Set variables needs before the project defining.
|
||||
|
||||
# Hardware abstraction layer for ARM platform.
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../common_arm/Hal.cmake)
|
||||
|
||||
# Include the MKVersion script for generating version_pm3.c
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../tools/MKVersionScript.cmake)
|
||||
|
||||
# ---
|
||||
|
||||
set(OBJDIR ${CMAKE_BINARY_DIR}/obj)
|
||||
set(DEFAULT_VERSION_C ${CMAKE_CURRENT_LIST_DIR}/../common/default_version_pm3.c)
|
||||
set(VERSION_PM3_C ${CMAKE_CURRENT_BINARY_DIR}/version_pm3.c)
|
||||
|
||||
set(INC_DIRS
|
||||
${CMAKE_CURRENT_LIST_DIR}/../include
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/sys
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/wdt
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/flash_code
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/gpio
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/usb
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/ticks
|
||||
)
|
||||
|
||||
set(THUMBSRC
|
||||
${CMAKE_CURRENT_LIST_DIR}/bootrom.c
|
||||
${VERSION_PM3_C}
|
||||
../common_arm/usb/usb_cdc_desc.c)
|
||||
|
||||
if (PM5)
|
||||
set(THUMBSRC ${THUMBSRC}
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/sys/sys_hw_at32.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/ticks/ticks_hw_at32.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/gpio/gpio_hw_at32.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/usb/usb_cdc_at32.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/flash_code/flash_code_hw_at32.c
|
||||
)
|
||||
set(ASMSRC flash-reset-at32.s ram-reset-at32.s)
|
||||
else ()
|
||||
set(THUMBSRC ${THUMBSRC}
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/sys/sys_hw_at91.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/ticks/ticks_hw_at91.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/gpio/gpio_hw_at91.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/usb/usb_cdc_at91.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common_arm/flash_code/flash_code_hw_at91.c
|
||||
)
|
||||
set(ASMSRC flash-reset-at91.s ram-reset-at91.s)
|
||||
endif ()
|
||||
|
||||
# stdint.h provided locally until GCC 4.5 becomes C99 compliant
|
||||
set(APP_CFLAGS -I. -ffunction-sections -fdata-sections -DAS_BOOTROM)
|
||||
|
||||
# stack-protect , no-pie reduces size on Gentoo Hardened 8.2 gcc, no-common makes sure uninitialized vars don't end up in COMMON area
|
||||
set(APP_CFLAGS ${APP_CFLAGS} -fno-stack-protector -fno-pie -fno-common)
|
||||
|
||||
if ("${PLATFORM_DEFS}" MATCHES "WITH_FLASH")
|
||||
set(INC_DIRS ${INC_DIRS} ${CMAKE_CURRENT_LIST_DIR}/../common_arm/flash_data)
|
||||
if (PM5)
|
||||
set(SRC_FLASH ../common_arm/flash_data/flashmem_hw_at32.c)
|
||||
set(SRC_TICKS ../common_arm/ticks/ticks_hw_at32.c)
|
||||
else ()
|
||||
set(SRC_FLASH ../common_arm/flash_data/flashmem_hw_at91.c)
|
||||
set(SRC_TICKS ../common_arm/ticks/ticks_hw_at91.c)
|
||||
endif ()
|
||||
set(SRC_FLASH ${SRC_FLASH} ../common_arm/flash_data/flashmem_core.c)
|
||||
set(SRC_TICKS ${SRC_TICKS} ../common_arm/ticks/ticks_core.c)
|
||||
set(THUMBSRC ${THUMBSRC} ${SRC_FLASH} ${SRC_TICKS})
|
||||
endif ()
|
||||
|
||||
if (PM5)
|
||||
set(LDSCRIPT ${CMAKE_CURRENT_LIST_DIR}/ldscript-flash-at32)
|
||||
else ()
|
||||
set(LDSCRIPT ${CMAKE_CURRENT_LIST_DIR}/ldscript-flash-at91)
|
||||
endif ()
|
||||
|
||||
set(APP_CFLAGS ${APP_CFLAGS} ${PLATFORM_DEFS})
|
||||
|
||||
# Do not move this inclusion before the definition of {THUMB,ASM,ARM}SRC
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../common_arm/Common.cmake)
|
||||
|
||||
if (PM5)
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/../armlib/pm5_at32_armlib.cmake)
|
||||
set(LIBS ${LIBS} pm5_at32_armlib)
|
||||
endif ()
|
||||
|
||||
# Fix: warning: bootrom\bootrom.elf has a LOAD segment with RWX permissions
|
||||
set(CROSS_LDFLAGS ${CROSS_LDFLAGS} -Wl,--no-warn-rwx-segments)
|
||||
|
||||
# Create version_pm3.c before bootrom build.
|
||||
add_custom_command(
|
||||
OUTPUT ${VERSION_PM3_C}
|
||||
DEPENDS ${DEFAULT_VERSION_C}
|
||||
COMMAND ${MKVERSION_CMD} ${VERSION_PM3_C} || ${CMAKE_COMMAND} -E copy ${DEFAULT_VERSION_C} ${VERSION_PM3_C}
|
||||
COMMENT "Call mkversion.xx script to generate 'version_pm3.c', if mkversion return fail, fallback is default_version_pm3.c"
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
# ---------------- Output dir ----------------
|
||||
file(MAKE_DIRECTORY ${OBJDIR})
|
||||
get_filename_component(OUTPUT_BOOTROM_HEX ${OBJDIR}/${PROJECT_NAME}.hex ABSOLUTE)
|
||||
get_filename_component(OUTPUT_BOOTROM_BIN ${OBJDIR}/${PROJECT_NAME}.bin ABSOLUTE)
|
||||
|
||||
add_executable(bootrom.elf ${THUMBSRC} ${ASMSRC})
|
||||
set_target_properties(bootrom.elf PROPERTIES # The 'bootrom.elf' output to ${OBJDIR}
|
||||
RUNTIME_OUTPUT_DIRECTORY "${OBJDIR}"
|
||||
OUTPUT_NAME "bootrom"
|
||||
SUFFIX ".elf" # OK, OBJDIR + OUTPUT_NAME + SUFFIX = /xxx/obj/bootrom.elf
|
||||
)
|
||||
target_link_options(bootrom.elf PRIVATE -Wl,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map) # output map file
|
||||
target_link_options(bootrom.elf PRIVATE -L ${CMAKE_CURRENT_LIST_DIR} -T ${LDSCRIPT} ${CROSS_LDFLAGS})
|
||||
target_compile_options(bootrom.elf PRIVATE ${CROSS_CFLAGS}) # !!!! WARN !!!! No -mthumb on here
|
||||
set_source_files_properties(${THUMBSRC} PROPERTIES COMPILE_OPTIONS "-mthumb") # THUMBSRC is '-mthumb' flag required.
|
||||
target_include_directories(bootrom.elf PRIVATE ${INC_DIRS})
|
||||
target_link_libraries(bootrom.elf ${LIBS})
|
||||
|
||||
# Generate HEX and BIN files for fullimage finally
|
||||
add_custom_command(TARGET bootrom.elf POST_BUILD
|
||||
# COMMAND ${CMAKE_COMMAND} -E echo "[=] GEN(10) bootrom.elf(HEX,BIN)"
|
||||
COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${OUTPUT_BOOTROM_HEX}
|
||||
COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${OUTPUT_BOOTROM_BIN}
|
||||
COMMENT "Build bootrom.hex & bootrom.bin"
|
||||
)
|
||||
@@ -0,0 +1,117 @@
|
||||
#[[ VPATH in cmake is unavailable, so we need append path for source or include dir...
|
||||
# Also search prerequisites in the common directory (for usb.c), the fpga directory (for fpga.bit), and the lz4 directory
|
||||
VPATH = . ../common_arm ../common ../common/crapto1 ../common/mbedtls ../common/lz4 ../fpga ../armsrc/Standalone ../common/hitag2
|
||||
]]
|
||||
|
||||
set(ARMCFLAGS -mthumb-interwork -fno-builtin)
|
||||
set(DEFCFLAGS -Wall -Werror -Os -pedantic -fstrict-aliasing -pipe)
|
||||
|
||||
# Some more warnings we want as errors:
|
||||
set(DEFCFLAGS ${DEFCFLAGS}
|
||||
-Wbad-function-cast
|
||||
-Wchar-subscripts
|
||||
-Wundef
|
||||
-Wunused
|
||||
-Wuninitialized
|
||||
-Wpointer-arith
|
||||
-Wformat
|
||||
-Wformat-security
|
||||
-Winit-self
|
||||
-Wmissing-include-dirs
|
||||
-Wnested-externs
|
||||
-Wempty-body
|
||||
-Wignored-qualifiers
|
||||
-Wmissing-field-initializers
|
||||
-Wtype-limits)
|
||||
|
||||
# Some more warnings we need first to eliminate, so temporarely tolerated:
|
||||
set(DEFCFLAGS ${DEFCFLAGS}
|
||||
-Wshadow
|
||||
-Wno-error=shadow
|
||||
-Winline
|
||||
-Wno-error=inline
|
||||
-Wmissing-prototypes
|
||||
-Wno-error=missing-prototypes
|
||||
-Wmissing-declarations
|
||||
-Wno-error=missing-declarations
|
||||
-Wstrict-prototypes
|
||||
-Wno-error=strict-prototypes
|
||||
)
|
||||
|
||||
# still vsnprintf etc to sort out...
|
||||
# for makefile: DEFCFLAGS += -Wredundant-decls -Wno-error=redundant-decls
|
||||
# for makefile: DEFCFLAGS += -Wcast-align -Wno-error=cast-align
|
||||
|
||||
# Next ones are activated only if GCCEXTRA=1
|
||||
set(EXTRACFLAGS
|
||||
-Wunused-parameter
|
||||
-Wno-error=unused-parameter
|
||||
-Wswitch-enum
|
||||
-Wno-error=switch-enum
|
||||
-Wsign-compare
|
||||
-Wno-error=sign-compare
|
||||
-Wold-style-definition
|
||||
-Wno-error=old-style-definition
|
||||
-Wconversion
|
||||
-Wno-error=conversion
|
||||
-Wno-error=sign-conversion
|
||||
-Wno-error=float-conversion
|
||||
)
|
||||
|
||||
# unknown to clang or old gcc:
|
||||
# First we activate Wextra then we explicitly list those we know about
|
||||
# Those without -Wno-error are supposed to be completely solved
|
||||
set(GCCEXTRACFLAGS -Wextra)
|
||||
|
||||
# unknown to arm-none-eabi/4.9.3
|
||||
set(GCCEXTRACFLAGS ${GCCEXTRACFLAGS}
|
||||
-Wwrite-strings
|
||||
-Wno-error=discarded-qualifiers)
|
||||
|
||||
set(GCCEXTRACFLAGS ${GCCEXTRACFLAGS}
|
||||
-Wold-style-declaration
|
||||
-Wno-error=old-style-declaration
|
||||
-Wimplicit-fallthrough=3
|
||||
-Wno-error=implicit-fallthrough
|
||||
-Wclobbered
|
||||
-Wcast-function-type
|
||||
-Wmissing-parameter-type
|
||||
-Woverride-init
|
||||
-Wshift-negative-value
|
||||
-Wunused-but-set-parameter
|
||||
)
|
||||
|
||||
# Not yet enabled in DEFCFLAGS:
|
||||
set(GCCEXTRACFLAGS ${GCCEXTRACFLAGS}
|
||||
-Wredundant-decls
|
||||
-Wno-error=redundant-decls
|
||||
-Wcast-align
|
||||
-Wno-error=cast-align
|
||||
)
|
||||
|
||||
if (GCCEXTRA)
|
||||
set(DEFCFLAGS ${DEFCFLAGS} ${GCCEXTRACFLAGS} ${EXTRACFLAGS})
|
||||
endif ()
|
||||
|
||||
if (NOERROR)
|
||||
set(DEFCFLAGS ${DEFCFLAGS} -Wno-error)
|
||||
endif ()
|
||||
|
||||
if (NOT DEFINED CROSS_CFLAGS)
|
||||
set(CROSS_CFLAGS ${DEFCFLAGS})
|
||||
endif ()
|
||||
set(CROSS_CFLAGS ${CROSS_CFLAGS}
|
||||
${ARMCFLAGS}
|
||||
-c
|
||||
${INCLUDE}
|
||||
# -std=c99 TODO 暂时切换为c11标准,因为新的平台需要c11标准,AT32的官方库一堆c11写法,不这么做的话改起来很麻烦
|
||||
-std=c11
|
||||
-DON_DEVICE
|
||||
${APP_CFLAGS})
|
||||
set(CROSS_LDFLAGS ${CROSS_LDFLAGS}
|
||||
-Wl,-gc-sections
|
||||
-nostartfiles
|
||||
-nodefaultlibs
|
||||
-Wl,--build-id=none
|
||||
-Wl,-n)
|
||||
set(LIBS gcc)
|
||||
@@ -0,0 +1,255 @@
|
||||
#[[
|
||||
+============================================+
|
||||
| PLATFORM | DESCRIPTION |
|
||||
+============================================+
|
||||
| PM3RDV4 (def) | Proxmark3 RDV4 |
|
||||
+--------------------------------------------+
|
||||
| PM3GENERIC | Proxmark3 generic target |
|
||||
+--------------------------------------------+
|
||||
| PM3ICOPYX | iCopy-X with XC3S100E |
|
||||
+--------------------------------------------+
|
||||
| PM5 | Proxmark5 |
|
||||
+--------------------------------------------+
|
||||
]]
|
||||
set(PLATFORM "PM3RDV4" CACHE STRING "Default platform is PM3RDV4 if no platform specified")
|
||||
set_property(CACHE PLATFORM PROPERTY STRINGS "PM3RDV4" "PM3GENERIC" "PM3ICOPYX" "PM5")
|
||||
|
||||
#[[
|
||||
+============================================+
|
||||
| PLATFORM_EXTRAS | DESCRIPTION |
|
||||
+============================================+
|
||||
| BTADDON | Proxmark3 RDV4 BT add-on |
|
||||
+--------------------------------------------+
|
||||
]]
|
||||
set(PLATFORM_EXTRAS "" CACHE STRING "Default PLATFORM_EXTRAS is unset")
|
||||
set_property(CACHE PLATFORM_EXTRAS PROPERTY STRINGS "BTADDON" "")
|
||||
|
||||
# Skip fpga bit stream files pack to arm's fw?
|
||||
# Some platform is no download in arm side required.
|
||||
set(SKIP_FPGA_EMBED FALSE CACHE STRING "It is enabled by default. Package the fpga image to the arm firmware.")
|
||||
|
||||
# The arm platform name & fpga platform name
|
||||
set(PLTNAME "Unknown Platform")
|
||||
set(PLATFORM_FPGA "fpga-undefined")
|
||||
|
||||
if (PLATFORM STREQUAL "PM3RDV4")
|
||||
# FPGA bitstream files, the order doesn't matter anymore
|
||||
set(FPGA_BITSTREAMS ../fpga/fpga_pm3_hf.bit)
|
||||
if (NOT SKIP_LF)
|
||||
list(APPEND FPGA_BITSTREAMS ../fpga/fpga_pm3_lf.bit)
|
||||
endif ()
|
||||
if (NOT SKIP_FELICA)
|
||||
list(APPEND FPGA_BITSTREAMS ../fpga/fpga_pm3_felica.bit)
|
||||
endif ()
|
||||
if (NOT SKIP_ISO15693)
|
||||
list(APPEND FPGA_BITSTREAMS ../fpga/fpga_pm3_hf_15.bit)
|
||||
endif ()
|
||||
set(PLATFORM_DEFS -DWITH_SMARTCARD -DWITH_FLASH -DRDV4 -DCHIP_AT91SAM7S)
|
||||
set(PLTNAME "Proxmark3 RDV4")
|
||||
set(PLATFORM_FPGA "xc2s30")
|
||||
set(RDV4 TRUE)
|
||||
elseif (PLATFORM STREQUAL "PM3OTHER")
|
||||
message(WARNING "PLATFORM=PM3OTHER is deprecated, please use PLATFORM=PM3GENERIC")
|
||||
set(_IS_GENERIC TRUE) # Fall through to PM3GENERIC behavior
|
||||
elseif (PLATFORM STREQUAL "PM3GENERIC")
|
||||
set(_IS_GENERIC TRUE)
|
||||
elseif (PLATFORM STREQUAL "PM3ICOPYX")
|
||||
set(FPGA_BITSTREAMS ../fpga/fpga_icopyx_hf.bit)
|
||||
set(PLATFORM_DEFS -DWITH_FLASH -DICOPYX -DXC3 -DCHIP_AT91SAM7S)
|
||||
set(PLTNAME "iCopy-X with XC3S100E")
|
||||
set(PLATFORM_FPGA "xc3s100e")
|
||||
elseif (PLATFORM STREQUAL "PM5")
|
||||
# TODO DXL 我们暂时不需要指定FPGA比特流文件,因为实际上我们大概率要做FPGA的静态烧录,而不是附加到ARM固件中动态下载
|
||||
set(FPGA_BITSTREAMS ../fpga/fpga_pm3_hf.bit) # TODO DXL 虽然可以不把打包比特流,但是还是得把FPGA的版本信息给生成,让EXE依赖。
|
||||
set(SKIP_FPGA_EMBED TRUE) # important!!! disable the fpga bit files pack to arm!
|
||||
set(SKIP_COMPRESSION TRUE) # Skip data section compress. The new mcu has enough flash space.
|
||||
set(PLATFORM_DEFS -DWITH_FLASH -DPM5 -DCHIP_AT32F435_37) # TODO DXL 暂时不要编译i2c -DWITH_SMARTCARD
|
||||
set(PLTNAME "Proxmark5")
|
||||
set(PLATFORM_FPGA "GW1NR-LV2MG49GC6/i5")
|
||||
set(PM5 TRUE)
|
||||
else ()
|
||||
message(FATAL_ERROR "Invalid or empty PLATFORM: ${PLATFORM}. Known platforms: PM3RDV4, PM3GENERIC, PM3ICOPYX (PM3OTHER is deprecated)")
|
||||
endif ()
|
||||
|
||||
# PM3GENERIC and PM3OTHER
|
||||
if (_IS_GENERIC)
|
||||
set(FPGA_BITSTREAMS ../fpga/fpga_pm3_hf.bit)
|
||||
if (NOT SKIP_LF)
|
||||
list(APPEND FPGA_BITSTREAMS ../fpga/fpga_pm3_lf.bit)
|
||||
endif ()
|
||||
if (NOT SKIP_FELICA)
|
||||
list(APPEND FPGA_BITSTREAMS ../fpga/fpga_pm3_felica.bit)
|
||||
endif ()
|
||||
if (NOT SKIP_ISO15693)
|
||||
list(APPEND FPGA_BITSTREAMS ../fpga/fpga_pm3_hf_15.bit)
|
||||
endif ()
|
||||
set(PLTNAME "Proxmark3 generic target")
|
||||
set(PLATFORM_FPGA "xc2s30")
|
||||
set(PLATFORM_DEFS -DCHIP_AT91SAM7S)
|
||||
if (LED_ORDER STREQUAL "PM3EASY")
|
||||
list(APPEND PLATFORM_DEFS -DLED_ORDER_PM3EASY)
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
# If no fpga bitstream pack to arm, set flag for arm compile.
|
||||
if (SKIP_FPGA_EMBED)
|
||||
list(APPEND PLATFORM_DEFS -DNO_FPGA_BITSTREAM_PACK)
|
||||
endif ()
|
||||
|
||||
# parsing additional PLATFORM_EXTRAS tokens
|
||||
set(PLATFORM_EXTRAS_TMP ${PLATFORM_EXTRAS})
|
||||
if ("${PLATFORM_EXTRAS_TMP}" MATCHES "SMARTCARD")
|
||||
list(APPEND PLATFORM_DEFS -DWITH_SMARTCARD)
|
||||
list(REMOVE_ITEM PLATFORM_EXTRAS_TMP "SMARTCARD")
|
||||
endif ()
|
||||
if ("${PLATFORM_EXTRAS_TMP}" MATCHES "FLASH")
|
||||
list(APPEND PLATFORM_DEFS -DWITH_FLASH)
|
||||
list(REMOVE_ITEM PLATFORM_EXTRAS_TMP "FLASH")
|
||||
endif ()
|
||||
if ("${PLATFORM_EXTRAS_TMP}" MATCHES "BTADDON")
|
||||
list(APPEND PLATFORM_DEFS -DWITH_FPC_USART_HOST)
|
||||
list(REMOVE_ITEM PLATFORM_EXTRAS_TMP "BTADDON")
|
||||
endif ()
|
||||
if ("${PLATFORM_EXTRAS_TMP}" MATCHES "FPC_USART_DEV")
|
||||
list(APPEND PLATFORM_DEFS -DWITH_FPC_USART_DEV)
|
||||
list(REMOVE_ITEM PLATFORM_EXTRAS_TMP "FPC_USART_DEV")
|
||||
endif ()
|
||||
if (PLATFORM_EXTRAS_TMP)
|
||||
message(FATAL_ERROR "Unknown PLATFORM_EXTRAS token(s): ${PLATFORM_EXTRAS_TMP}")
|
||||
endif ()
|
||||
|
||||
# common LF support
|
||||
if (NOT SKIP_LF)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_LF)
|
||||
endif ()
|
||||
if (NOT SKIP_HITAG)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_HITAG)
|
||||
endif ()
|
||||
if (NOT SKIP_EM4x50)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_EM4x50)
|
||||
endif ()
|
||||
if (NOT SKIP_EM4x70)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_EM4x70)
|
||||
endif ()
|
||||
if (NOT SKIP_ZX8211)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_ZX8211)
|
||||
endif ()
|
||||
|
||||
# common HF support
|
||||
if (NOT SKIP_HF)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_GENERAL_HF)
|
||||
endif ()
|
||||
if (NOT SKIP_ISO15693)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_ISO15693)
|
||||
endif ()
|
||||
if (NOT SKIP_LEGICRF)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_LEGICRF)
|
||||
endif ()
|
||||
if (NOT SKIP_ISO14443b)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_ISO14443b)
|
||||
endif ()
|
||||
if (NOT SKIP_ISO14443a)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_ISO14443a)
|
||||
endif ()
|
||||
if (NOT SKIP_ICLASS)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_ICLASS)
|
||||
endif ()
|
||||
if (NOT SKIP_FELICA)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_FELICA)
|
||||
endif ()
|
||||
if (NOT SKIP_NFCBARCODE)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_NFCBARCODE)
|
||||
endif ()
|
||||
if (NOT SKIP_HFSNIFF)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_HFSNIFF)
|
||||
endif ()
|
||||
if (NOT SKIP_HFPLOT)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_HFPLOT)
|
||||
endif ()
|
||||
if (NOT SKIP_COMPRESSION)
|
||||
list(APPEND PLATFORM_DEFS -DWITH_COMPRESSION)
|
||||
endif ()
|
||||
|
||||
# Standalone mode
|
||||
if (STANDALONE_REQ_DEFS)
|
||||
message(STATUS "-------------- PLATFORM_DEFS = ${PLATFORM_DEFS}")
|
||||
if (NOT "${PLATFORM_DEFS};" MATCHES ".*;(${STANDALONE_REQ_DEFS});.*")
|
||||
message(FATAL_ERROR "Chosen Standalone mode ${STANDALONE} requires ${STANDALONE_REQ_DEFS}, unsupported by ${PLTNAME}")
|
||||
endif ()
|
||||
endif ()
|
||||
if (DEFINED STANDALONE_PLATFORM_DEFS AND NOT "${STANDALONE_PLATFORM_DEFS}" STREQUAL "")
|
||||
list(APPEND PLATFORM_DEFS ${STANDALONE_PLATFORM_DEFS})
|
||||
endif ()
|
||||
# Find and print standalone-related definitions
|
||||
string(REGEX MATCHALL "WITH_STANDALONE_[^;]+" STANDALONE_DEFS_FOUND "${PLATFORM_DEFS}")
|
||||
|
||||
# Misc (LCD support)
|
||||
if ("${PLATFORM_DEFS}" MATCHES "WITH_LCD")
|
||||
list(APPEND PLATFORM_DEFS -DWITH_LCD)
|
||||
endif ()
|
||||
|
||||
# WITH_FPC_USART_* needs WITH_FPC_USART
|
||||
string(FIND "${PLATFORM_DEFS}" "WITH_FPC_USART_" _FPC_POS)
|
||||
if (NOT _FPC_POS STREQUAL "-1")
|
||||
list(APPEND PLATFORM_DEFS -DWITH_FPC_USART)
|
||||
endif ()
|
||||
|
||||
# Extract non-standalone platform defs (remove -DWITH_ prefix and STANDALONE* entries)
|
||||
string(REPLACE "-DWITH_" "" PLATFORM_DEFS_CLEAN "${PLATFORM_DEFS}")
|
||||
separate_arguments(PLATFORM_DEFS_CLEAN)
|
||||
# Filter out STANDALONE entries
|
||||
set(PLATFORM_DEFS_INFO)
|
||||
foreach (def ${PLATFORM_DEFS_CLEAN})
|
||||
if (NOT def MATCHES "^STANDALONE_")
|
||||
list(APPEND PLATFORM_DEFS_INFO ${def})
|
||||
endif ()
|
||||
endforeach ()
|
||||
list(REMOVE_DUPLICATES PLATFORM_DEFS_INFO)
|
||||
# Extract standalone mode (remove 'STANDALONE_' prefix)
|
||||
|
||||
message(STATUS "PLATFORM_DEFS_INFO = ${PLATFORM_DEFS_INFO}")
|
||||
|
||||
set(PLATFORM_DEFS_INFO_STANDALONE)
|
||||
foreach (def ${PLATFORM_DEFS_CLEAN})
|
||||
if (def MATCHES "^STANDALONE_(.+)")
|
||||
list(APPEND PLATFORM_DEFS_INFO_STANDALONE "${CMAKE_MATCH_1}")
|
||||
endif ()
|
||||
endforeach ()
|
||||
list(REMOVE_DUPLICATES PLATFORM_DEFS_INFO_STANDALONE)
|
||||
|
||||
# Check that only one Standalone mode is selected
|
||||
list(LENGTH PLATFORM_DEFS_INFO_STANDALONE STANDALONE_COUNT)
|
||||
if (STANDALONE_COUNT GREATER 1)
|
||||
message(FATAL_ERROR "You must choose only one Standalone mode!: ${PLATFORM_DEFS_INFO_STANDALONE}")
|
||||
endif ()
|
||||
|
||||
# Set extras info
|
||||
set(PLATFORM_EXTRAS_INFO ${PLATFORM_EXTRAS})
|
||||
if (NOT PLATFORM_EXTRAS_INFO)
|
||||
set(PLATFORM_EXTRAS_INFO "No extra selected")
|
||||
endif ()
|
||||
|
||||
message(STATUS "PLATFORM_DEFS_INFO_STANDALONE = ${PLATFORM_DEFS_INFO_STANDALONE}")
|
||||
|
||||
# Set standalone info
|
||||
if (NOT PLATFORM_DEFS_INFO_STANDALONE)
|
||||
set(PLATFORM_DEFS_INFO_STANDALONE "No standalone mode selected")
|
||||
endif ()
|
||||
|
||||
# Default platform size
|
||||
if (NOT PLATFORM_SIZE)
|
||||
set(PLATFORM_SIZE 512)
|
||||
endif ()
|
||||
|
||||
# Show some vars.
|
||||
message(STATUS "===================================================================")
|
||||
message(STATUS "Version info : ${VERSION_INFO} ")
|
||||
message(STATUS "Platform name : ${PLTNAME} ")
|
||||
message(STATUS "PLATFORM : ${PLATFORM} ")
|
||||
message(STATUS "PLATFORM_FPGA : ${PLATFORM_FPGA} ")
|
||||
message(STATUS "PLATFORM_SIZE : ${PLATFORM_SIZE} ")
|
||||
message(STATUS "Platform extras : ${PLATFORM_EXTRAS_INFO} ")
|
||||
message(STATUS "Included options : ${PLATFORM_DEFS_INFO} ")
|
||||
message(STATUS "Standalone mode : ${PLATFORM_DEFS_INFO_STANDALONE} ")
|
||||
message(STATUS "C Compiler Host : ${C_COMPILER_HOST}")
|
||||
message(STATUS "===================================================================")
|
||||
@@ -0,0 +1,6 @@
|
||||
# ----------------------------------------------------------
|
||||
# Fix error when 'compile a simple test program.'
|
||||
set(CMAKE_SYSTEM_NAME Generic)
|
||||
set(CMAKE_SYSTEM_PROCESSOR arm)
|
||||
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
|
||||
# ----------------------------------------------------------
|
||||
@@ -0,0 +1,46 @@
|
||||
if (NOT DEFINED PLATFORM)
|
||||
message(FATAL_ERROR "Include this module after PLATFORM check.")
|
||||
endif ()
|
||||
|
||||
#[[
|
||||
Make All variables private(Exclude EXE)!!!
|
||||
]]
|
||||
|
||||
# For get_exe_suffix function to detect the suffix of executable for current compiler, like '.exe' for Windows.
|
||||
include(${CMAKE_CURRENT_LIST_DIR}/GetExeSuffixByCompiler.cmake)
|
||||
|
||||
set(_fc_MYINCLUDES -I${CMAKE_CURRENT_LIST_DIR}/../common_fpga)
|
||||
set(_fc_MYCFLAGS -std=c99 -D_ISOC99_SOURCE)
|
||||
|
||||
if (PLATFORM STREQUAL PM3ICOPYX)
|
||||
set(_fc_MYDEFS -DXC3)
|
||||
else ()
|
||||
set(_fc_MYDEFS)
|
||||
endif ()
|
||||
|
||||
set(_fc_MYINCLUDES ${_fc_MYINCLUDES} -I${CMAKE_CURRENT_LIST_DIR}/../common/lz4)
|
||||
set(_fc_MYCFLAGS ${_fc_MYCFLAGS} -DLZ4_MEMORY_USAGE=20 -Wno-redundant-decls -Wno-old-style-definition -Wno-missing-prototypes -Wno-missing-declarations)
|
||||
set(_fc_MYSRCS ${_fc_MYSRCS}
|
||||
${CMAKE_CURRENT_LIST_DIR}/fpga_compress/fpga_compress.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common/lz4/lz4hc.c
|
||||
${CMAKE_CURRENT_LIST_DIR}/../common/lz4/lz4.c)
|
||||
|
||||
# The target name for fpga_compress
|
||||
set(FPGA_COMPRESS fpga_compress)
|
||||
get_exe_suffix(FPGA_COMPRESS_EXE_SUFFIX ${C_COMPILER_HOST})
|
||||
get_filename_component(FPGA_COMPRESS_EXE "${CMAKE_CURRENT_LIST_DIR}/fpga_compress/${FPGA_COMPRESS}${FPGA_COMPRESS_EXE_SUFFIX}" ABSOLUTE) # executable filename + suffix
|
||||
add_custom_command(OUTPUT ${FPGA_COMPRESS_EXE}
|
||||
# COMMAND ${CMAKE_COMMAND} -E echo "[=] CC ${FPGA_COMPRESS} executable"
|
||||
COMMAND ${C_COMPILER_HOST}
|
||||
${_fc_MYCFLAGS}
|
||||
${_fc_MYDEFS}
|
||||
${_fc_MYINCLUDES}
|
||||
${_fc_MYSRCS}
|
||||
-o ${FPGA_COMPRESS_EXE}
|
||||
DEPENDS ${_fc_MYSRCS} # if src update, this custom command will run. tips: only .c files watch now, you can add .h files watch if need.
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/fpga_compress
|
||||
COMMENT "Build 'fpga_compress' executable for next step"
|
||||
VERBATIM)
|
||||
|
||||
# add_custom_target always run if project build, but add_custom_command can cached output if no files update.
|
||||
add_custom_target(${FPGA_COMPRESS} DEPENDS ${FPGA_COMPRESS_EXE})
|
||||
@@ -0,0 +1,24 @@
|
||||
function(get_exe_suffix OUTPUT_VAR GCC_COMPILER)
|
||||
set(TEST_SRC ${CMAKE_CURRENT_BINARY_DIR}/detect_suffix.c)
|
||||
set(TEST_EXE ${CMAKE_CURRENT_BINARY_DIR}/detect_suffix)
|
||||
|
||||
file(WRITE ${TEST_SRC} "int main(){return 0;}\n")
|
||||
|
||||
execute_process(
|
||||
COMMAND ${GCC_COMPILER} ${TEST_SRC} -o ${TEST_EXE}
|
||||
RESULT_VARIABLE RES
|
||||
)
|
||||
|
||||
if (EXISTS "${TEST_EXE}.exe")
|
||||
set(${OUTPUT_VAR} ".exe" PARENT_SCOPE)
|
||||
else ()
|
||||
set(${OUTPUT_VAR} "" PARENT_SCOPE)
|
||||
endif ()
|
||||
|
||||
# Clear
|
||||
file(REMOVE ${TEST_SRC} ${TEST_EXE} ${TEST_EXE}.exe ${TEST_EXE}.o)
|
||||
endfunction()
|
||||
|
||||
# Usage:
|
||||
# get_exe_suffix(${C_COMPILER_HOST} DETECTED_SUFFIX)
|
||||
# message(STATUS "Detected suffix: '${DETECTED_SUFFIX}'")
|
||||
@@ -0,0 +1,109 @@
|
||||
# ------------------------------------------------------------------------
|
||||
# Power by DXL
|
||||
#
|
||||
# Detect platform for run mkversion script
|
||||
#
|
||||
# Injection variable:
|
||||
# MKVERSION_SCRIPT_FOUND - Is script found?
|
||||
# MKVERSION_SCRIPT - The script full path
|
||||
# MKVERSION_SCRIPT_TYPE - Script file type: "bat" or "sh"
|
||||
# VERSION_INFO - Version info from mkversion.(bat|sh) --short
|
||||
# MKVERSION_AVAILABLE - A boolean variable, tell me is script working and VERSION_INFO set.
|
||||
# MKVERSION_CMD - The final command used to generate the source file version_pm3.c
|
||||
|
||||
# Only once run on setup(MKVERSION_AVAILABLE is a cached variable. Next reload will direct set and skip.)
|
||||
if (DEFINED MKVERSION_AVAILABLE)
|
||||
return()
|
||||
endif ()
|
||||
|
||||
# Setup variable and export
|
||||
set(MKVERSION_SCRIPT_FOUND FALSE)
|
||||
set(MKVERSION_SCRIPT "")
|
||||
set(MKVERSION_SCRIPT_TYPE "")
|
||||
set(VERSION_INFO "unknown")
|
||||
set(MKVERSION_AVAILABLE FALSE)
|
||||
|
||||
# The script for platform
|
||||
set(MKVERSION_CANDIDATES_BAT "${CMAKE_CURRENT_LIST_DIR}/mkversion.bat")
|
||||
set(MKVERSION_CANDIDATES_SH "${CMAKE_CURRENT_LIST_DIR}/mkversion.sh")
|
||||
|
||||
# We are running on the Windows?
|
||||
set(MKVERSION_RUN_NATIVE_WINDOWS FALSE)
|
||||
execute_process(COMMAND uname OUTPUT_VARIABLE uname)
|
||||
if (uname MATCHES "^MSYS" OR uname MATCHES "^MINGW" OR uname MATCHES "^Lin" OR uname MATCHES "^Darwin")
|
||||
message(STATUS "Not running on native Windows (uname is ${uname}).")
|
||||
else ()
|
||||
set(MKVERSION_RUN_NATIVE_WINDOWS TRUE)
|
||||
endif ()
|
||||
|
||||
# First setup, we can run once '--short' for mkversion script to get like 'Iceman/master/b36b61feb-dirty'
|
||||
if (MKVERSION_RUN_NATIVE_WINDOWS)
|
||||
execute_process(
|
||||
COMMAND cmd /c call "${MKVERSION_CANDIDATES_BAT}" --short
|
||||
OUTPUT_VARIABLE _output
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||
RESULT_VARIABLE _result
|
||||
)
|
||||
if (${_result} EQUAL 0)
|
||||
set(MKVERSION_SCRIPT "${MKVERSION_CANDIDATES_BAT}")
|
||||
set(MKVERSION_SCRIPT_TYPE "bat")
|
||||
set(VERSION_INFO "${_output}")
|
||||
set(MKVERSION_SCRIPT_FOUND TRUE)
|
||||
endif ()
|
||||
else ()
|
||||
# Is 'sh' available?
|
||||
find_program(SH_COMMAND sh)
|
||||
if (SH_COMMAND)
|
||||
execute_process(
|
||||
COMMAND "${SH_COMMAND}" "${MKVERSION_CANDIDATES_SH}" --short
|
||||
OUTPUT_VARIABLE _output
|
||||
ERROR_QUIET
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
|
||||
RESULT_VARIABLE _result
|
||||
)
|
||||
if (${_result} EQUAL 0)
|
||||
set(MKVERSION_SCRIPT "${MKVERSION_CANDIDATES_SH}")
|
||||
set(MKVERSION_SCRIPT_TYPE "sh")
|
||||
set(VERSION_INFO "${_output}")
|
||||
set(MKVERSION_SCRIPT_FOUND TRUE)
|
||||
endif ()
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
# Finally, the script found and version info from '--short' available?
|
||||
if (MKVERSION_SCRIPT_FOUND AND NOT "${VERSION_INFO}" STREQUAL "")
|
||||
set(MKVERSION_AVAILABLE TRUE)
|
||||
else ()
|
||||
set(MKVERSION_AVAILABLE FALSE)
|
||||
endif ()
|
||||
|
||||
# Export finally cmd for generate version_pm3.c
|
||||
if (MKVERSION_SCRIPT_TYPE STREQUAL "sh") # What's shell type we are?
|
||||
set(MKVERSION_CMD ${CMAKE_COMMAND} -E env bash ${MKVERSION_SCRIPT}) # Unix/Linux/macOS: call sh
|
||||
elseif (MKVERSION_SCRIPT_TYPE STREQUAL "bat")
|
||||
set(MKVERSION_CMD cmd /c ${MKVERSION_SCRIPT}) # Windows: call bat
|
||||
else ()
|
||||
message(FATAL_ERROR "MKVERSION_SCRIPT_TYPE must be 'sh' or 'bat', but got '${MKVERSION_SCRIPT_TYPE}'")
|
||||
endif ()
|
||||
|
||||
# Set variables to cached level, next reload CmakeLists.txt will skip run this subscript(MKVersionScript.cmake).
|
||||
set(MKVERSION_SCRIPT_FOUND ${MKVERSION_SCRIPT_FOUND} CACHE INTERNAL "Whether a mkversion script was found")
|
||||
set(MKVERSION_SCRIPT ${MKVERSION_SCRIPT} CACHE INTERNAL "Full path to the mkversion script")
|
||||
set(MKVERSION_SCRIPT_TYPE ${MKVERSION_SCRIPT_TYPE} CACHE INTERNAL "Type of script: 'bat' or 'sh'")
|
||||
set(VERSION_INFO ${VERSION_INFO} CACHE INTERNAL "Version info string from --short")
|
||||
set(MKVERSION_AVAILABLE ${MKVERSION_AVAILABLE} CACHE INTERNAL "Whether version info is available")
|
||||
set(MKVERSION_CMD ${MKVERSION_CMD} CACHE INTERNAL "Command to generate version info")
|
||||
|
||||
# Debug info(Optional, can enable when debuging...)
|
||||
if (FALSE)
|
||||
message(STATUS "===================================================================")
|
||||
message(STATUS "MKVERSION_SCRIPT_FOUND: ${MKVERSION_SCRIPT_FOUND}")
|
||||
message(STATUS "MKVERSION_SCRIPT: ${MKVERSION_SCRIPT}")
|
||||
message(STATUS "MKVERSION_SCRIPT_TYPE: ${MKVERSION_SCRIPT_TYPE}")
|
||||
message(STATUS "VERSION_INFO: ${VERSION_INFO}")
|
||||
message(STATUS "MKVERSION_CMD: ${MKVERSION_CMD}")
|
||||
message(STATUS "===================================================================")
|
||||
endif ()
|
||||
@@ -0,0 +1,23 @@
|
||||
# If it has already been found, there is no need to search again.
|
||||
if(NOT DEFINED CMAKE_C_COMPILER)
|
||||
set(TOOLCHAIN_PREFIX arm-none-eabi-)
|
||||
|
||||
# 1. Find the compiler
|
||||
find_program(ARM_GCC_COMPILER ${TOOLCHAIN_PREFIX}gcc)
|
||||
find_program(ARM_GXX_COMPILER ${TOOLCHAIN_PREFIX}g++)
|
||||
find_program(ARM_ASM_COMPILER ${TOOLCHAIN_PREFIX}gcc)
|
||||
|
||||
# 2. Check if the core C compiler is found
|
||||
if(ARM_GCC_COMPILER)
|
||||
message(STATUS "Found ARM GCC: ${ARM_GCC_COMPILER}")
|
||||
|
||||
# Set the found absolute paths (with or without .exe) directly to CMake
|
||||
set(CMAKE_C_COMPILER ${ARM_GCC_COMPILER} CACHE PATH "C compiler")
|
||||
set(CMAKE_CXX_COMPILER ${ARM_GXX_COMPILER} CACHE PATH "CXX compiler")
|
||||
set(CMAKE_ASM_COMPILER ${ARM_ASM_COMPILER} CACHE PATH "ASM compiler")
|
||||
|
||||
else()
|
||||
message(WARNING "ARM GCC (${TOOLCHAIN_PREFIX}gcc) not found in PATH!")
|
||||
endif()
|
||||
|
||||
endif ()
|
||||
@@ -0,0 +1,20 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
:: Power by DXL
|
||||
:: The mkversion.ps1 wrapper. why not mkversion.bat implement all function?
|
||||
:: > Not good idea to call sha256 for arm src, so you known..
|
||||
|
||||
:: Did not output localization
|
||||
set LC_ALL=C
|
||||
set LANG=C
|
||||
|
||||
:: Where are this script?
|
||||
set "SCRIPT_DIR=%~dp0"
|
||||
|
||||
:: Call PowerShell script, and send params
|
||||
powershell -ExecutionPolicy Bypass -File "%SCRIPT_DIR%mkversion.ps1" %*
|
||||
|
||||
if %ERRORLEVEL% NEQ 0 (
|
||||
exit /b %ERRORLEVEL%
|
||||
)
|
||||
@@ -0,0 +1,191 @@
|
||||
<#
|
||||
Power By DXL
|
||||
The mkversion.sh same functions.
|
||||
#>
|
||||
|
||||
param(
|
||||
[string]$Destination,
|
||||
[switch]$Short,
|
||||
[switch]$Force,
|
||||
[switch]$Undecided
|
||||
)
|
||||
|
||||
# 默认 fork 名称(可自定义)
|
||||
$fullgitinfo = "Iceman"
|
||||
$clean = 2 # 2 = undecided, 1 = clean, 0 = dirty
|
||||
|
||||
# 获取脚本所在目录
|
||||
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||
$pm3Root = Join-Path $ScriptDir ".."
|
||||
|
||||
# 检查是否在 Git 工作目录中
|
||||
$inGit = $false
|
||||
$gitDir = Join-Path $pm3Root ".git"
|
||||
if (Test-Path $gitDir -PathType Container) {
|
||||
# 尝试执行 git 命令
|
||||
$result = $null
|
||||
try {
|
||||
$result = git -C $pm3Root rev-parse --is-inside-work-tree 2>$null
|
||||
} catch { }
|
||||
if ($result -eq "true") {
|
||||
$inGit = $true
|
||||
}
|
||||
}
|
||||
|
||||
if ($inGit) {
|
||||
try {
|
||||
$gitVersion = (git -C $pm3Root describe --dirty --always).Trim()
|
||||
$gitBranch = (git -C $pm3Root rev-parse --abbrev-ref HEAD).Trim()
|
||||
|
||||
if ($Undecided) {
|
||||
if ($gitVersion -like "*-dirty") {
|
||||
$clean = 0
|
||||
} else {
|
||||
$clean = 1
|
||||
}
|
||||
}
|
||||
|
||||
$fullgitinfo = "$fullgitinfo/$gitBranch/$gitVersion"
|
||||
|
||||
# 使用 FORCED_DATE 或当前时间
|
||||
if ($env:FORCED_DATE -match '^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$') {
|
||||
$ctime = $env:FORCED_DATE
|
||||
} else {
|
||||
$ctime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
||||
}
|
||||
} catch {
|
||||
$fullgitinfo = "$fullgitinfo/master/release (git_error)"
|
||||
$ctime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
||||
}
|
||||
} else {
|
||||
$fullgitinfo = "$fullgitinfo/master/release (no_git)"
|
||||
$readmePath = Join-Path $pm3Root "README.md"
|
||||
if (Test-Path $readmePath) {
|
||||
$dl_time = (Get-Item $readmePath).LastWriteTime
|
||||
$ctime = $dl_time.ToString("yyyy-MM-dd HH:mm:ss")
|
||||
} else {
|
||||
$ctime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
||||
}
|
||||
}
|
||||
|
||||
# --short 模式:只输出版本字符串
|
||||
if ($Short) {
|
||||
if ($fullgitinfo.Length -gt 49) {
|
||||
$fullgitinfo = $fullgitinfo.Substring(0, 46) + "..."
|
||||
}
|
||||
Write-Output $fullgitinfo
|
||||
exit 0
|
||||
}
|
||||
|
||||
# 检查是否提供了输出文件路径
|
||||
if (-not $Destination) {
|
||||
Write-Error "Error: missing destination filename"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# 计算 ARM 源码的 SHA256 哈希(前 9 位)
|
||||
$armSrc = Join-Path $pm3Root "armsrc"
|
||||
$commonArm = Join-Path $pm3Root "common_arm"
|
||||
$files = @()
|
||||
|
||||
if (Test-Path $armSrc) {
|
||||
$files += Get-ChildItem $armSrc | Where-Object {
|
||||
($_.Extension -eq ".c" -or $_.Extension -eq ".h") -and
|
||||
$_.Name -notmatch "^(disabled|version_pm3|fpga_version_info)"
|
||||
}
|
||||
}
|
||||
|
||||
if (Test-Path $commonArm) {
|
||||
$files += Get-ChildItem $commonArm | Where-Object {
|
||||
($_.Extension -eq ".c" -or $_.Extension -eq ".h") -and
|
||||
$_.Name -notmatch "^(disabled|version_pm3|fpga_version_info)"
|
||||
}
|
||||
}
|
||||
|
||||
$sha = "no sha256"
|
||||
if ($files.Count -gt 0) {
|
||||
# 按文件名排序(确保一致性)
|
||||
$sortedFiles = $files | Sort-Object Name
|
||||
|
||||
# 创建 SHA256 实例
|
||||
$sha256 = New-Object System.Security.Cryptography.SHA256Managed
|
||||
|
||||
foreach ($file in $sortedFiles) {
|
||||
try {
|
||||
$content = [System.IO.File]::ReadAllBytes($file.FullName)
|
||||
$sha256.TransformBlock($content, 0, $content.Length, $null, 0) | Out-Null
|
||||
} catch {
|
||||
Write-Warning "Failed to read file: $($file.FullName)"
|
||||
}
|
||||
}
|
||||
|
||||
# 完成哈希计算
|
||||
$sha256.TransformFinalBlock([byte[]]@(), 0, 0)
|
||||
$hashBytes = $sha256.Hash
|
||||
$shaHex = -join ($hashBytes | ForEach-Object { $_.ToString("x2") })
|
||||
$sha = $shaHex.Substring(0, 9)
|
||||
}
|
||||
|
||||
# 截断 fullgitinfo 到最多 49 字符
|
||||
if ($fullgitinfo.Length -gt 49) {
|
||||
$fullgitinfo = $fullgitinfo.Substring(0, 46) + "..."
|
||||
}
|
||||
|
||||
# 检查是否需要重新生成文件(避免无意义更新)
|
||||
$regenerate = $true
|
||||
|
||||
if (-not $Force -and (Test-Path $Destination)) {
|
||||
try {
|
||||
$content = Get-Content $Destination -Raw
|
||||
|
||||
# 提取 clean 状态(第13行附近)
|
||||
if ($content -match '^\s*(\d+)\s*$' -and $matches[1] -eq $clean) {
|
||||
# 提取 fullgitinfo(第14行)
|
||||
if ($content -match '^\s*"([^"]+)"\s*$' -and $matches[1] -eq $fullgitinfo) {
|
||||
# 提取 sha(第16行)
|
||||
if ($content -match '^\s*"([^"]+)"\s*$' -and $matches[1] -eq $sha) {
|
||||
$regenerate = $false
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
$regenerate = $true
|
||||
}
|
||||
}
|
||||
|
||||
# 仅当需要时才写入文件
|
||||
if ($regenerate) {
|
||||
$tmpFile = "$Destination.tmp"
|
||||
$output = @"
|
||||
#include "common.h"
|
||||
/* Generated file, do not edit */
|
||||
#ifndef ON_DEVICE
|
||||
#define SECTVERSINFO
|
||||
#else
|
||||
#define SECTVERSINFO __attribute__((section(".version_information")))
|
||||
#endif
|
||||
|
||||
const struct version_information_t SECTVERSINFO g_version_information = {
|
||||
VERSION_INFORMATION_MAGIC,
|
||||
1,
|
||||
1,
|
||||
$clean,
|
||||
"$fullgitinfo",
|
||||
"$ctime",
|
||||
"$sha"
|
||||
};
|
||||
"@
|
||||
|
||||
try {
|
||||
$output | Out-File -FilePath $tmpFile -Encoding ASCII -Force
|
||||
Move-Item -Path $tmpFile -Destination $Destination -Force
|
||||
} catch {
|
||||
Write-Error "Failed to write version file: $_"
|
||||
if (Test-Path $tmpFile) {
|
||||
Remove-Item $tmpFile -Force
|
||||
}
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
exit 0
|
||||
Reference in New Issue
Block a user