CMakeLists.txt 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. cmake_minimum_required(VERSION 3.5)
  2. if(NOT SDKCONFIG)
  3. message(FATAL_ERROR "Bootloader subproject expects the SDKCONFIG variable to be passed "
  4. "in by the parent build process.")
  5. endif()
  6. if(NOT IDF_PATH)
  7. message(FATAL_ERROR "Bootloader subproject expects the IDF_PATH variable to be passed "
  8. "in by the parent build process.")
  9. endif()
  10. set(COMPONENTS bootloader esptool_py esp32 partition_table soc bootloader_support log spi_flash micro-ecc soc main efuse)
  11. set(BOOTLOADER_BUILD 1)
  12. add_definitions(-DBOOTLOADER_BUILD=1)
  13. set(COMPONENT_REQUIRES_COMMON log esp32 soc)
  14. include("${IDF_PATH}/tools/cmake/project.cmake")
  15. project(bootloader)
  16. target_linker_script(bootloader.elf
  17. "main/esp32.bootloader.ld"
  18. "main/esp32.bootloader.rom.ld"
  19. )
  20. # as cmake won't attach linker args to a header-only library, attach
  21. # linker args directly to the bootloader.elf
  22. set(ESP32_BOOTLOADER_LINKER_SCRIPTS
  23. "${IDF_PATH}/components/esp32/ld/esp32.rom.ld"
  24. "${IDF_PATH}/components/esp32/ld/esp32.rom.spiram_incompatible_fns.ld"
  25. "${IDF_PATH}/components/esp32/ld/esp32.peripherals.ld")
  26. target_linker_script(bootloader.elf ${ESP32_BOOTLOADER_LINKER_SCRIPTS})
  27. target_link_libraries(bootloader.elf gcc)
  28. set(secure_boot_signing_key ${SECURE_BOOT_SIGNING_KEY})
  29. string(REPLACE ";" " " espsecurepy "${ESPSECUREPY}")
  30. string(REPLACE ";" " " espefusepy "${ESPEFUSEPY}")
  31. set(esptoolpy_write_flash "${ESPTOOLPY_WRITE_FLASH_STR}")
  32. if(CONFIG_SECURE_BOOTLOADER_REFLASHABLE)
  33. if(CONFIG_SECURE_BOOTLOADER_KEY_ENCODING_192BIT)
  34. set(key_digest_len 192)
  35. else()
  36. set(key_digest_len 256)
  37. endif()
  38. get_filename_component(bootloader_digest_bin
  39. "bootloader-reflash-digest.bin"
  40. ABSOLUTE BASE_DIR "${CMAKE_BINARY_DIR}")
  41. get_filename_component(secure_bootloader_key
  42. "secure-bootloader-key-${key_digest_len}.bin"
  43. ABSOLUTE BASE_DIR "${CMAKE_BINARY_DIR}")
  44. add_custom_command(OUTPUT "${secure_bootloader_key}"
  45. COMMAND ${ESPSECUREPY} digest_private_key
  46. --keylen "${key_digest_len}"
  47. --keyfile "${secure_boot_signing_key}"
  48. "${secure_bootloader_key}"
  49. VERBATIM)
  50. if(CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES)
  51. add_custom_target(gen_secure_bootloader_key ALL DEPENDS "${secure_bootloader_key}")
  52. else()
  53. if(NOT EXISTS "${secure_bootloader_key}")
  54. message(FATAL_ERROR
  55. "No pre-generated key for a reflashable secure bootloader is available, "
  56. "due to signing configuration."
  57. "\nTo generate one, you can use this command:"
  58. "\n\t${espsecurepy} generate_flash_encryption_key ${secure_bootloader_key}"
  59. "\nIf a signing key is present, then instead use:"
  60. "\n\t${ESPSECUREPY} digest_private_key "
  61. "--keylen (192/256) --keyfile KEYFILE "
  62. "${secure_bootloader_key}")
  63. endif()
  64. add_custom_target(gen_secure_bootloader_key)
  65. endif()
  66. add_custom_command(OUTPUT "${bootloader_digest_bin}"
  67. COMMAND ${CMAKE_COMMAND} -E echo "DIGEST ${bootloader_digest_bin}"
  68. COMMAND ${ESPSECUREPY} digest_secure_bootloader --keyfile "${secure_bootloader_key}"
  69. -o "${bootloader_digest_bin}" "${CMAKE_BINARY_DIR}/bootloader.bin"
  70. DEPENDS gen_secure_bootloader_key "${CMAKE_BINARY_DIR}/bootloader.bin"
  71. VERBATIM)
  72. add_custom_target (gen_bootloader_digest_bin ALL DEPENDS "${bootloader_digest_bin}")
  73. endif()
  74. if(CONFIG_SECURE_BOOTLOADER_ONE_TIME_FLASH)
  75. add_custom_command(TARGET bootloader POST_BUILD
  76. COMMAND ${CMAKE_COMMAND} -E echo
  77. "=============================================================================="
  78. COMMAND ${CMAKE_COMMAND} -E echo
  79. "Bootloader built. Secure boot enabled, so bootloader not flashed automatically."
  80. COMMAND ${CMAKE_COMMAND} -E echo
  81. "One-time flash command is:"
  82. COMMAND ${CMAKE_COMMAND} -E echo
  83. "\t${esptoolpy_write_flash} ${BOOTLOADER_OFFSET} ${CMAKE_BINARY_DIR}/bootloader.bin"
  84. COMMAND ${CMAKE_COMMAND} -E echo
  85. "* IMPORTANT: After first boot, BOOTLOADER CANNOT BE RE-FLASHED on same device"
  86. VERBATIM)
  87. elseif(CONFIG_SECURE_BOOTLOADER_REFLASHABLE)
  88. add_custom_command(TARGET bootloader POST_BUILD
  89. COMMAND ${CMAKE_COMMAND} -E echo
  90. "=============================================================================="
  91. COMMAND ${CMAKE_COMMAND} -E echo
  92. "Bootloader built and secure digest generated."
  93. COMMAND ${CMAKE_COMMAND} -E echo
  94. "Secure boot enabled, so bootloader not flashed automatically."
  95. COMMAND ${CMAKE_COMMAND} -E echo
  96. "Burn secure boot key to efuse using:"
  97. COMMAND ${CMAKE_COMMAND} -E echo
  98. "\t${espefusepy} burn_key secure_boot ${secure_bootloader_key}"
  99. COMMAND ${CMAKE_COMMAND} -E echo
  100. "First time flash command is:"
  101. COMMAND ${CMAKE_COMMAND} -E echo
  102. "\t${esptoolpy_write_flash} ${BOOTLOADER_OFFSET} ${CMAKE_BINARY_DIR}/bootloader.bin"
  103. COMMAND ${CMAKE_COMMAND} -E echo
  104. "=============================================================================="
  105. COMMAND ${CMAKE_COMMAND} -E echo
  106. "To reflash the bootloader after initial flash:"
  107. COMMAND ${CMAKE_COMMAND} -E echo
  108. "\t${esptoolpy_write_flash} 0x0 ${bootloader_digest_bin}"
  109. COMMAND ${CMAKE_COMMAND} -E echo
  110. "=============================================================================="
  111. COMMAND ${CMAKE_COMMAND} -E echo
  112. "* After first boot, only re-flashes of this kind (with same key) will be accepted."
  113. COMMAND ${CMAKE_COMMAND} -E echo
  114. "* Not recommended to re-use the same secure boot keyfile on multiple production devices."
  115. DEPENDS gen_secure_bootloader_key gen_bootloader_digest_bin
  116. VERBATIM)
  117. endif()