2019-02-06 23:22:59 +01:00
|
|
|
# give info about target
|
|
|
|
SET(CMAKE_SYSTEM_NAME Generic)
|
|
|
|
SET(CMAKE_SYSTEM_PROCESSOR avr)
|
|
|
|
|
|
|
|
# find tools
|
|
|
|
find_program(AVR_CC avr-gcc)
|
|
|
|
find_program(AVR_CXX avr-g++)
|
|
|
|
find_program(AVR_OBJCOPY avr-objcopy)
|
2019-02-08 22:22:28 +01:00
|
|
|
find_program(AVR_OBJDUMP avr-objdump)
|
2019-02-06 23:22:59 +01:00
|
|
|
find_program(AVR_SIZE_TOOL avr-size)
|
|
|
|
|
|
|
|
# set compiler (globally)
|
|
|
|
SET(CMAKE_C_COMPILER ${AVR_CC})
|
|
|
|
SET(CMAKE_CXX_COMPILER ${AVR_CXX})
|
|
|
|
SET(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS)
|
|
|
|
|
2019-02-09 21:32:54 +01:00
|
|
|
|
|
|
|
if(NOT AVR_UPLOADTOOL)
|
|
|
|
set(
|
|
|
|
AVR_UPLOADTOOL avrdude
|
|
|
|
CACHE STRING "Set default upload tool: avrdude"
|
|
|
|
)
|
|
|
|
find_program(AVR_UPLOADTOOL avrdude)
|
|
|
|
endif(NOT AVR_UPLOADTOOL)
|
|
|
|
|
|
|
|
# default upload tool port
|
|
|
|
if(NOT AVR_UPLOADTOOL_PORT)
|
|
|
|
set(
|
|
|
|
AVR_UPLOADTOOL_PORT usb
|
|
|
|
CACHE STRING "Set default upload tool port: usb"
|
|
|
|
)
|
|
|
|
endif(NOT AVR_UPLOADTOOL_PORT)
|
|
|
|
|
|
|
|
# default programmer (hardware)
|
|
|
|
if(NOT AVR_PROGRAMMER)
|
|
|
|
set(
|
|
|
|
AVR_PROGRAMMER atmelice_isp
|
|
|
|
CACHE STRING "Set default programmer hardware model: avrispmkII"
|
|
|
|
)
|
|
|
|
endif(NOT AVR_PROGRAMMER)
|
|
|
|
|
|
|
|
# prepare base flags for upload tool
|
|
|
|
set(AVR_UPLOADTOOL_BASE_OPTIONS -p ${AVR_MCU} -c ${AVR_PROGRAMMER} -B5)
|
|
|
|
|
2019-02-08 22:22:28 +01:00
|
|
|
add_definitions(-mmcu=${AVR_MCU} -D__${AVR_MCU}__ -DF_CPU=8000000 --std=c99)
|
2019-02-06 23:22:59 +01:00
|
|
|
|
|
|
|
function(add_avr_executable EXECUTABLE_NAME)
|
|
|
|
|
|
|
|
if(NOT ARGN)
|
|
|
|
message(FATAL_ERROR "No source files given for ${EXECUTABLE_NAME}.")
|
|
|
|
endif(NOT ARGN)
|
|
|
|
|
|
|
|
# set file names
|
|
|
|
set(elf_file ${EXECUTABLE_NAME})
|
|
|
|
set(hex_file ${EXECUTABLE_NAME}.hex)
|
|
|
|
set(lst_file ${EXECUTABLE_NAME}.lst)
|
|
|
|
set(map_file ${EXECUTABLE_NAME}.map)
|
|
|
|
set(eeprom_image ${EXECUTABLE_NAME}_eeprom.hex)
|
|
|
|
|
|
|
|
# elf file
|
|
|
|
add_executable(${elf_file} EXCLUDE_FROM_ALL ${ARGN})
|
|
|
|
|
|
|
|
set_target_properties(
|
|
|
|
${elf_file}
|
|
|
|
PROPERTIES
|
2019-02-13 00:05:27 +01:00
|
|
|
COMPILE_FLAGS "-mmcu=${AVR_MCU} -O3"
|
2019-02-06 23:22:59 +01:00
|
|
|
LINK_FLAGS "-mmcu=${AVR_MCU} -Wl,--gc-sections -mrelax -Wl,-Map,${map_file}"
|
|
|
|
)
|
|
|
|
|
|
|
|
add_custom_command(
|
|
|
|
OUTPUT ${hex_file}
|
|
|
|
COMMAND
|
|
|
|
${AVR_OBJCOPY} -j .text -j .data -O ihex ${elf_file} ${hex_file}
|
|
|
|
COMMAND
|
|
|
|
${AVR_SIZE_TOOL} ${AVR_SIZE_ARGS} ${elf_file}
|
|
|
|
DEPENDS ${elf_file}
|
|
|
|
)
|
|
|
|
|
|
|
|
add_custom_command(
|
|
|
|
OUTPUT ${lst_file}
|
|
|
|
COMMAND
|
|
|
|
${AVR_OBJDUMP} -d ${elf_file} > ${lst_file}
|
|
|
|
DEPENDS ${elf_file}
|
|
|
|
)
|
|
|
|
|
|
|
|
# eeprom
|
|
|
|
add_custom_command(
|
|
|
|
OUTPUT ${eeprom_image}
|
|
|
|
COMMAND
|
|
|
|
${AVR_OBJCOPY} -j .eeprom --set-section-flags=.eeprom=alloc,load
|
|
|
|
--change-section-lma .eeprom=0 --no-change-warnings
|
|
|
|
-O ihex ${elf_file} ${eeprom_image}
|
|
|
|
DEPENDS ${elf_file}
|
|
|
|
)
|
|
|
|
|
|
|
|
add_custom_target(
|
|
|
|
build_${EXECUTABLE_NAME}
|
|
|
|
ALL
|
|
|
|
DEPENDS ${hex_file} ${lst_file} ${eeprom_image}
|
|
|
|
)
|
|
|
|
|
|
|
|
set_target_properties(
|
|
|
|
build_${EXECUTABLE_NAME}
|
|
|
|
PROPERTIES
|
|
|
|
OUTPUT_NAME "${elf_file}"
|
|
|
|
)
|
|
|
|
|
2019-02-09 21:32:54 +01:00
|
|
|
# upload - with avrdude
|
|
|
|
add_custom_target(
|
|
|
|
upload_${EXECUTABLE_NAME}
|
|
|
|
${AVR_UPLOADTOOL} ${AVR_UPLOADTOOL_BASE_OPTIONS} ${AVR_UPLOADTOOL_OPTIONS}
|
|
|
|
-U flash:w:${hex_file}
|
|
|
|
-P ${AVR_UPLOADTOOL_PORT}
|
|
|
|
DEPENDS ${hex_file}
|
|
|
|
COMMENT "Uploading ${hex_file} to ${AVR_MCU} using ${AVR_PROGRAMMER}"
|
|
|
|
)
|
|
|
|
|
2019-02-06 23:22:59 +01:00
|
|
|
# clean
|
|
|
|
get_directory_property(clean_files ADDITIONAL_MAKE_CLEAN_FILES)
|
|
|
|
set_directory_properties(
|
|
|
|
PROPERTIES
|
|
|
|
ADDITIONAL_MAKE_CLEAN_FILES "${map_file}"
|
|
|
|
)
|
|
|
|
endfunction(add_avr_executable)
|