blob: 76371ccdc508267d87fd67dd2778153bbe54f7cb (
plain)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
include_guard()
# include board specific
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
# Determine which SAM family based on board configuration
# SAM_FAMILY should be set by board.cmake (samd21, saml21, or saml22)
if(NOT DEFINED SAM_FAMILY)
# Default to samd21 if not specified for backward compatibility
set(SAM_FAMILY samd21)
endif()
set(SDK_DIR ${TOP}/hw/mcu/microchip/${SAM_FAMILY})
set(CMSIS_5 ${TOP}/lib/CMSIS_5)
# toolchain set up
set(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL "System Processor")
set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
set(FAMILY_MCUS SAMD21 SAML2X CACHE INTERNAL "")
set(OPENOCD_OPTION "-f interface/cmsis-dap.cfg -c \"transport select swd\" -f target/at91samdXX.cfg")
#------------------------------------
# Startup & Linker script
#------------------------------------
set(LD_FILE_Clang ${LD_FILE_GNU})
set(STARTUP_FILE_GNU ${SDK_DIR}/gcc/gcc/startup_${SAM_FAMILY}.c)
set(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})
#------------------------------------
# Board Target
#------------------------------------
function(family_add_board BOARD_TARGET)
# Common sources for all SAM families
set(COMMON_SOURCES
${SDK_DIR}/gcc/system_${SAM_FAMILY}.c
${SDK_DIR}/hal/src/hal_atomic.c
${SDK_DIR}/hpl/gclk/hpl_gclk.c
)
# Family-specific sources
if(SAM_FAMILY STREQUAL "samd21")
list(APPEND COMMON_SOURCES
${SDK_DIR}/hpl/pm/hpl_pm.c
${SDK_DIR}/hpl/sysctrl/hpl_sysctrl.c
)
else()
# SAML21/SAML22
list(APPEND COMMON_SOURCES
${SDK_DIR}/hpl/mclk/hpl_mclk.c
${SDK_DIR}/hpl/osc32kctrl/hpl_osc32kctrl.c
${SDK_DIR}/hpl/oscctrl/hpl_oscctrl.c
${SDK_DIR}/hpl/pm/hpl_pm.c
)
endif()
add_library(${BOARD_TARGET} STATIC ${COMMON_SOURCES})
target_include_directories(${BOARD_TARGET} PUBLIC
${SDK_DIR}
${SDK_DIR}/config
${SDK_DIR}/include
${SDK_DIR}/hal/include
${SDK_DIR}/hal/utils/include
${SDK_DIR}/hpl/pm
${SDK_DIR}/hpl/port
${SDK_DIR}/hri
${CMSIS_5}/CMSIS/Core/Include
)
# Family-specific compile definitions
if(SAM_FAMILY STREQUAL "samd21")
target_compile_definitions(${BOARD_TARGET} PUBLIC
CONF_DFLL_OVERWRITE_CALIBRATION=0
)
else()
# SAML21/SAML22
target_compile_definitions(${BOARD_TARGET} PUBLIC
CONF_OSC32K_CALIB_ENABLE=0
CFG_EXAMPLE_VIDEO_READONLY
)
endif()
update_board(${BOARD_TARGET})
endfunction()
#------------------------------------
# Functions
#------------------------------------
function(family_configure_example TARGET RTOS)
family_configure_common(${TARGET} ${RTOS})
# Determine MCU option based on SAM_FAMILY
if(SAM_FAMILY STREQUAL "samd21")
set(MCU_OPTION OPT_MCU_SAMD21)
elseif(SAM_FAMILY STREQUAL "saml21")
set(MCU_OPTION OPT_MCU_SAML21)
elseif(SAM_FAMILY STREQUAL "saml22")
set(MCU_OPTION OPT_MCU_SAML22)
else()
message(FATAL_ERROR "Unknown SAM_FAMILY: ${SAM_FAMILY}")
endif()
family_add_tinyusb(${TARGET} ${MCU_OPTION})
target_sources(${TARGET} PUBLIC
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
${TOP}/src/portable/microchip/samd/dcd_samd.c
${TOP}/src/portable/microchip/samd/hcd_samd.c
${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}
)
# Add HCD support for SAMD21 (has host capability)
if(SAM_FAMILY STREQUAL "samd21")
target_sources(${TARGET} PUBLIC
${TOP}/src/portable/microchip/samd/hcd_samd.c
)
endif()
target_include_directories(${TARGET} PUBLIC
${CMAKE_CURRENT_FUNCTION_LIST_DIR}
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../
${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}
)
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
target_link_options(${TARGET} PUBLIC
"LINKER:--script=${LD_FILE_GNU}"
-nostartfiles
--specs=nosys.specs --specs=nano.specs
)
elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
target_link_options(${TARGET} PUBLIC
"LINKER:--script=${LD_FILE_Clang}"
)
elseif (CMAKE_C_COMPILER_ID STREQUAL "IAR")
target_link_options(${TARGET} PUBLIC
"LINKER:--config=${LD_FILE_IAR}"
)
endif ()
set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES
SKIP_LINTING ON
COMPILE_OPTIONS -w)
# Flashing
family_add_bin_hex(${TARGET})
family_flash_jlink(${TARGET})
#family_flash_openocd(${TARGET})
endfunction()
|