|
| 1 | +ifndef NRF52_SDK_ROOT |
| 2 | + $(error NRF52_SDK_ROOT not defined! You must specify where nRF52 SDK resides!) |
| 3 | +endif |
| 4 | + |
| 5 | +ifneq ($(filter %.flash erase,$(MAKECMDGOALS)),) |
| 6 | +ifeq ($(NRF52_JLINK_PATH),) |
| 7 | +NRF52_JLINK_PATH=$(shell location=$$(which JLinkExe) && dirname $$location) |
| 8 | +endif |
| 9 | +ifeq ($(NRF52_JLINK_PATH),) |
| 10 | + $(error JLink not found in PATH and NRF52_JLINK_PATH path is not defined) |
| 11 | +endif |
| 12 | +endif |
| 13 | + |
| 14 | +ifeq ($(CONTIKI_WITH_RIME),1) |
| 15 | + $(error Rime stack is not supported!) |
| 16 | +endif |
| 17 | + |
| 18 | +ifneq ($(CONTIKI_WITH_IPV6),1) |
| 19 | + $(error Only IPv6 stack is supported!) |
| 20 | +endif |
| 21 | + |
| 22 | +$(info SDK: $(NRF52_SDK_ROOT)) |
| 23 | + |
| 24 | +ifeq ($(NRF52_DK_REVISION),) |
| 25 | +NRF52_DK_REVISION=pca10040 |
| 26 | +endif |
| 27 | + |
| 28 | +ifneq ($(NRF52_WITHOUT_SOFTDEVICE),1) |
| 29 | + ifeq ($(NRF52_SOFTDEVICE),) |
| 30 | + NRF52_SOFTDEVICE := $(shell find $(NRF52_SDK_ROOT) -name *iot*_softdevice.hex | head -n 1) |
| 31 | + endif |
| 32 | + $(info SoftDevice: $(NRF52_SOFTDEVICE)) |
| 33 | + LINKER_SCRIPT := $(CONTIKI_CPU)/ld/nrf52-$(NRF52_DK_REVISION)-sd.ld |
| 34 | +else |
| 35 | + LINKER_SCRIPT := $(CONTIKI_CPU)/ld/nrf52.ld |
| 36 | +endif |
| 37 | + |
| 38 | +OUTPUT_FILENAME := $(CONTIKI_PROJECT) |
| 39 | +MAKEFILE_NAME := $(MAKEFILE_LIST) |
| 40 | +MAKEFILE_DIR := $(dir $(MAKEFILE_NAME) ) |
| 41 | + |
| 42 | +TEMPLATE_PATH = $(NRF52_SDK_ROOT)/components/toolchain/gcc |
| 43 | + |
| 44 | +OBJECT_DIRECTORY = $(OBJECTDIR) |
| 45 | +LISTING_DIRECTORY := $(OBJECTDIR) |
| 46 | +OUTPUT_BINARY_DIRECTORY := bin_$(TARGET) |
| 47 | + |
| 48 | +MK := mkdir |
| 49 | +RM := rm -rf |
| 50 | + |
| 51 | +# Toolchain commands |
| 52 | +CC := arm-none-eabi-gcc |
| 53 | +AS := arm-none-eabi-as |
| 54 | +AR := arm-none-eabi-ar |
| 55 | +LD := arm-none-eabi-ld |
| 56 | +NM := arm-none-eabi-nm |
| 57 | +OBJDUMP := arm-none-eabi-objdump |
| 58 | +OBJCOPY := arm-none-eabi-objcopy |
| 59 | +SIZE := arm-none-eabi-size |
| 60 | + |
| 61 | +# JLink |
| 62 | +JLINK := $(NRF52_JLINK_PATH)/JLinkExe |
| 63 | +JLINK_OPTS = -Device NRF52 -if swd -speed 1000 |
| 64 | +ifneq ($(NRF52_JLINK_SN),) |
| 65 | +JLINK_OPTS += -SelectEmuBySN $(NRF52_JLINK_SN) |
| 66 | +endif |
| 67 | + |
| 68 | +#function for removing duplicates in a list |
| 69 | +remduplicates = $(strip $(if $1,$(firstword $1) $(call remduplicates,$(filter-out $(firstword $1),$1)))) |
| 70 | + |
| 71 | +### CPU-dependent directories |
| 72 | +CONTIKI_CPU_DIRS += . dev ble #compat |
| 73 | + |
| 74 | +### CPU-dependent source files |
| 75 | +CONTIKI_CPU_SOURCEFILES += clock.c rtimer-arch.c uart0.c putchar.c watchdog.c |
| 76 | + |
| 77 | +ifneq ($(NRF52_WITHOUT_SOFTDEVICE),1) |
| 78 | +CONTIKI_CPU_SOURCEFILES += ble-core.c ble-mac.c |
| 79 | +endif |
| 80 | + |
| 81 | +CONTIKI_SOURCEFILES += $(CONTIKI_CPU_SOURCEFILES) |
| 82 | + |
| 83 | +#source common to all targets |
| 84 | +C_SOURCE_FILES += $(NRF52_SDK_ROOT)/components/drivers_nrf/common/nrf_drv_common.c \ |
| 85 | + $(NRF52_SDK_ROOT)/components/drivers_nrf/gpiote/nrf_drv_gpiote.c \ |
| 86 | + $(NRF52_SDK_ROOT)/components/drivers_nrf/rtc/nrf_drv_rtc.c \ |
| 87 | + $(NRF52_SDK_ROOT)/components/drivers_nrf/clock/nrf_drv_clock.c \ |
| 88 | + $(NRF52_SDK_ROOT)/components/drivers_nrf/timer/nrf_drv_timer.c \ |
| 89 | + $(NRF52_SDK_ROOT)/components/drivers_nrf/wdt/nrf_drv_wdt.c \ |
| 90 | + $(NRF52_SDK_ROOT)/components/drivers_nrf/rng/nrf_drv_rng.c \ |
| 91 | + $(NRF52_SDK_ROOT)/components/drivers_nrf/delay/nrf_delay.c \ |
| 92 | + $(NRF52_SDK_ROOT)/components/drivers_nrf/uart/nrf_drv_uart.c \ |
| 93 | + $(NRF52_SDK_ROOT)/components/libraries/util/app_error.c \ |
| 94 | + $(NRF52_SDK_ROOT)/components/toolchain/system_nrf52.c |
| 95 | + |
| 96 | +ifneq ($(NRF52_WITHOUT_SOFTDEVICE),1) |
| 97 | +C_SOURCE_FILES += $(NRF52_SDK_ROOT)/components/softdevice/common/softdevice_handler/softdevice_handler.c \ |
| 98 | + $(NRF52_SDK_ROOT)/components/ble/common/ble_advdata.c |
| 99 | +else |
| 100 | +C_SOURCE_FILES += $(NRF52_SDK_ROOT)/components/libraries/fifo/app_fifo.c \ |
| 101 | + $(NRF52_SDK_ROOT)/components/libraries/util/app_util_platform.c |
| 102 | +endif |
| 103 | + |
| 104 | +#assembly files common to all targets |
| 105 | +ASM_SOURCE_FILES = $(NRF52_SDK_ROOT)/components/toolchain/gcc/gcc_startup_nrf52.s |
| 106 | + |
| 107 | +#includes common to all targets |
| 108 | +INC_PATHS += components/drivers_nrf/gpiote |
| 109 | +INC_PATHS += components/drivers_nrf/hal |
| 110 | +INC_PATHS += components/drivers_nrf/config |
| 111 | +INC_PATHS += components/drivers_nrf/delay |
| 112 | +INC_PATHS += components/drivers_nrf/uart |
| 113 | +INC_PATHS += components/drivers_nrf/common |
| 114 | +INC_PATHS += components/drivers_nrf/rtc |
| 115 | +INC_PATHS += components/drivers_nrf/wdt |
| 116 | +INC_PATHS += components/drivers_nrf/rng |
| 117 | +INC_PATHS += components/drivers_nrf/clock |
| 118 | +INC_PATHS += components/drivers_nrf/timer |
| 119 | +INC_PATHS += components/libraries/util |
| 120 | +INC_PATHS += components/libraries/timer |
| 121 | +INC_PATHS += components/device |
| 122 | +INC_PATHS += components/toolchain/gcc |
| 123 | +INC_PATHS += components/toolchain |
| 124 | +INC_PATHS += examples/bsp |
| 125 | + |
| 126 | +ifneq ($(NRF52_WITHOUT_SOFTDEVICE),1) |
| 127 | +INC_PATHS += components/softdevice/s1xx_iot/headers |
| 128 | +INC_PATHS += components/softdevice/s1xx_iot/headers/nrf52 |
| 129 | +INC_PATHS += components/softdevice/common/softdevice_handler |
| 130 | +INC_PATHS += components/ble/common |
| 131 | +INC_PATHS += components/iot/common |
| 132 | +INC_PATHS += components/iot/ble_ipsp |
| 133 | +else |
| 134 | +INC_PATHS += components/drivers_nrf/nrf_soc_nosd |
| 135 | +INC_PATHS += components/libraries/fifo |
| 136 | +endif |
| 137 | + |
| 138 | +EXTERNALDIRS += $(addprefix $(NRF52_SDK_ROOT)/, $(INC_PATHS)) |
| 139 | + |
| 140 | +# Sorting removes duplicates |
| 141 | +BUILD_DIRECTORIES := $(sort $(OUTPUT_BINARY_DIRECTORY) $(LISTING_DIRECTORY)) |
| 142 | + |
| 143 | +# Clean files and directories |
| 144 | +CLEAN += bin_$(TARGET) lst_$(TARGET) nrf52832.a *.elf *.hex |
| 145 | + |
| 146 | +#flags common to all targets |
| 147 | +ifneq ($(NRF52_WITHOUT_SOFTDEVICE),1) |
| 148 | +CFLAGS += -DSOFTDEVICE_PRESENT |
| 149 | +CFLAGS += -DS132 |
| 150 | +endif |
| 151 | + |
| 152 | +ifeq ($(SMALL),1) |
| 153 | +CFLAGS += -Os |
| 154 | +else |
| 155 | +CFLAGS += -O2 |
| 156 | +endif |
| 157 | + |
| 158 | +CFLAGS += -DNRF52 |
| 159 | +CFLAGS += -DBOARD_$(shell echo $(NRF52_DK_REVISION) | tr a-z A-Z) |
| 160 | +CFLAGS += -D__HEAP_SIZE=512 |
| 161 | +CFLAGS += -DSWI_DISABLE0 |
| 162 | +CFLAGS += -DCONFIG_GPIO_AS_PINRESET |
| 163 | +CFLAGS += -DBLE_STACK_SUPPORT_REQD |
| 164 | +CFLAGS += -mcpu=cortex-m4 |
| 165 | +CFLAGS += -mthumb -mabi=aapcs --std=gnu99 |
| 166 | +CFLAGS += -Wall -Werror |
| 167 | +CFLAGS += -ggdb |
| 168 | +CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 |
| 169 | +# keep every function in separate section. This will allow linker to dump unused functions |
| 170 | +CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing |
| 171 | +CFLAGS += -fno-builtin --short-enums |
| 172 | + |
| 173 | +# keep every function in separate section. This will allow linker to dump unused functions |
| 174 | +LDFLAGS += -Xlinker -Map=$(LISTING_DIRECTORY)/$(OUTPUT_FILENAME).map |
| 175 | +LDFLAGS += -mthumb -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT) |
| 176 | +LDFLAGS += -mcpu=cortex-m4 |
| 177 | +LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 |
| 178 | +# let linker to dump unused sections |
| 179 | +LDFLAGS += -Wl,--gc-sections |
| 180 | +# use newlib in nano version |
| 181 | +LDFLAGS += --specs=nano.specs -lc -lnosys |
| 182 | + |
| 183 | +# Assembler flags |
| 184 | +ifneq ($(NRF52_WITHOUT_SOFTDEVICE),1) |
| 185 | +ASMFLAGS += -DSOFTDEVICE_PRESENT |
| 186 | +ASMFLAGS += -DS132 |
| 187 | +endif |
| 188 | +ASMFLAGS += -x assembler-with-cpp |
| 189 | +ASMFLAGS += -DSWI_DISABLE0 |
| 190 | +ASMFLAGS += -DNRF52 |
| 191 | +ASMFLAGS += -DBOARD_$(shell echo $(NRF52_DK_REVISION) | tr a-z A-Z) |
| 192 | +ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET |
| 193 | +ASMFLAGS += -DBLE_STACK_SUPPORT_REQD |
| 194 | + |
| 195 | +C_SOURCE_FILE_NAMES = $(notdir $(C_SOURCE_FILES)) |
| 196 | +C_PATHS = $(call remduplicates, $(dir $(C_SOURCE_FILES) ) ) |
| 197 | +C_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(C_SOURCE_FILE_NAMES:.c=.o) ) |
| 198 | + |
| 199 | +ASM_SOURCE_FILE_NAMES = $(notdir $(ASM_SOURCE_FILES)) |
| 200 | +ASM_PATHS = $(call remduplicates, $(dir $(ASM_SOURCE_FILES) )) |
| 201 | +ASM_OBJECTS = $(addprefix $(OBJECT_DIRECTORY)/, $(ASM_SOURCE_FILE_NAMES:.s=.o) ) |
| 202 | + |
| 203 | +vpath %.c $(C_PATHS) |
| 204 | +vpath %.s $(ASM_PATHS) |
| 205 | + |
| 206 | +OBJECTS = $(C_OBJECTS) $(ASM_OBJECTS) |
| 207 | + |
| 208 | +TARGET_LIBS= nrf52832.a $(NRF52_SDK_ROOT)/components/iot/ble_6lowpan/lib/ble_6lowpan.a |
| 209 | + |
| 210 | +### Don't treat the .elf as intermediate |
| 211 | +.PRECIOUS: %.hex %.bin |
| 212 | + |
| 213 | +nrf52832.a: $(OBJECTS) |
| 214 | + $(TRACE_AR) |
| 215 | + $(Q)$(AR) $(AROPTS) $@ $^ |
| 216 | + |
| 217 | +### Compilation rules |
| 218 | +CUSTOM_RULE_LINK=1 |
| 219 | + |
| 220 | +%.elf: $(TARGET_STARTFILES) %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a $(TARGET_LIBS) |
| 221 | + $(TRACE_LD) |
| 222 | + $(Q)$(CC) $(LDFLAGS) ${filter %o %.co %.a,$^} -o $@ |
| 223 | + |
| 224 | +# Assemble files |
| 225 | +$(OBJECT_DIRECTORY)/%.o: %.s |
| 226 | + @echo Compiling file: $(notdir $<) |
| 227 | + $(Q)$(CC) $(ASMFLAGS) $(addprefix -I$(NRF52_SDK_ROOT)/, $(INC_PATHS)) -c -o $@ $< |
| 228 | + |
| 229 | +# Create binary file from the .out file |
| 230 | +%.bin: %.elf |
| 231 | + @echo Preparing: $@ |
| 232 | + $(Q)$(OBJCOPY) -O binary $^ $@ |
| 233 | + |
| 234 | +# Create binary .hex file from the .out file |
| 235 | +%.hex: %.elf |
| 236 | + @echo Preparing: $@ |
| 237 | + $(Q)$(OBJCOPY) -O ihex $^ $@ |
| 238 | + |
| 239 | +### We don't really need the .hex and .bin for the .$(TARGET) but let's make |
| 240 | +### sure they get built |
| 241 | +%.$(TARGET): %.elf %.hex %.bin |
| 242 | + cp $*.elf $@ |
| 243 | + $(Q)$(SIZE) $@ |
| 244 | + |
| 245 | +%.jlink: |
| 246 | + sed -e 's/#OUTPUT_FILENAME#/$*.hex/' $(CONTIKI_CPU)/flash.jlink > $@ |
| 247 | + |
| 248 | +%.flash: %.hex %.jlink |
| 249 | + @echo Flashing: $^ |
| 250 | + $(JLINK) $(JLINK_OPTS) -CommanderScript $*.jlink |
| 251 | + |
| 252 | +softdevice.jlink: |
| 253 | + sed -e 's,#OUTPUT_FILENAME#,$(NRF52_SOFTDEVICE),' $(CONTIKI_CPU)/flash.jlink > $@ |
| 254 | + |
| 255 | +softdevice.flash: softdevice.jlink |
| 256 | + @echo Flashing: $(notdir $(NRF52_SOFTDEVICE)) |
| 257 | + $(JLINK) $(JLINK_OPTS) -CommanderScript $^ |
| 258 | + |
| 259 | +erase: |
| 260 | + $(JLINK) $(JLINK_OPTS) -CommanderScript $(CONTIKI_CPU)/erase.jlink |
| 261 | + |
| 262 | +.PHONY: softdevice.jlink |
0 commit comments