.PHONY: all clean flash gdbserver gdb jlinkexe rtt APP_ROOT=. MONGOOSE_ROOT=../.. BUILD_DIR=.build OUT_DIR=out PROJECT=example NRF_IOT_SDK_ROOT=/opt/nrf5_iot_sdk GNU_PREFIX := arm-none-eabi LD_PATH=$(APP_ROOT)/ld #echo suspend ifeq ("$(VERBOSE)","1") V := else V := @ endif # Toolchain commands CC := '$(GNU_PREFIX)-gcc' AS := '$(GNU_PREFIX)-as' AR := '$(GNU_PREFIX)-ar' -r LD := '$(GNU_PREFIX)-ld' NM := '$(GNU_PREFIX)-nm' OBJDUMP := '$(GNU_PREFIX)-objdump' OBJCOPY := '$(GNU_PREFIX)-objcopy' SIZE := '$(GNU_PREFIX)-size' IPATH_SDK = . \ $(NRF_IOT_SDK_ROOT)/components/iot/errno \ $(NRF_IOT_SDK_ROOT)/components/softdevice/s1xx_iot/headers \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/common \ $(NRF_IOT_SDK_ROOT)/components/softdevice/common/softdevice_handler \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/include \ $(NRF_IOT_SDK_ROOT)/components/iot/ble_6lowpan \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/hal \ $(NRF_IOT_SDK_ROOT)/components/ble/common \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/port \ $(NRF_IOT_SDK_ROOT)/components/libraries/fifo \ $(NRF_IOT_SDK_ROOT)/components/libraries/trace \ $(NRF_IOT_SDK_ROOT)/components/device \ $(NRF_IOT_SDK_ROOT)/components/libraries/uart \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/rng \ $(NRF_IOT_SDK_ROOT)/components/iot/medium \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/config \ $(NRF_IOT_SDK_ROOT)/components/libraries/mem_manager \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/uart \ $(NRF_IOT_SDK_ROOT)/components/iot/ble_ipsp \ $(NRF_IOT_SDK_ROOT)/components/libraries/scheduler \ $(NRF_IOT_SDK_ROOT)/components/iot/iot_timer \ $(NRF_IOT_SDK_ROOT)/components/iot/tls/mbedtls/tls/config \ $(NRF_IOT_SDK_ROOT)/external/mbedtls/include \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/include/netif \ $(NRF_IOT_SDK_ROOT)/components/iot/medium/commissioning \ $(NRF_IOT_SDK_ROOT)/components/iot/tls \ $(NRF_IOT_SDK_ROOT)/components/iot/include \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/pstorage \ $(NRF_IOT_SDK_ROOT)/components/iot/tls \ $(NRF_IOT_SDK_ROOT)/components/iot/context_manager \ $(NRF_IOT_SDK_ROOT)/components/iot_timer \ $(NRF_IOT_SDK_ROOT)/components/toolchain/gcc \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/delay \ $(NRF_IOT_SDK_ROOT)/components/iot/medium/ble_ncfgs \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/gpiote \ $(NRF_IOT_SDK_ROOT)/components/iot/mqtt \ $(NRF_IOT_SDK_ROOT)/components/softdevice/s1xx_iot/headers/nrf52 \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/include/lwip \ $(NRF_IOT_SDK_ROOT)/components/iot/common \ $(NRF_IOT_SDK_ROOT)/components/libraries/timer \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/port/arch \ $(NRF_IOT_SDK_ROOT)/components/libraries/button \ $(NRF_IOT_SDK_ROOT)/components/libraries/util \ $(NRF_IOT_SDK_ROOT)/examples/bsp \ $(NRF_IOT_SDK_ROOT)/components/toolchain \ $(NRF_IOT_SDK_ROOT)/components/iot/medium/include \ IPATH_RTT = $(APP_ROOT)/rtt/RTT IPATH_APP = $(APP_ROOT) $(APP_ROOT)/config IPATH = . $(IPATH_APP) $(IPATH_RTT) $(IPATH_SDK) SOURCES_NRF_IOT_SDK = \ $(NRF_IOT_SDK_ROOT)/examples/bsp/bsp.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/button/app_button.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/util/app_error.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/fifo/app_fifo.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/scheduler/app_scheduler.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/timer/app_timer.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/timer/app_timer_appsh.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/trace/app_trace.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/mem_manager/mem_manager.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/util/nrf_assert.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/uart/retarget.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/def.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/dhcp.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/ipv6/dhcp6.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/dns.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/ipv4/icmp.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/ipv6/icmp6.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/ipv6/inet6.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/inet_chksum.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/init.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/ipv4/ip4.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/ipv4/ip4_addr.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/ipv6/ip6.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/ipv6/ip6_addr.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/memp.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/ipv6/mld6.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/ipv6/nd6.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/netif.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/port/nrf_platform_port.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/pbuf.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/raw.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/sys.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/tcp.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/tcp_in.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/tcp_out.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/timers.c \ $(NRF_IOT_SDK_ROOT)/external/lwip/src/core/udp.c \ $(NRF_IOT_SDK_ROOT)/components/libraries/uart/app_uart_fifo.c \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/delay/nrf_delay.c \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/common/nrf_drv_common.c \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/gpiote/nrf_drv_gpiote.c \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/uart/nrf_drv_uart.c \ $(NRF_IOT_SDK_ROOT)/components/drivers_nrf/pstorage/pstorage.c \ $(NRF_IOT_SDK_ROOT)/components/ble/common/ble_advdata.c \ $(NRF_IOT_SDK_ROOT)/components/ble/common/ble_conn_params.c \ $(NRF_IOT_SDK_ROOT)/components/ble/common/ble_srv_common.c \ $(NRF_IOT_SDK_ROOT)/components/iot/errno/errno.c \ $(NRF_IOT_SDK_ROOT)/components/iot/context_manager/iot_context_manager.c \ $(NRF_IOT_SDK_ROOT)/components/iot/iot_timer/iot_timer.c \ $(NRF_IOT_SDK_ROOT)/components/iot/medium/ipv6_medium_ble.c \ $(NRF_IOT_SDK_ROOT)/components/iot/common/ipv6_parse.c \ $(NRF_IOT_SDK_ROOT)/components/toolchain/system_nrf52.c \ $(NRF_IOT_SDK_ROOT)/components/iot/medium/ble_ncfgs/ble_ncfgs.c \ $(NRF_IOT_SDK_ROOT)/components/iot/medium/commissioning/commissioning.c \ $(NRF_IOT_SDK_ROOT)/components/softdevice/common/softdevice_handler/softdevice_handler.c \ $(NRF_IOT_SDK_ROOT)/components/softdevice/common/softdevice_handler/softdevice_handler_appsh.c \ SOURCES_RTT = \ $(APP_ROOT)/rtt/RTT/SEGGER_RTT.c \ $(APP_ROOT)/rtt/RTT/SEGGER_RTT_printf.c \ $(APP_ROOT)/rtt/Syscalls/RTT_Syscalls_GCC.c \ SOURCES_APP = \ $(APP_ROOT)/main.c \ $(APP_ROOT)/bleconfig.c \ $(MONGOOSE_ROOT)/mongoose.c \ SOURCES = $(SOURCES_APP) $(SOURCES_NRF_IOT_SDK) $(SOURCES_RTT) LIBS = $(NRF_IOT_SDK_ROOT)/components/iot/ble_6lowpan/lib/ble_6lowpan.a ASM_SOURCES = $(APP_ROOT)/gcc_startup_nrf52.s LINKER_SCRIPT = $(LD_PATH)/mongoose_example_nrf52.ld C_SOURCE_FILE_NAMES = $(notdir $(SOURCES)) C_PATHS = $(sort $(dir $(SOURCES) ) ) ASM_PATHS = $(sort $(dir $(ASM_SOURCES) )) C_OBJECTS = $(addprefix $(BUILD_DIR)/, $(C_SOURCE_FILE_NAMES:.c=.o) ) ASM_SOURCE_FILE_NAMES = $(notdir $(ASM_SOURCES)) ASM_PATHS = $(sort $(dir $(ASM_SOURCES) )) ASM_OBJECTS = $(addprefix $(BUILD_DIR)/, $(ASM_SOURCE_FILE_NAMES:.s=.o) ) INCDIRS = $(addprefix -I,$(IPATH)) vpath %.c $(C_PATHS) vpath %.s $(ASM_PATHS) OBJECTS = $(C_OBJECTS) $(ASM_OBJECTS) # Mongoose features MG_FEATURES_TINY = \ -DMG_DISABLE_HTTP_DIGEST_AUTH \ -DMG_DISABLE_MD5 \ -DMG_DISABLE_HTTP_KEEP_ALIVE \ -DMG_ENABLE_HTTP_SSI=0 \ -DMG_ENABLE_HTTP_STREAMING_MULTIPART \ -DMG_NO_BSD_SOCKETS #flags common to all targets CFLAGS = -D__HEAP_SIZE=512 CFLAGS += -DSWI_DISABLE0 CFLAGS += -DSOFTDEVICE_PRESENT CFLAGS += -DBOARD_PCA10040 CFLAGS += -DNRF52 CFLAGS += -DCONFIG_GPIO_AS_PINRESET CFLAGS += -DBLE_STACK_SUPPORT_REQD CFLAGS += -Ds1xx CFLAGS += -mcpu=cortex-m4 CFLAGS += -mthumb -mabi=aapcs --std=gnu99 CFLAGS += -w -g3 -Os CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 # keep every function in separate section. This will allow linker to dump # unused functions CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing CFLAGS += -fno-builtin --short-enums CFLAGS += -DCS_ENABLE_STDIO #CFLAGS += -DCS_ENABLE_DEBUG # This macro is needed for stdout to be retargeted to either UART or RTT CFLAGS += -DENABLE_DEBUG_LOG_SUPPORT # Don't retarget stdout to UART; it'll be retargeted to RTT CFLAGS += -DNRF_LOG_USES_RTT # Mongoose flags CFLAGS += -DCS_PLATFORM=CS_P_NRF52 $(MG_FEATURES_TINY) -DMG_MODULE_LINES LDFLAGS += -Xlinker -Map=$(OUT_DIR)/$(PROJECT).map LDFLAGS += -mthumb -mabi=aapcs -L $(LD_PATH) -T$(LINKER_SCRIPT) LDFLAGS += -mcpu=cortex-m4 LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 # let linker to dump unused sections LDFLAGS += -Wl,--gc-sections # use newlib in nano version LDFLAGS += --specs=nano.specs -lc -lnosys # Assembler flags ASMFLAGS += -x assembler-with-cpp ASMFLAGS += -D__HEAP_SIZE=512 ASMFLAGS += -DSWI_DISABLE0 ASMFLAGS += -DSOFTDEVICE_PRESENT ASMFLAGS += -DBOARD_PCA10040 ASMFLAGS += -DNRF52 ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET ASMFLAGS += -DENABLE_DEBUG_LOG_SUPPORT ASMFLAGS += -DBLE_STACK_SUPPORT_REQD ASMFLAGS += -Ds1xx ASMFLAGS += -g3 INC_PATHS=$(addprefix -I,$(IPATH)) BUILD_DIRECTORIES := $(BUILD_DIR) $(OUT_DIR) # Create objects from C SRC files $(BUILD_DIR)/%.o: %.c @echo Compiling file: $(notdir $<) $(V)$(CC) $(CFLAGS) $(INC_PATHS) -c -o $@ $< # Assemble files $(BUILD_DIR)/%.o: %.s @echo Assembly file: $(notdir $<) $(V)$(CC) $(ASMFLAGS) $(INC_PATHS) -c -o $@ $< # Create binary .hex file from the .out file %.hex: %.out @echo Generating HEX file: $@ $(V)$(OBJCOPY) -O ihex $< $@ OUT_FILENAME=$(OUT_DIR)/$(PROJECT).out HEX_FILENAME=$(OUT_DIR)/$(PROJECT).hex all: $(OUT_FILENAME) $(HEX_FILENAME) $(OUT_FILENAME): $(BUILD_DIRECTORIES) $(OBJECTS) @echo Linking target: $(OUT_FILENAME) $(V)$(CC) $(LDFLAGS) $(OBJECTS) $(LIBS) -o $(OUT_FILENAME) ## Create build directories $(BUILD_DIRECTORIES): mkdir $@ clean: rm -rf $(BUILD_DIR) $(OUT_DIR) \ # Flash the program flash: $(HEX_FILENAME) @echo Flashing: $< /opt/nordic/nrfjprog/nrfjprog --program $< -f nrf52 --sectorerase /opt/nordic/nrfjprog/nrfjprog --reset -f nrf52 # start GDB server. It is needed to be done in a separate terminal before we # can invoke `gdb` target gdbserver: /opt/SEGGER/JLink_V610g/JLinkGDBServer -device NRF52 -speed 4000 -if SWD # run GDB (for that to work, `make gdbserver` should run in parallel) gdb: arm-none-eabi-gdb # start JLinkExe; it is needed to be done in a separate terminal before we # can invoke `rtt` target jlinkexe: /opt/SEGGER/JLink_V610g/JLinkExe -device NRF52 -speed 4000 -if SWD # run RTT client (for that to work, `make jlinkexe` should run in parallel) rtt: /opt/SEGGER/JLink_V610g/JLinkRTTClient