Skip to content

Commit 20f9515

Browse files
committed
nrf52dk: cpu/nrf52832 support
1 parent 0671640 commit 20f9515

20 files changed

+1918
-0
lines changed

cpu/nrf52832/Makefile.nrf52832

+262
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,262 @@
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

Comments
 (0)