forked from Santroller/Santroller
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathavr.cmake
113 lines (103 loc) · 3.8 KB
/
avr.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# For AVR, we have projects for arduinos that are similar enough to run the same
# code after that there are variants that specify small differences, such as the
# micro vs leo
set(PROJECTS "micro;uno")
set(OUTPUT_EXT "bin;eep;elf;hex;lss;map;sym")
# for usbserial firmwares we need the original arduino pids
set(uno_PID 0x0001)
set(mega2560_PID 0x0010)
set(megaadk_PID 0x003f)
# List all processors used by different variants
set(uno_main_MCUS atmega328p)
set(mega2560_main_MCUS atmega2560)
set(megaadk_main_MCUS atmega2560)
set(mini_main_MCUS atmega328p)
set(uno_usb_MCUS "atmega16u2;at90usb82")
set(mega2560_usb_MCUS "atmega16u2;at90usb82")
set(megaadk_usb_MCUS "atmega16u2;at90usb82")
set(micro_main_MCUS atmega32u4)
set(a-micro_main_MCUS atmega32u4)
set(leonardo_main_MCUS atmega32u4)
# map the variants to their respective header files in src/avr/variants
set(micro_VARIANT micro)
set(a-micro_VARIANT micro)
set(leonardo_VARIANT micro)
set(mini_VARIANT uno)
set(uno_VARIANT uno)
set(mega2560_VARIANT mega)
set(megaadk_VARIANT mega)
# for micro based builds, the multi firmare is based on the main firmware, but
# it is based on the usb firmware for unos.
set(uno_multi_BUILD_TYPE usb)
set(micro_multi_BUILD_TYPE main)
set(uno_VARIANTS "uno;mega2560;megaadk;mini")
set(micro_VARIANTS "micro;a-micro;leonardo")
set(F_CPU_8_mini TRUE)
set(F_CPU_8_micro TRUE)
foreach(PROJECT ${PROJECTS})
foreach(VARIANT ${${PROJECT}_VARIANTS})
set(TYPES "rf;multi;main")
if(${PROJECT} MATCHES "uno")
list(APPEND TYPES usb)
list(APPEND TYPES usbserial)
endif()
# Minis only support RF, as they don't have usb
if(${VARIANT} MATCHES "mini")
set(TYPES rf)
endif()
foreach(TYPE ${TYPES})
set(F_CPUS 16000000)
# If 8mhz is supported then add it to the list of built frequencies
if((${F_CPU_8_${PROJECT}}) OR (${F_CPU_8_${VARIANT}}))
list(APPEND F_CPUS 8000000)
endif()
# Find the correct type of build for the spefied type
if(${TYPE} MATCHES "multi")
set(BUILD_TYPE ${${PROJECT}_multi_BUILD_TYPE})
elseif(NOT ${TYPE} MATCHES "usb")
set(BUILD_TYPE main)
else()
set(BUILD_TYPE usb)
endif()
# Handle appending things to the end for special builds
unset(EXTRA)
set(DIR ${BUILD_TYPE})
if(NOT (${TYPE} MATCHES "(usb|main)$"))
set(EXTRA -${TYPE})
endif()
# usbserial and rf builds have their own directories, They aren't just
# flags like multi
if(NOT ${TYPE} MATCHES "usbserial|rf")
set(TYPE ${BUILD_TYPE})
endif()
set(PID ${${VARIANT}_PID})
foreach(MCU ${${VARIANT}_${BUILD_TYPE}_MCUS})
foreach(F_CPU ${F_CPUS})
if(${PROJECT} MATCHES "uno")
set(TARGET
ardwiino-${VARIANT}-${BUILD_TYPE}-${MCU}-${F_CPU}${EXTRA})
else()
set(TARGET ardwiino-${VARIANT}-${MCU}-${F_CPU}${EXTRA})
endif()
set(IN ../src/avr/${PROJECT}/${TYPE})
set(OUT ${CMAKE_CURRENT_BINARY_DIR}/firmware/${TARGET})
set(OBJDIRF ${CMAKE_CURRENT_BINARY_DIR}/obj/${TARGET})
add_custom_target(${TARGET} ALL)
unset(OUTPUTS)
foreach(OUTPUT ${OUTPUT_EXT})
list(APPEND OUTPUTS ${OUT}.${OUTPUT})
endforeach()
add_custom_command(
TARGET ${TARGET}
COMMAND
make OBJDIR=${OBJDIRF} VERSION_MAJOR=${VERSION_MAJOR} VERSION_MINOR=${VERSION_MINOR}
VERSION_REVISION=${VERSION_REVISION} F_USB=${F_CPU} F_CPU=${F_CPU}
ARDUINO_MODEL_PID=${PID} ARDWIINO_BOARD=${VARIANT} EXTRA=${EXTRA}
TARGET=${OUT} MCU=${MCU} VARIANT=${${VARIANT}_VARIANT}
WORKING_DIRECTORY ${IN}
BYPRODUCTS ${OBJDIRF} ${OUTPUTS})
endforeach()
endforeach()
endforeach()
endforeach()
endforeach()