summaryrefslogtreecommitdiff
path: root/cmake/intel-quark-d2000.toolchain.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/intel-quark-d2000.toolchain.cmake')
-rw-r--r--cmake/intel-quark-d2000.toolchain.cmake79
1 files changed, 61 insertions, 18 deletions
diff --git a/cmake/intel-quark-d2000.toolchain.cmake b/cmake/intel-quark-d2000.toolchain.cmake
index 3e15792..16f12f5 100644
--- a/cmake/intel-quark-d2000.toolchain.cmake
+++ b/cmake/intel-quark-d2000.toolchain.cmake
@@ -1,6 +1,6 @@
if (${INTEL_QUARK_TOOLCHAIN_LOADED})
- return()
-endif()
+ return()
+endif ()
set(INTEL_QUARK_TOOLCHAIN_LOADED TRUE)
include(CMakeForceCompiler)
@@ -10,12 +10,14 @@ set(TRIPLE "i586-intel-elfiamcu")
if (NOT IS_DIRECTORY "${ISSM_DIR}")
message(FATAL_ERROR "ISSM_DIR has to be set to a directory:" ${ISSM_DIR})
set(ISSM_DIR CACHE PATH "The path to Intes ISSM")
-endif()
+endif ()
if (NOT INTEL_QUARK_CHIP)
set(INTEL_QUARK_CHIP CACHE STRING "The Intel Quark chip to build for")
message(FATAL_ERROR "INTEL_QUARK_CHIP has to be set before including the toolchain file")
-endif()
+endif ()
+
+get_filename_component(toolchain_dir "${CMAKE_TOOLCHAIN_FILE}" DIRECTORY)
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR intel)
@@ -26,22 +28,22 @@ set(BASE_FLAGS "-std=c90 -Wall -Wextra -Werror -Wno-unused-parameter")
set(INCLUDES "")
-if(IS_DIRECTORY "${QMSI_DIR}")
+if (IS_DIRECTORY "${QMSI_DIR}")
message("Using QMSI_DIR: ${QMSI_DIR}")
-else()
+else ()
message("Detecting QMSI_DIR..")
find_path(QMSI_DIR qm_common.h
- HINTS "${ISSM_DIR}/firmware/bsp/1.0/include"
- NO_DEFAULT_PATH)
+ HINTS "${ISSM_DIR}/firmware/bsp/1.0/include"
+ NO_DEFAULT_PATH)
- if(IS_DIRECTORY "${QMSI_DIR}")
+ if (IS_DIRECTORY "${QMSI_DIR}")
message("Found QMSI_DIR: ${QMSI_DIR}")
- else()
+ else ()
message(FATAL_ERROR "Could not find QMSI directory")
- endif()
+ endif ()
-endif()
+endif ()
# TODO: these directories should be validated
list(APPEND includes "${ISSM_DIR}/firmware/bsp/1.0/include")
@@ -52,9 +54,12 @@ list(APPEND includes "${ISSM_DIR}/firmware/bsp/1.0/drivers/bmc150")
if (INTEL_QUARK_CHIP STREQUAL D2000)
list(APPEND includes "${ISSM_DIR}/firmware/bsp/1.0/soc/quark_d2000/include")
set(ld_file "${ISSM_DIR}/firmware/bsp/1.0/soc/quark_d2000/quark_d2000.ld")
+
+ list(APPEND mcu_text_areas 0x00180000:20k)
+ list(APPEND mcu_data_areas 0x00280000:5k)
elseif (INTEL_QUARK_CHIP STREQUAL SE)
list(APPEND includes "${ISSM_DIR}/firmware/bsp/1.0/soc/quark_se/include")
-endif()
+endif ()
# QMSI Library
file(GLOB_RECURSE qmsi_sources ${ISSM_DIR}/firmware/bsp/1.0/drivers/*.c)
@@ -129,7 +134,7 @@ set(CMAKE_C_FLAGS "${BASE_FLAGS} ${TARGET_FLAGS} " CACHE STRING "c flags")
set(CMAKE_CXX_FLAGS "${BASE_FLAGS} ${TARGET_FLAGS} -fno-exceptions -fno-rtti -felide-constructors -std=c++14" CACHE STRING "c++ flags")
# ${CMAKE_C_FLAGS} is prepended to this string
-set(LD_FILE )
+set(LD_FILE)
set(linker_flags "")
set(linker_flags "${linker_flags} -nostdlib")
set(linker_flags "${linker_flags} -Xlinker -A")
@@ -143,9 +148,9 @@ set(CMAKE_EXE_LINKER_FLAGS "${linker_flags}" CACHE STRING "linker flags" FORCE)
set(GCC "${ISSM_DIR}/tools/compiler/bin/${TRIPLE}-gcc")
-if(NOT EXISTS "${GCC}")
+if (NOT EXISTS "${GCC}")
message(FATAL_ERROR "Could not find ${TRIPLE}-gcc. Is $ISSM_DIR set correctly?")
-endif()
+endif ()
# No C++ support for D2000
# set(GXX "${ISSM_DIR}/tools/compiler/bin/${TRIPLE}-g++")
@@ -156,13 +161,14 @@ endif()
cmake_force_c_compiler("${GCC}" GNU)
-# search for programs in the build host directories
+# search for programs in the build elfinfo directories
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
function(toolchain_target TARGET)
+ add_dependencies("${TARGET}" elfinfo)
target_link_libraries("${TARGET}" intel_sys)
target_link_libraries("${TARGET}" qmsi)
target_link_libraries("${TARGET}" ipp)
@@ -170,7 +176,44 @@ function(toolchain_target TARGET)
target_link_libraries("${TARGET}" softfp)
target_link_libraries("${TARGET}" c)
target_link_libraries("${TARGET}" g)
-# target_link_libraries("${TARGET}" gcc)
+ # target_link_libraries("${TARGET}" gcc)
target_compile_definitions("${TARGET}" PUBLIC -D__IPP_ENABLED__)
target_link_libraries("${TARGET}" "-Xlinker" "-T${ld_file}")
endfunction()
+
+# elfinfo tools
+
+get_filename_component(ELFINFO_SOURCE_DIR "${toolchain_dir}/elfinfo" ABSOLUTE)
+get_filename_component(ELFINFO_INSTALL_DIR "${CMAKE_BINARY_DIR}/elfinfo" ABSOLUTE)
+
+include(ExternalProject)
+ExternalProject_Add(elfinfo
+ SOURCE_DIR "${ELFINFO_SOURCE_DIR}"
+ DOWNLOAD_COMMAND ""
+ UPDATE_COMMAND ""
+ CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${ELFINFO_INSTALL_DIR})
+
+function(add_extra_commands target_name)
+ # add_custom_command(TARGET ${target_name} POST_BUILD
+ # COMMAND mkdir -p ${target_name}-info && arm-none-eabi-objdump -D ${target_name} > ${target_name}-info/${target_name}.asm)
+ # add_custom_command(TARGET ${target_name} POST_BUILD
+ # COMMAND mkdir -p ${target_name}-info && arm-none-eabi-nm -C ${target_name} > ${target_name}-info/${target_name}.nm)
+ # add_custom_command(TARGET ${target_name} POST_BUILD
+ # COMMAND mkdir -p ${target_name}-info && arm-none-eabi-size ${target_name} > ${target_name}-info/${target_name}.size)
+ # add_custom_command(TARGET ${target_name} POST_BUILD
+ # COMMAND mkdir -p ${target_name}-info && arm-none-eabi-readelf -a ${target_name} > ${target_name}-info/${target_name}.readelf)
+ # add_custom_command(TARGET ${target_name} POST_BUILD
+ # COMMAND mkdir -p ${target_name}-info && arm-none-eabi-objcopy -O ihex ${target_name} ${target_name}-info/${target_name}.hex)
+ # add_custom_command(TARGET ${target_name} POST_BUILD
+ # COMMAND mkdir -p ${target_name}-info && arm-none-eabi-objcopy -O binary ${target_name} ${target_name}-info/${target_name}.bin)
+
+ foreach(area ${mcu_text_areas})
+ set(text_segments "${text_segments}" "-t" "${area}")
+ endforeach()
+ foreach(area ${mcu_data_areas})
+ set(data_segments "${data_segments}" "-d" "${area}")
+ endforeach()
+
+ add_custom_command(TARGET ${target_name} DEPENDS elfinfo POST_BUILD
+ COMMAND "${ELFINFO_INSTALL_DIR}/bin/elfinfo" -f ${target_name} ${text_segments} ${data_segments})
+endfunction()