Compare commits

...

7 Commits

Author SHA1 Message Date
Thomas Klaehn
371b4c0e80 Re-organize build system 2020-03-30 11:46:29 +02:00
Thomas Klaehn
3093a80f2a Spi: fix chip select handling 2020-03-29 23:42:19 +02:00
Thomas Klaehn
f975a37bf3 Transfer st7789 into c++ 2020-03-29 23:28:04 +02:00
Thomas Klaehn
53aa3ceda6 Transfer spi into c++ 2020-03-29 23:28:04 +02:00
Thomas Klaehn
7f1721a536 Transfer gpio driver into c++ 2020-03-29 23:28:04 +02:00
Thomas Klaehn
44d7f39026 App: Transfer blinky into c++ application 2020-03-29 15:49:34 +02:00
Thomas Klaehn
6bb235b676 Build: Add c++ build ability. 2020-03-29 15:48:12 +02:00
46 changed files with 575 additions and 16674 deletions

View File

@ -11,6 +11,9 @@
"nrf52.h": "c", "nrf52.h": "c",
"system_nrf52.h": "c", "system_nrf52.h": "c",
"system_nrf.h": "c", "system_nrf.h": "c",
"driver.h": "c" "driver.h": "c",
"deque": "cpp",
"string": "cpp",
"vector": "cpp"
} }
} }

22
.vscode/tasks.json vendored
View File

@ -6,10 +6,9 @@
"env": { "env": {
"PLATFORM": "nrf52", "PLATFORM": "nrf52",
// "PLATFORM": "posix", // "PLATFORM": "posix",
// "APPLICATION": "blinky", "APPLICATION": "blinky",
// "APPLICATION": "button",
// "APPLICATION": "spi", // "APPLICATION": "spi",
"APPLICATION": "st7789_lcd", // "APPLICATION": "st7789_lcd",
}, },
}, },
"tasks": [ "tasks": [
@ -80,6 +79,23 @@
"kind": "build", "kind": "build",
"isDefault": true "isDefault": true
} }
},
{
"label": "check",
"type":"shell",
"command": "make check",
"problemMatcher": {
"base": "$gcc",
"owner": "gcc",
"fileLocation": [
"relative",
"${workspaceFolder}"
]
},
"group": {
"kind": "build",
"isDefault": true
}
} }
], ],
"presentation": { "presentation": {

View File

@ -7,8 +7,10 @@ TARGET_FILE ?= $(APPLICATION).elf
CC = $(CROSS_COMPILE)gcc CC = $(CROSS_COMPILE)gcc
CPP = $(CROSS_COMPILE)cpp CPP = $(CROSS_COMPILE)cpp
CXX = $(CROSS_COMPILE)g++
OBJCOPY = $(CROSS_COMPILE)objcopy OBJCOPY = $(CROSS_COMPILE)objcopy
SIZE = $(CROSS_COMPILE)size SIZE = $(CROSS_COMPILE)size
CHECK = cppcheck
SRC_DIR = src SRC_DIR = src
OBJ_DIR = obj/$(PLATFORM) OBJ_DIR = obj/$(PLATFORM)
@ -19,16 +21,24 @@ CPP_FLAGS += $(addprefix -I, $(INCLUDES))
C_SRCS = $(wildcard $(SRC_DIR)/*.c) C_SRCS = $(wildcard $(SRC_DIR)/*.c)
C_SRCS += $(wildcard $(SRC_DIR)/platform/$(PLATFORM)/*.c) C_SRCS += $(wildcard $(SRC_DIR)/platform/$(PLATFORM)/*.c)
C_SRCS += $(wildcard $(SRC_DIR)/application/$(APPLICATION)/*.c) C_SRCS += $(wildcard $(SRC_DIR)/application/$(APPLICATION)/*.c)
C_OBJS = $(patsubst $(SRC_DIR)%,$(OBJ_DIR)%,$(patsubst %.c,%.o,$(C_SRCS))) C_OBJS = $(patsubst $(SRC_DIR)%,$(OBJ_DIR)%,$(patsubst %.c,%.c.o,$(C_SRCS)))
OBJS = $(NRF_A_OBJS) $(NRF_C_OBJS) $(C_OBJS)
CC_SRCS = $(wildcard $(SRC_DIR)/*.cc)
CC_SRCS += $(wildcard $(SRC_DIR)/platform/$(PLATFORM)/*.cc)
CC_SRCS += $(wildcard $(SRC_DIR)/application/$(APPLICATION)/*.cc)
CC_OBJS = $(patsubst $(SRC_DIR)%,$(OBJ_DIR)%,$(patsubst %.cc,%.cc.o,$(CC_SRCS)))
OBJS = $(NRF_A_OBJS) $(NRF_C_OBJS) $(C_OBJS) $(CC_OBJS)
TARGET = $(BIN_DIR)/$(TARGET_FILE) TARGET = $(BIN_DIR)/$(TARGET_FILE)
TARGET_HEX = $(patsubst %.elf,%.hex,$(TARGET)) TARGET_HEX = $(patsubst %.elf,%.hex,$(TARGET))
TARGET_PACKAGE = $(patsubst %.hex,%.zip,$(TARGET_HEX)) TARGET_PACKAGE = $(patsubst %.hex,%.zip,$(TARGET_HEX))
THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST)) THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST))
INCLUDES += src/
INCLUDES += interfaces/
INCLUDES += include/ INCLUDES += include/
INCLUDES += include/application/$(APPLICATION) INCLUDES += include/platform/$(PLATFORM)
OPT = 3 OPT = 3
C_FLAGS += -O$(OPT) -g$(OPT) C_FLAGS += -O$(OPT) -g$(OPT)
@ -36,15 +46,21 @@ C_FLAGS += -Wall -Werror
C_FLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing C_FLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
C_FLAGS += -DPLATFORM_$(PLATFORM) C_FLAGS += -DPLATFORM_$(PLATFORM)
LIBS += c nosys m CXX_FLAGS += -O$(OPT) -g$(OPT)
CXX_FLAGS += -Wall -Werror
CXX_FLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
CXX_FLAGS += -DPLATFORM_$(PLATFORM)
include config/build/$(PLATFORM)/$(APPLICATION)/Makefile.$(APPLICATION) CHECK_FLAGS = $(addprefix -I,$(INCLUDES))
CHECK_FLAGS += --enable=all --template=gcc --error-exitcode=1 --suppress=missingIncludeSystem --inline-suppr --force --language=c++
.PHONY: all install uninstall clean distclean debug include build_system/platform/$(PLATFORM)/Makefile.$(PLATFORM)
.PHONY: all install uninstall clean distclean debug check
all: $(TARGET) all: $(TARGET)
debug: debug:
@echo $(TARGET_HEX) @echo $(CC_OBJS)
clean: clean:
rm -f $(TARGET) $(TARGET_HEX) $(TARGET_PACKAGE) rm -f $(TARGET) $(TARGET_HEX) $(TARGET_PACKAGE)
@ -53,9 +69,13 @@ clean:
distclean: distclean:
rm -rf bin obj rm -rf bin obj
.PHONY:
check: $(C_SRCS)
$(CHECK) $(CHECK_FLAGS) --check-config $(CC_SRCS)
$(TARGET): $(OBJS) $(THIS_MAKEFILE) $(TARGET): $(OBJS) $(THIS_MAKEFILE)
@mkdir -p $(dir $@) @mkdir -p $(dir $@)
$(CC) $(CC_FLAGS) $(LD_FLAGS) $(OBJS) $(addprefix -l,$(LIBS)) -o $@ $(CXX) $(CXX_FLAGS) $(LD_FLAGS) $(OBJS) $(addprefix -l,$(LIBS)) -o $@
ln -sf $(shell pwd)/$@ $(shell pwd)/bin/firmware.elf ln -sf $(shell pwd)/$@ $(shell pwd)/bin/firmware.elf
$(SIZE) -x $@ $(SIZE) -x $@
@ -67,7 +87,15 @@ $(OBJ_DIR)/%.d: $(SRC_DIR)/%.c $(THIS_MAKEFILE)
@mkdir -p $(dir $@) @mkdir -p $(dir $@)
$(CPP) -MM -MF $@ -MP -MT $(patsubst %.d,%.o,$@) $(C_FLAGS) $(CPP_FLAGS) $(patsubst $(OBJ_DIR)/%.d,$(SRC_DIR)/%.c,$@) $(CPP) -MM -MF $@ -MP -MT $(patsubst %.d,%.o,$@) $(C_FLAGS) $(CPP_FLAGS) $(patsubst $(OBJ_DIR)/%.d,$(SRC_DIR)/%.c,$@)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(THIS_MAKEFILE) $(OBJ_DIR)/%.d: $(SRC_DIR)/%.cc $(THIS_MAKEFILE)
@mkdir -p $(dir $@)
$(CPP) -MM -MF $@ -MP -MT $(patsubst %.d,%.o,$@) $(CXX_FLAGS) $(CPP_FLAGS) $(patsubst $(OBJ_DIR)/%.d,$(SRC_DIR)/%.cc,$@)
$(OBJ_DIR)/%.cc.o: $(SRC_DIR)/%.cc $(THIS_MAKEFILE)
@mkdir -p $(dir $@)
$(CXX) -c $(CPP_FLAGS) $(CXX_FLAGS) $< -o $@
$(OBJ_DIR)/%.c.o: $(SRC_DIR)/%.c $(THIS_MAKEFILE)
@mkdir -p $(dir $@) @mkdir -p $(dir $@)
$(CC) -c $(CPP_FLAGS) $(C_FLAGS) $< -o $@ $(CC) -c $(CPP_FLAGS) $(C_FLAGS) $< -o $@

View File

@ -1,6 +1,18 @@
CPU = cortex-m4 CPU = cortex-m4
CROSS_COMPILE ?= arm-none-eabi- CROSS_COMPILE ?= arm-none-eabi-
NRF_PATH := nrf5sdk/
INCLUDES += $(NRF_PATH)modules/nrfx/mdk/
INCLUDES += $(NRF_PATH)components/softdevice/s132/headers/nrf52/
INCLUDES += $(NRF_PATH)components/toolchain/cmsis/include/
INCLUDES += $(NRF_PATH)components/libraries/util/
INCLUDES += $(NRF_PATH)modules/nrfx/
INCLUDES += $(NRF_PATH)components/softdevice/s132/headers/
INCLUDES += $(NRF_PATH)components/libraries/delay/
INCLUDES += $(NRF_PATH)integration/nrfx/
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/mdk/system_nrf52.c
NRF_C_OBJS = $(patsubst $(NRF_PATH)%,$(OBJ_DIR)/%,$(patsubst %.c,%.o,$(NRF_C_SRCS))) NRF_C_OBJS = $(patsubst $(NRF_PATH)%,$(OBJ_DIR)/%,$(patsubst %.c,%.o,$(NRF_C_SRCS)))
NRF_A_SRCS = $(NRF_PATH)modules/nrfx/mdk/gcc_startup_nrf52.S NRF_A_SRCS = $(NRF_PATH)modules/nrfx/mdk/gcc_startup_nrf52.S
@ -23,6 +35,23 @@ C_FLAGS += -fno-builtin -fshort-enums
C_FLAGS += -D__HEAP_SIZE=8192 C_FLAGS += -D__HEAP_SIZE=8192
C_FLAGS += -D__HEAP_SIZE=8192 C_FLAGS += -D__HEAP_SIZE=8192
CXX_FLAGS += -DBOARD_PCA10040
CXX_FLAGS += -DBSP_DEFINES_ONLY
CXX_FLAGS += -DCONFIG_GPIO_AS_PINRESET
CXX_FLAGS += -DFLOAT_ABI_HARD
CXX_FLAGS += -DNRF52
CXX_FLAGS += -DNRF52832_XXAA
CXX_FLAGS += -DNRF52_PAN_74
CXX_FLAGS += -DNRF_SD_BLE_API_VERSION=7
CXX_FLAGS += -DS132
CXX_FLAGS += -DSOFTDEVICE_PRESENT
CXX_FLAGS += -mcpu=$(CPU)
CXX_FLAGS += -mthumb -mabi=aapcs
CXX_FLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CXX_FLAGS += -fno-builtin -fshort-enums
CXX_FLAGS += -D__HEAP_SIZE=8192
CXX_FLAGS += -D__HEAP_SIZE=8192
# Assembler flags common to all targets # Assembler flags common to all targets
A_FLAGS += -g$(OPT) A_FLAGS += -g$(OPT)
A_FLAGS += -mcpu=$(CPU) A_FLAGS += -mcpu=$(CPU)
@ -37,11 +66,11 @@ A_FLAGS += -DNRF52832_XXAA
A_FLAGS += -DNRF52_PAN_74 A_FLAGS += -DNRF52_PAN_74
A_FLAGS += -DNRF_SD_BLE_API_VERSION=7 A_FLAGS += -DNRF_SD_BLE_API_VERSION=7
A_FLAGS += -DS132 A_FLAGS += -DS132
A_FLAGS += -DSOFTDEVICE_PRESENT # A_FLAGS += -DSOFTDEVICE_PRESENT
A_FLAGS += -D__HEAP_SIZE=8192 A_FLAGS += -D__HEAP_SIZE=8192
A_FLAGS += -D__HEAP_SIZE=8192 A_FLAGS += -D__HEAP_SIZE=8192
LINKER_SCRIPT = config/build/$(PLATFORM)/$(APPLICATION)/linker.ld LINKER_SCRIPT = build_system/platform/$(PLATFORM)/$(PLATFORM)_without_sd.ld
# Linker flags # Linker flags
LD_FLAGS += -O$(OPT) -g$(OPT) LD_FLAGS += -O$(OPT) -g$(OPT)
@ -51,6 +80,8 @@ LD_FLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
LD_FLAGS += -Wl,--gc-sections LD_FLAGS += -Wl,--gc-sections
LD_FLAGS += --specs=nano.specs LD_FLAGS += --specs=nano.specs
LIBS += c nosys m
.PHONY: package flash flash_softdevice erase .PHONY: package flash flash_softdevice erase
package: $(TARGET_HEX) package: $(TARGET_HEX)

View File

@ -1,30 +0,0 @@
NRF_PATH := nrf5sdk/
INCLUDES += $(NRF_PATH)components/
INCLUDES += $(NRF_PATH)modules/nrfx/mdk/
INCLUDES += $(NRF_PATH)components/libraries/strerror/
INCLUDES += $(NRF_PATH)components/softdevice/s132/headers/nrf52/
INCLUDES += $(NRF_PATH)components/toolchain/cmsis/include/
INCLUDES += $(NRF_PATH)components/libraries/util/
INCLUDES += $(NRF_PATH)components/libraries/balloc/
INCLUDES += $(NRF_PATH)components/libraries/ringbuf/
INCLUDES += $(NRF_PATH)modules/nrfx/hal/
INCLUDES += $(NRF_PATH)components/libraries/bsp/
INCLUDES += $(NRF_PATH)components/libraries/log/
INCLUDES += $(NRF_PATH)modules/nrfx/
INCLUDES += $(NRF_PATH)modules/nrfx/drivers/include/
INCLUDES += $(NRF_PATH)components/libraries/experimental_section_vars/
INCLUDES += $(NRF_PATH)components/softdevice/s132/headers/
INCLUDES += $(NRF_PATH)components/libraries/delay/
INCLUDES += $(NRF_PATH)integration/nrfx/
INCLUDES += $(NRF_PATH)integration/nrfx/legacy/
INCLUDES += $(NRF_PATH)components/libraries/atomic/
INCLUDES += $(NRF_PATH)components/boards/
INCLUDES += $(NRF_PATH)components/libraries/memobj/
INCLUDES += $(NRF_PATH)components/softdevice/common/
INCLUDES += $(NRF_PATH)external/fprintf/
INCLUDES += $(NRF_PATH)components/libraries/log/src/
NRF_C_SRCS += $(NRF_PATH)components/boards/boards.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/mdk/system_nrf52.c
include config/build/$(PLATFORM)/Makefile.$(PLATFORM)

View File

@ -1,33 +0,0 @@
NRF_PATH := nrf5sdk/
INCLUDES += $(NRF_PATH)components/
INCLUDES += $(NRF_PATH)modules/nrfx/mdk/
INCLUDES += $(NRF_PATH)components/libraries/strerror/
INCLUDES += $(NRF_PATH)components/softdevice/s132/headers/nrf52/
INCLUDES += $(NRF_PATH)components/toolchain/cmsis/include/
INCLUDES += $(NRF_PATH)components/libraries/util/
INCLUDES += $(NRF_PATH)components/libraries/balloc/
INCLUDES += $(NRF_PATH)components/libraries/ringbuf/
INCLUDES += $(NRF_PATH)modules/nrfx/hal/
INCLUDES += $(NRF_PATH)components/libraries/bsp/
INCLUDES += $(NRF_PATH)components/libraries/log/
INCLUDES += $(NRF_PATH)modules/nrfx/
INCLUDES += $(NRF_PATH)modules/nrfx/drivers/include/
INCLUDES += $(NRF_PATH)components/libraries/experimental_section_vars/
INCLUDES += $(NRF_PATH)components/softdevice/s132/headers/
INCLUDES += $(NRF_PATH)components/libraries/delay/
INCLUDES += $(NRF_PATH)integration/nrfx/
INCLUDES += $(NRF_PATH)integration/nrfx/legacy/
INCLUDES += $(NRF_PATH)components/libraries/atomic/
INCLUDES += $(NRF_PATH)components/boards/
INCLUDES += $(NRF_PATH)components/libraries/memobj/
INCLUDES += $(NRF_PATH)components/softdevice/common/
INCLUDES += $(NRF_PATH)external/fprintf/
INCLUDES += $(NRF_PATH)components/libraries/log/src/
NRF_C_SRCS += $(NRF_PATH)components/boards/boards.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/mdk/system_nrf52.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/drivers/src/nrfx_gpiote.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/util/app_error.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/util/app_error_weak.c
include config/build/$(PLATFORM)/Makefile.$(PLATFORM)

View File

@ -1,54 +0,0 @@
CPU = cortex-m4
CROSS_COMPILE ?= arm-none-eabi-
NRF_PATH := nrf5sdk/
INCLUDES += $(NRF_PATH)components/
INCLUDES += $(NRF_PATH)modules/nrfx/mdk/
INCLUDES += $(NRF_PATH)components/libraries/strerror/
INCLUDES += $(NRF_PATH)components/softdevice/s132/headers/nrf52/
INCLUDES += $(NRF_PATH)components/toolchain/cmsis/include/
INCLUDES += $(NRF_PATH)components/libraries/util/
INCLUDES += $(NRF_PATH)components/libraries/balloc/
INCLUDES += $(NRF_PATH)components/libraries/ringbuf/
INCLUDES += $(NRF_PATH)modules/nrfx/hal/
INCLUDES += $(NRF_PATH)components/libraries/bsp/
INCLUDES += $(NRF_PATH)components/libraries/log/
INCLUDES += $(NRF_PATH)modules/nrfx/
INCLUDES += $(NRF_PATH)modules/nrfx/drivers/include/
INCLUDES += $(NRF_PATH)components/libraries/experimental_section_vars/
INCLUDES += $(NRF_PATH)components/softdevice/s132/headers/
INCLUDES += $(NRF_PATH)components/libraries/delay/
INCLUDES += $(NRF_PATH)integration/nrfx/
INCLUDES += $(NRF_PATH)integration/nrfx/legacy/
INCLUDES += $(NRF_PATH)components/libraries/atomic/
INCLUDES += $(NRF_PATH)components/boards/
INCLUDES += $(NRF_PATH)components/libraries/memobj/
INCLUDES += $(NRF_PATH)components/softdevice/common/
INCLUDES += $(NRF_PATH)external/fprintf/
INCLUDES += $(NRF_PATH)components/libraries/log/src/
NRF_C_SRCS += $(NRF_PATH)components/boards/boards.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/mdk/system_nrf52.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/util/app_error.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/util/app_error_weak.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/drivers/src/nrfx_spim.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/log/src/nrf_log_frontend.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/atomic/nrf_atomic.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/log/src/nrf_log_default_backends.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/log/src/nrf_log_backend_uart.c
NRF_C_SRCS += $(NRF_PATH)integration/nrfx/legacy/nrf_drv_uart.c
NRF_C_SRCS += $(NRF_PATH)integration/nrfx/legacy/nrf_drv_spi.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/drivers/src/nrfx_uarte.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/drivers/src/prs/nrfx_prs.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/util/app_util_platform.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/drivers/src/nrfx_uart.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/log/src/nrf_log_backend_serial.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/memobj/nrf_memobj.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/balloc/nrf_balloc.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/log/src/nrf_log_str_formatter.c
NRF_C_SRCS += $(NRF_PATH)external/fprintf/nrf_fprintf.c
NRF_C_SRCS += $(NRF_PATH)external/fprintf/nrf_fprintf_format.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/ringbuf/nrf_ringbuf.c
include config/build/$(PLATFORM)/Makefile.$(PLATFORM)

View File

@ -1,64 +0,0 @@
/* Linker script to configure memory regions. */
SEARCH_DIR(.)
GROUP(-lgcc -lc -lnosys)
MEMORY
{
FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x80000
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x10000
}
SECTIONS
{
}
SECTIONS
{
. = ALIGN(4);
.mem_section_dummy_ram :
{
}
.log_dynamic_data :
{
PROVIDE(__start_log_dynamic_data = .);
KEEP(*(SORT(.log_dynamic_data*)))
PROVIDE(__stop_log_dynamic_data = .);
} > RAM
.log_filter_data :
{
PROVIDE(__start_log_filter_data = .);
KEEP(*(SORT(.log_filter_data*)))
PROVIDE(__stop_log_filter_data = .);
} > RAM
} INSERT AFTER .data;
SECTIONS
{
.mem_section_dummy_rom :
{
}
.log_const_data :
{
PROVIDE(__start_log_const_data = .);
KEEP(*(SORT(.log_const_data*)))
PROVIDE(__stop_log_const_data = .);
} > FLASH
.log_backends :
{
PROVIDE(__start_log_backends = .);
KEEP(*(SORT(.log_backends*)))
PROVIDE(__stop_log_backends = .);
} > FLASH
.nrf_balloc :
{
PROVIDE(__start_nrf_balloc = .);
KEEP(*(.nrf_balloc))
PROVIDE(__stop_nrf_balloc = .);
} > FLASH
} INSERT AFTER .text
INCLUDE "nrf_common.ld"

View File

@ -1,56 +0,0 @@
CPU = cortex-m4
CROSS_COMPILE ?= arm-none-eabi-
NRF_PATH := nrf5sdk/
INCLUDES += $(NRF_PATH)components/
INCLUDES += $(NRF_PATH)modules/nrfx/mdk/
INCLUDES += $(NRF_PATH)components/libraries/strerror/
INCLUDES += $(NRF_PATH)components/softdevice/s132/headers/nrf52/
INCLUDES += $(NRF_PATH)components/toolchain/cmsis/include/
INCLUDES += $(NRF_PATH)components/libraries/util/
INCLUDES += $(NRF_PATH)components/libraries/balloc/
INCLUDES += $(NRF_PATH)components/libraries/ringbuf/
INCLUDES += $(NRF_PATH)modules/nrfx/hal/
INCLUDES += $(NRF_PATH)components/libraries/bsp/
INCLUDES += $(NRF_PATH)components/libraries/log/
INCLUDES += $(NRF_PATH)modules/nrfx/
INCLUDES += $(NRF_PATH)modules/nrfx/drivers/include/
INCLUDES += $(NRF_PATH)components/libraries/experimental_section_vars/
INCLUDES += $(NRF_PATH)components/softdevice/s132/headers/
INCLUDES += $(NRF_PATH)components/libraries/delay/
INCLUDES += $(NRF_PATH)integration/nrfx/
INCLUDES += $(NRF_PATH)integration/nrfx/legacy/
INCLUDES += $(NRF_PATH)components/libraries/atomic/
INCLUDES += $(NRF_PATH)components/boards/
INCLUDES += $(NRF_PATH)components/libraries/memobj/
INCLUDES += $(NRF_PATH)components/softdevice/common/
INCLUDES += $(NRF_PATH)external/fprintf/
INCLUDES += $(NRF_PATH)components/libraries/log/src/
NRF_C_SRCS += $(NRF_PATH)components/boards/boards.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/mdk/system_nrf52.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/util/app_error.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/util/app_error_handler_gcc.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/util/app_error_weak.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/drivers/src/nrfx_spim.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/log/src/nrf_log_frontend.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/atomic/nrf_atomic.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/log/src/nrf_log_default_backends.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/log/src/nrf_log_backend_uart.c
NRF_C_SRCS += $(NRF_PATH)integration/nrfx/legacy/nrf_drv_uart.c
NRF_C_SRCS += $(NRF_PATH)integration/nrfx/legacy/nrf_drv_spi.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/drivers/src/nrfx_uarte.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/drivers/src/prs/nrfx_prs.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/util/app_util_platform.c
NRF_C_SRCS += $(NRF_PATH)modules/nrfx/drivers/src/nrfx_uart.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/log/src/nrf_log_backend_serial.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/memobj/nrf_memobj.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/balloc/nrf_balloc.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/log/src/nrf_log_str_formatter.c
NRF_C_SRCS += $(NRF_PATH)external/fprintf/nrf_fprintf.c
NRF_C_SRCS += $(NRF_PATH)external/fprintf/nrf_fprintf_format.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/ringbuf/nrf_ringbuf.c
NRF_C_SRCS += $(NRF_PATH)components/libraries/strerror/nrf_strerror.c
include config/build/$(PLATFORM)/Makefile.$(PLATFORM)

View File

@ -1,64 +0,0 @@
/* Linker script to configure memory regions. */
SEARCH_DIR(.)
GROUP(-lgcc -lc -lnosys)
MEMORY
{
FLASH (rx) : ORIGIN = 0x0, LENGTH = 0x80000
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x10000
}
SECTIONS
{
}
SECTIONS
{
. = ALIGN(4);
.mem_section_dummy_ram :
{
}
.log_dynamic_data :
{
PROVIDE(__start_log_dynamic_data = .);
KEEP(*(SORT(.log_dynamic_data*)))
PROVIDE(__stop_log_dynamic_data = .);
} > RAM
.log_filter_data :
{
PROVIDE(__start_log_filter_data = .);
KEEP(*(SORT(.log_filter_data*)))
PROVIDE(__stop_log_filter_data = .);
} > RAM
} INSERT AFTER .data;
SECTIONS
{
.mem_section_dummy_rom :
{
}
.log_const_data :
{
PROVIDE(__start_log_const_data = .);
KEEP(*(SORT(.log_const_data*)))
PROVIDE(__stop_log_const_data = .);
} > FLASH
.log_backends :
{
PROVIDE(__start_log_backends = .);
KEEP(*(SORT(.log_backends*)))
PROVIDE(__stop_log_backends = .);
} > FLASH
.nrf_balloc :
{
PROVIDE(__start_nrf_balloc = .);
KEEP(*(.nrf_balloc))
PROVIDE(__stop_nrf_balloc = .);
} > FLASH
} INSERT AFTER .text
INCLUDE "nrf_common.ld"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +0,0 @@
#ifndef __BOARD_H__
#define __BOARD_H__
#if defined(BOARD_PCA10040)
#include "platform/nrf52/nrf52-dk.h"
#endif
#endif

View File

@ -1,34 +0,0 @@
#ifndef __DRIVER_H__
#define __DRIVER_H__
#include <stdarg.h>
struct driver;
typedef int (*fp_open_t)(const struct driver *);
typedef int (*fp_close_t)(const struct driver *);
typedef int (*fp_read_t)(const struct driver *, char *, unsigned int);
typedef int (*fp_write_t)(const struct driver *, const char *, unsigned int);
typedef int (*fp_ioctl_t)(const struct driver *, unsigned int, unsigned int argc, va_list);
struct driver_fp {
fp_open_t open;
fp_close_t close;
fp_read_t read;
fp_write_t write;
fp_ioctl_t ioctl;
};
struct driver {
const char *name;
const struct driver_fp *fp;
const void *dev;
};
int drv_open(const struct driver *drv);
int drv_close(const struct driver *drv);
int drv_read(const struct driver *drv, char *buffer, unsigned int length);
int drv_write(const struct driver *drv, const char *buffer, unsigned int length);
int drv_ioctl(const struct driver *drv, unsigned int cmd, unsigned int argc, ...);
#endif

View File

@ -1,12 +0,0 @@
#ifndef __INCLUDE_FRAMEBUFFER_H__
#define __INCLUDE_FRAMEBUFFER_H__
#include <stdint.h>
void fb_draw_pixel(uint16_t *image, uint16_t x, uint16_t y, uint16_t color);
void fb_draw_line(uint16_t *image, int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color);
void fb_load_image(uint16_t *dst, uint16_t *src, uint32_t length);
void fb_set_image(uint16_t *dst, uint16_t value, uint32_t length);
#endif

View File

@ -1,34 +0,0 @@
#ifndef __GPIO_H__
#define __GPIO_H__
#include <stdarg.h>
#include "driver.h"
#define IOCTL_CMD_SET_DIRECTION 0
int gpio_open(const struct driver *drv);
int gpio_close(const struct driver *drv);
int gpio_read(const struct driver *drv, char *buffer, unsigned int len);
int gpio_write(const struct driver *drv, const char *buffer, unsigned int len);
enum direction {
IN = 0,
OUT
};
struct gpio {
int pin;
enum direction dir;
};
static const struct driver_fp gpio_fp = {
.open = gpio_open,
.close = gpio_close,
.read = gpio_read,
.write = gpio_write,
.ioctl = NULL
};
#endif

View File

@ -1,117 +0,0 @@
#ifndef __NRF52_DK_H__
#define __NRF52_DK_H__
#include "driver.h"
#include "gpio.h"
#include "spi.h"
#include "st7789.h"
// LED 1
const struct gpio nrf_led_1 = {
.pin = 17,
.dir = OUT
};
const struct driver led_1 = {
.name = "LED1",
.fp = &gpio_fp,
.dev = &nrf_led_1
};
// LED 2
const struct gpio nrf_led_2 = {
.pin = 18,
.dir = OUT
};
const struct driver led_2 = {
.name = "LED2",
.fp = &gpio_fp,
.dev = &nrf_led_2
};
// LED 3
const struct gpio nrf_led_3 = {
.pin = 19,
.dir = OUT
};
const struct driver led_3 = {
.name = "LED3",
.fp = &gpio_fp,
.dev = &nrf_led_3
};
// LED 4
const struct gpio nrf_led_4 = {
.pin = 20,
.dir = OUT
};
const struct driver led_4 = {
.name = "LED4",
.fp = &gpio_fp,
.dev = &nrf_led_4
};
// LCD
// SPI 0
const struct spi nrf_spi_0 = {
.sck_pin = 2,
.mosi_pin = 3,
.miso_pin = 4
};
const struct driver spi_0 = {
.name = "SPI0",
.fp = &spi_fp,
.dev = &nrf_spi_0
};
const struct gpio nrf_dc_pin = {
.pin = 18,
.dir = OUT
};
const struct driver dc_pin = {
.name = "DC",
.fp = &gpio_fp,
.dev = &nrf_dc_pin
};
const struct gpio nrf_bl_pin = {
.pin = 23,
.dir = OUT
};
const struct driver bl_pin = {
.name = "BACKLIGHT",
.fp = &gpio_fp,
.dev = &nrf_bl_pin
};
const struct gpio nrf_rst_pin = {
.pin = 26,
.dir = OUT
};
const struct driver rst_pin = {
.name = "RESET",
.fp = &gpio_fp,
.dev = &nrf_rst_pin
};
const struct gpio nrf_select_pin = {
.pin = 25,
.dir = OUT
};
const struct driver select_pin = {
.name = "SELECT",
.fp = &gpio_fp,
.dev = &nrf_select_pin
};
struct st7789 nrf_lcd = {
.spi = &spi_0,
.dc = &dc_pin,
.bl = &bl_pin,
.rst = &rst_pin,
.select = &select_pin,
.height = 240,
.width = 240,
};
const struct driver lcd = {
.name = "LCD",
.fp = &st7789_fp,
.dev = &nrf_lcd
};
#endif

View File

@ -1,23 +0,0 @@
#ifndef __NRF52_SPI_H__
#define __NRF52_SPI_H__
int spi_open(const struct driver *drv);
int spi_close(const struct driver *drv);
int spi_write(const struct driver *drv, const char *buffer, unsigned int len);
struct spi {
unsigned int sck_pin;
unsigned int mosi_pin;
unsigned int miso_pin;
};
static const struct driver_fp spi_fp = {
.open = spi_open,
.close = spi_close,
.read = NULL,
.write = spi_write,
.ioctl = NULL
};
#endif

View File

@ -1,30 +0,0 @@
#ifndef __ST7789_H__
#define __ST7789_H__
#include <stddef.h>
#include "driver.h"
int st7789_open(const struct driver *drv);
int st7789_close(const struct driver *drv);
int st7789_write(const struct driver *drv, const char *buffer, unsigned int len);
struct st7789 {
const struct driver *spi;
const struct driver *dc;
const struct driver *bl;
const struct driver *rst;
const struct driver *select;
unsigned int height;
unsigned int width;
};
static const struct driver_fp st7789_fp = {
.open = st7789_open,
.close = st7789_close,
.read = NULL,
.write = st7789_write,
.ioctl = NULL,
};
#endif

View File

@ -0,0 +1,21 @@
#ifndef __INTERFACES_GPIO_INTERFACE_H__
#define __INTERFACES_GPIO_INTERFACE_H__
#include <cstdint>
namespace interfaces {
class GpioInterface
{
public:
enum class direction {IN, OUT};
virtual void set_direction(direction) = 0;
virtual uint32_t get() = 0;
virtual void set() = 0;
virtual void clear() = 0;
virtual void toggle() = 0;
};
}
#endif

View File

@ -0,0 +1,16 @@
#ifndef __INTERFACES_SPI_INTERFACE_H__
#define __INTERFACES_SPI_INTERFACE_H__
#include <cstdint>
namespace interfaces {
class SpiInterface
{
public:
virtual void send(const uint8_t * buffer, uint32_t len) = 0;
virtual void recv(uint8_t * buffer, uint32_t len) = 0;
};
};
#endif

View File

@ -1,22 +0,0 @@
#include <stdbool.h>
#include <stdint.h>
#include "delay.h"
#include "board.h"
int main(void)
{
unsigned int cnt[4] = {0, 0, 0, 0};
const struct driver *leds[4] = {&led_1, &led_2, &led_3, &led_4};
for(unsigned int i = 0; i < 4; i++) {
drv_open(leds[i]);
}
while(true) {
for(unsigned int i = 0; i < 4; i++) {
char c = (cnt[i]++ % 2) + 0x30;
drv_write(leds[i], &c, 1);
delay_ms(500);
}
}
return 0;
}

View File

@ -0,0 +1,30 @@
#include <array>
#include "delay.h"
#include "platform/hal.h"
enum {
PIN_NUMBER_LED_1 = 17,
PIN_NUMBER_LED_2 = 18,
PIN_NUMBER_LED_3 = 19,
PIN_NUMBER_LED_4 = 20
};
hal::Gpio led_1(PIN_NUMBER_LED_1);
hal::Gpio led_2(PIN_NUMBER_LED_2);
hal::Gpio led_3(PIN_NUMBER_LED_3);
hal::Gpio led_4(PIN_NUMBER_LED_4);
std::array<hal::Gpio *, 4> leds = {&led_1, &led_2, &led_3, &led_4};
int main(void)
{
while(true) {
for(auto it = std::begin(leds); it != std::end(leds); ++it) {
hal::Gpio * tmp = *it;
tmp->toggle();
delay_ms(500);
}
}
return 0;
}

View File

@ -1,113 +0,0 @@
/**
* Copyright (c) 2014 - 2019, Nordic Semiconductor ASA
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form, except as embedded into a Nordic
* Semiconductor ASA integrated circuit in a product or a software update for
* such product, must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* 4. This software, with or without modification, must only be used with a
* Nordic Semiconductor ASA integrated circuit.
*
* 5. Any software provided in binary form under this license must not be reverse
* engineered, decompiled, modified and/or disassembled.
*
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/** @file
* @defgroup pin_change_int_example_main main.c
* @{
* @ingroup pin_change_int_example
* @brief Pin Change Interrupt Example Application main file.
*
* This file contains the source code for a sample application using interrupts triggered by GPIO pins.
*
*/
#include <stdbool.h>
#include "nrf.h"
#include "nrf_drv_gpiote.h"
#include "app_error.h"
#include "boards.h"
#ifdef BSP_BUTTON_0
#define PIN_IN BSP_BUTTON_0
#endif
#ifndef PIN_IN
#error "Please indicate input pin"
#endif
#ifdef BSP_LED_0
#define PIN_OUT BSP_LED_0
#endif
#ifndef PIN_OUT
#error "Please indicate output pin"
#endif
void in_pin_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
{
nrf_drv_gpiote_out_toggle(PIN_OUT);
}
/**
* @brief Function for configuring: PIN_IN pin for input, PIN_OUT pin for output,
* and configures GPIOTE to give an interrupt on pin change.
*/
static void gpio_init(void)
{
ret_code_t err_code;
err_code = nrf_drv_gpiote_init();
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_out_config_t out_config = GPIOTE_CONFIG_OUT_SIMPLE(false);
err_code = nrf_drv_gpiote_out_init(PIN_OUT, &out_config);
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_in_config_t in_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);
in_config.pull = NRF_GPIO_PIN_PULLUP;
err_code = nrf_drv_gpiote_in_init(PIN_IN, &in_config, in_pin_handler);
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_in_event_enable(PIN_IN, true);
}
/**
* @brief Function for application main entry.
*/
int main(void)
{
gpio_init();
while (true)
{
// Do nothing.
}
}
/** @} */

View File

@ -1,36 +0,0 @@
#include "app_util_platform.h"
#include "nrf_gpio.h"
#include "nrf_delay.h"
#include "boards.h"
#include "app_error.h"
#include <string.h>
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "board.h"
#include "driver.h"
const char buf[] = "Test";
int main(void)
{
unsigned int cnt = 0;
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
drv_open(&led_1);
drv_open(&spi_0);
NRF_LOG_INFO("SPI example started.");
while(1) {
char c = (cnt++ % 2) + 0x30;
drv_write(&led_1, &c, 1);
drv_write(&spi_0, buf, sizeof(buf));
NRF_LOG_FLUSH();
nrf_delay_ms(200);
}
}

View File

@ -0,0 +1,21 @@
#include "delay.h"
#include "platform/hal.h"
using namespace hal;
const uint8_t buf[] = "Test";
int main(void)
{
Gpio led_1(17);
Gpio lcd_chip_select(25);
Spi spi_0(0, 2, 3, 4, lcd_chip_select);
while(1) {
delay_ms(200);
spi_0.send(buf, sizeof(buf));
led_1.toggle();
}
}

View File

@ -1,33 +0,0 @@
#include "app_util_platform.h"
#include "nrf_gpio.h"
#include "nrf_delay.h"
#include "boards.h"
#include "app_error.h"
#include <string.h>
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "board.h"
#include "driver.h"
int main(void)
{
unsigned int cnt = 0;
APP_ERROR_CHECK(NRF_LOG_INIT(NULL));
NRF_LOG_DEFAULT_BACKENDS_INIT();
drv_open(&led_1);
drv_open(&lcd);
NRF_LOG_INFO("SPI example started.");
while(1) {
char c = (cnt++ % 2) + 0x30;
drv_write(&led_1, &c, 1);
NRF_LOG_FLUSH();
nrf_delay_ms(200);
}
}

View File

@ -0,0 +1,24 @@
#include "delay.h"
#include "platform/hal.h"
#include "st7789.h"
hal::Gpio led_1(17);
hal::Gpio lcd_reset(26);
hal::Gpio lcd_data_command(18);
hal::Gpio lcd_backlight(23);
hal::Gpio lcd_chip_select(25);
hal::Spi lcd_spi(0, 2, 3, 4, lcd_chip_select);
St7789 lcd(lcd_spi, lcd_reset, lcd_data_command, lcd_backlight);
int main(void)
{
lcd.init();
lcd.clear(0);
while(true) {
delay_ms(200);
led_1.toggle();
}
}

View File

@ -1,67 +0,0 @@
#include <stdlib.h>
#include <assert.h>
#include "driver.h"
int drv_open(const struct driver *drv)
{
int res = -1;
assert(drv != NULL);
if(drv->fp->open) {
res = drv->fp->open(drv);
}
return res;
}
int drv_close(const struct driver *drv)
{
int res = -1;
assert(drv != NULL);
if(drv->fp->close) {
res = drv->fp->close(drv);
}
return res;
}
int drv_read(const struct driver *drv, char *buffer, unsigned int length)
{
int res = -1;
assert(drv != NULL);
if(drv->fp->read) {
res = drv->fp->read(drv, buffer, length);
}
return res;
}
int drv_write(const struct driver *drv, const char *buffer, unsigned int length)
{
int res = -1;
assert(drv != NULL);
if(drv->fp->write) {
res = drv->fp->write(drv, buffer, length);
}
return res;
}
int drv_ioctl(const struct driver *drv, unsigned int cmd, unsigned int argc, ...)
{
int res = -1;
assert(drv != NULL);
if(drv->fp->ioctl) {
va_list args;
va_start(args, argc);
res = drv->fp->ioctl(drv, cmd, argc, args);
va_end(args);
}
return res;
}

View File

@ -1,76 +0,0 @@
#include <assert.h>
#include <stddef.h>
#include <stdlib.h>
#include "framebuffer.h"
void fb_draw_pixel(uint16_t *image, uint16_t x, uint16_t y, uint16_t color)
{
assert(image != NULL);
image[x + 240 * y] = color;
}
#ifndef _swap_int16_t
#define _swap_int16_t(a, b) { int16_t t = a; a = b; b = t; }
#endif
void fb_draw_line(uint16_t *image, int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color)
{
assert(image != NULL);
int16_t steep = abs(y1 - y0) > abs(x1 - x0);
if(steep) {
_swap_int16_t(x0, y0);
_swap_int16_t(x1, y1);
}
if(x0 > x1) {
_swap_int16_t(x0, x1);
_swap_int16_t(y0, y1);
}
int16_t dx, dy;
dx = x1 - x0;
dy = abs(y1 - y0);
int16_t err = dx / 2;
int16_t ystep;
if(y0 < y1) {
ystep = 1;
} else {
ystep = -1;
}
for(; x0 <= x1; x0++) {
if(steep) {
fb_draw_pixel(image, y0, x0, color);
} else {
fb_draw_pixel(image, x0, y0, color);
}
err -= dy;
if (err < 0) {
y0 += ystep;
err += dx;
}
}
}
void fb_load_image(uint16_t *dst, uint16_t *src, uint32_t length)
{
assert(NULL != dst);
assert(NULL != src);
for(uint32_t i = 0; i < length; i++) {
dst[i] = src[i];
}
}
void fb_set_image(uint16_t *dst, uint16_t value, uint32_t length)
{
assert(NULL != dst);
for (uint32_t i = 0; i < length; i++) {
dst[i] = value;
}
}

11
src/platform/hal.h Normal file
View File

@ -0,0 +1,11 @@
#ifndef __PLATFORM_GPIO_H__
#define __PLATFORM_GPIO_H__
#if defined(PLATFORM_nrf52)
#include "platform/nrf52/gpio.h"
#include "platform/nrf52/spi.h"
namespace hal = platform::nrf52;
#endif
#endif

View File

@ -1,63 +0,0 @@
#include <assert.h>
#include <stdint.h>
#include <stddef.h>
#include "gpio.h"
#include "nrf_gpio.h"
int gpio_open(const struct driver *drv)
{
assert(NULL != drv);
struct gpio *this = (struct gpio *)(drv->dev);
if(this->dir == OUT) {
nrf_gpio_cfg_output((uint32_t)(this->pin));
nrf_gpio_pin_clear(this->pin);
}
// FIXME: implement input configuration
return 0;
}
int gpio_close(const struct driver *drv)
{
assert(NULL != drv);
struct gpio *this = (struct gpio *)(drv->dev);
nrf_gpio_pin_clear(this->pin);
return 0;
}
int gpio_read(const struct driver *drv, char *buffer, unsigned int len)
{
assert(NULL != drv);
if(len == 0) {
return 0;
}
struct gpio *this = (struct gpio *)(drv->dev);
uint32_t value = nrf_gpio_pin_read(this->pin);
buffer[0] = value + 0x30; // ascii convert
return 1;
}
int gpio_write(const struct driver *drv, const char *buffer, unsigned int len)
{
assert((NULL != drv) && (NULL != buffer));
if(len == 0) {
return 0;
}
struct gpio *this = (struct gpio *)(drv->dev);
nrf_gpio_pin_write(this->pin, buffer[0] - 0x30);
return 1;
}

View File

@ -0,0 +1,63 @@
#include "platform/nrf52/gpio.h"
extern "C" {
#include "nrf52.h"
#include "nrf52_bitfields.h"
NRF_GPIO_Type *const GPIO_REGS = reinterpret_cast<NRF_GPIO_Type *>(NRF_P0_BASE);
}
using namespace platform::nrf52;
Gpio::Gpio(uint32_t pin)
: pin_number(pin)
{
this->set_direction(direction::OUT);
this->clear();
}
void Gpio::set_direction(direction dir)
{
uint32_t direct = GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos;
uint32_t input = GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos;
uint32_t pull = GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos;
uint32_t drive = GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos;
uint32_t sense = GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos;
if(dir == direction::IN) {
direct = GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos;
input = GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos;
// FIXME: Make this configurable
// GPIO_PIN_CNF_PULL_Disabled, ///< Pin pull-up resistor disabled.
// GPIO_PIN_CNF_PULL_Pulldown, ///< Pin pull-down resistor enabled.
// GPIO_PIN_CNF_PULL_Pullup, ///< Pin pull-up resistor enabled.
pull = GPIO_PIN_CNF_PULL_Pullup << GPIO_PIN_CNF_PULL_Pos;
drive = GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos;
sense = GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos;
}
GPIO_REGS->PIN_CNF[pin_number] = direct | input | pull | drive | sense;
}
uint32_t Gpio::get()
{
uint32_t res = (GPIO_REGS->IN >> pin_number) & 1UL;
return res;
}
void Gpio::set()
{
GPIO_REGS->OUTSET = 1UL << (this->pin_number);
}
void Gpio::clear()
{
GPIO_REGS->OUTCLR = 1UL << (this->pin_number);
}
void Gpio::toggle()
{
uint32_t state = GPIO_REGS->OUT;
GPIO_REGS->OUTSET = (~state & (1UL << (this->pin_number)));
GPIO_REGS->OUTCLR = (state & (1UL << (this->pin_number)));
}

25
src/platform/nrf52/gpio.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef __PLATFORM_NRF52_GPIO_H__
#define __PLATFORM_NRF52_GPIO_H__
#include "gpio_interface.h"
namespace platform::nrf52 {
class Gpio : public interfaces::GpioInterface
{
public:
inline Gpio() {}
Gpio(uint32_t);
void set_direction(direction) override;
uint32_t get() override;
void set() override;
void clear() override;
void toggle() override;
private:
uint32_t pin_number;
};
}
#endif

View File

@ -1,61 +0,0 @@
#include <assert.h>
#include <stddef.h>
#include "nrf.h"
#include "driver.h"
#include "spi.h"
static inline int spi_transfer(uint32_t t);
int spi_open(const struct driver *drv)
{
assert(NULL != drv);
struct spi *this = (struct spi *)drv->dev;
NRF_SPI0->ENABLE = 0;
NRF_SPI0->PSELSCK = this->sck_pin;
NRF_SPI0->PSELMOSI = this->mosi_pin;
NRF_SPI0->PSELMISO = this->miso_pin;
NRF_SPI0->FREQUENCY = SPI_FREQUENCY_FREQUENCY_M8;
NRF_SPI0->CONFIG = (0x03 << 1); //Sample on trailing edge of clock, shift serial data on leading edge, SCK polarity Active low
NRF_SPI0->EVENTS_READY = 0;
NRF_SPI0->ENABLE = (SPI_ENABLE_ENABLE_Enabled << SPI_ENABLE_ENABLE_Pos);
return 0;
}
int spi_close(const struct driver *drv)
{
NRF_SPI0->ENABLE = 0;
return 0;
}
int spi_write(const struct driver *drv, const char *buffer, unsigned int len)
{
assert(NULL != buffer);
//FIXME: missing CS handling
for(unsigned int i = 0; i < len; i++) {
spi_transfer(buffer[i]);
}
//FIXME: missing CS handling
return len;
}
static inline int spi_transfer(uint32_t t)
{
volatile uint32_t r;
NRF_SPI0->EVENTS_READY = 0; // ready
NRF_SPI0->TXD = t; // out
while(NRF_SPI0->EVENTS_READY == 0) {
}
r = NRF_SPI0->RXD; // in
return (int)r;
}

70
src/platform/nrf52/spi.cc Normal file
View File

@ -0,0 +1,70 @@
#include <assert.h>
#include "platform/nrf52/spi.h"
extern "C" {
#include "nrf52.h"
#include "nrf52_bitfields.h"
NRF_SPI_Type *SPI_REGS = reinterpret_cast<NRF_SPI_Type *>(NRF_SPI0_BASE);
}
using namespace platform::nrf52;
Spi::Spi(uint32_t instance, uint32_t sck, uint32_t mosi, uint32_t miso, interfaces::GpioInterface & cs)
: chip_select(cs)
{
assert(instance < 3);
if(instance == 0) {
SPI_REGS = reinterpret_cast<NRF_SPI_Type *>(NRF_SPI0_BASE);
} else if(instance == 1) {
SPI_REGS = reinterpret_cast<NRF_SPI_Type *>(NRF_SPI1_BASE);
} else {
SPI_REGS = reinterpret_cast<NRF_SPI_Type *>(NRF_SPI2_BASE);
}
this->chip_select.set();
SPI_REGS->ENABLE = 0;
SPI_REGS->PSEL.SCK = sck;
SPI_REGS->PSEL.MOSI = mosi;
SPI_REGS->PSEL.MISO = miso;
SPI_REGS->FREQUENCY = SPI_FREQUENCY_FREQUENCY_M8;
SPI_REGS->CONFIG = (0x03 << 1); //Sample on trailing edge of clock, shift serial data on leading edge, SCK polarity Active low
SPI_REGS->EVENTS_READY = 0;
SPI_REGS->ENABLE = (SPI_ENABLE_ENABLE_Enabled << SPI_ENABLE_ENABLE_Pos);
}
Spi::~Spi()
{
SPI_REGS->ENABLE = 0;
}
void Spi::send(const uint8_t * buffer, uint32_t len)
{
this->chip_select.clear();
for(unsigned int i = 0; i < len; i++) {
this->transfer(buffer[i]);
}
this->chip_select.set();
}
void Spi::recv(uint8_t * buffer, uint32_t len)
{
this->chip_select.clear();
for(unsigned int i = 0; i < len; i++) {
buffer[i] = this->transfer(buffer[i]);
}
this->chip_select.set();
}
uint32_t Spi::transfer(uint32_t data)
{
volatile uint32_t ret;
SPI_REGS->EVENTS_READY = 0;
SPI_REGS->TXD = data;
while(SPI_REGS->EVENTS_READY == 0) {;}
ret = SPI_REGS->RXD;
return ret;
}

25
src/platform/nrf52/spi.h Normal file
View File

@ -0,0 +1,25 @@
#ifndef __PLATFORM_NRF52_SPI_H__
#define __PLATFORM_NRF52_SPI_H__
#include "gpio_interface.h"
#include "spi_interface.h"
namespace platform::nrf52 {
class Spi : public interfaces::SpiInterface
{
public:
Spi(uint32_t instance, uint32_t sck, uint32_t mosi, uint32_t miso, interfaces::GpioInterface & cs);
~Spi();
void send(const uint8_t * buffer, uint32_t len) override;
void recv(uint8_t * buffer, uint32_t len) override;
private:
uint32_t transfer(uint32_t);
interfaces::GpioInterface & chip_select;
};
}
#endif

View File

@ -1,192 +0,0 @@
#include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <unistd.h>
#include "delay.h"
#include "st7789.h"
static void send_cmd(const struct driver *drv, uint8_t cmd);
static void send_data_8bit(const struct driver *drv, uint8_t data);
static void lcd_init(const struct driver *drv);
static void lcd_set_windows(const struct driver *drv, uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end);
static void lcd_clear(const struct driver *drv, uint16_t Color)
{
unsigned int i,j;
struct st7789 *this = (struct st7789*)(drv->dev);
lcd_set_windows(drv, 0, 0, 240, 240);
drv_write(this->dc, "1", 1);
for(i = 0; i < 240; i++) {
for(j = 0; j < 240; j++){
char c = (Color >> 8) & 0xff;
drv_write(this->spi, &c, 1);
c = Color & 0xff;
drv_write(this->spi, &c, 1);
}
}
}
int st7789_open(const struct driver *drv)
{
assert(drv != NULL);
struct st7789 *this = (struct st7789*)(drv->dev);
drv_open(this->rst);
drv_write(this->rst, "1", 1);
drv_open(this->dc);
drv_write(this->dc, "1", 1);
drv_open(this->bl);
drv_write(this->bl, "1", 1);
drv_open(this->select);
drv_write(this->select, "0", 1);
drv_open(this->spi);
// hard reset
drv_write(this->rst, "0", 1);
delay_ms(100);
drv_write(this->rst, "1", 1);
delay_ms(100);
lcd_init(drv);
lcd_clear(drv, 0x0000);
return 0;
}
int st7789_close(const struct driver *drv)
{
assert(drv != NULL);
struct st7789 *this = (struct st7789*)(drv->dev);
drv_close(this->rst);
drv_close(this->dc);
drv_close(this->bl);
drv_close(this->spi);
return 0;
}
int st7789_write(const struct driver *drv, const char *buffer, unsigned int len)
{
assert(drv != NULL);
struct st7789 *this = (struct st7789*)(drv->dev);
uint16_t *image = (uint16_t *)buffer;
lcd_set_windows(drv, 0, 0, this->width, this->height);
drv_write(this->dc, "1", 1);
for (uint16_t i = 0; i < this->height; i++) {
drv_write(this->spi, (const char *)&image[i * this->width], len);
}
return len;
}
static void send_cmd(const struct driver *drv, uint8_t cmd)
{
assert(drv != NULL);
struct st7789 *this = (struct st7789*)(drv->dev);
drv_write(this->dc, "0", 1);
drv_write(this->spi, (const char* )&cmd, 1);
}
static void send_data_8bit(const struct driver *drv, uint8_t data)
{
assert(drv != NULL);
struct st7789 *this = (struct st7789*)(drv->dev);
drv_write(this->dc, "1", 1);
drv_write(this->spi, (const char* )&data, 1);
}
static void lcd_init(const struct driver *drv)
{
send_cmd(drv, 0x36);
send_data_8bit(drv, 0x00);
send_cmd(drv, 0x3A);
send_data_8bit(drv, 0x05);
send_cmd(drv, 0xB2);
send_data_8bit(drv, 0x0C);
send_data_8bit(drv, 0x0C);
send_data_8bit(drv, 0x00);
send_data_8bit(drv, 0x33);
send_data_8bit(drv, 0x33);
send_cmd(drv, 0xB7); //Gate Control
send_data_8bit(drv, 0x35);
send_cmd(drv, 0xBB); //VCOM Setting
send_data_8bit(drv, 0x19);
send_cmd(drv, 0xC0); //LCM Control
send_data_8bit(drv, 0x2C);
send_cmd(drv, 0xC2); //VDV and VRH Command Enable
send_data_8bit(drv, 0x01);
send_cmd(drv, 0xC3); //VRH Set
send_data_8bit(drv, 0x12);
send_cmd(drv, 0xC4); //VDV Set
send_data_8bit(drv, 0x20);
send_cmd(drv, 0xC6); //Frame Rate Control in Normal Mode
send_data_8bit(drv, 0x0F);
send_cmd(drv, 0xD0); // Power Control 1
send_data_8bit(drv, 0xA4);
send_data_8bit(drv, 0xA1);
send_cmd(drv, 0xE0); //Positive Voltage Gamma Control
send_data_8bit(drv, 0xD0);
send_data_8bit(drv, 0x04);
send_data_8bit(drv, 0x0D);
send_data_8bit(drv, 0x11);
send_data_8bit(drv, 0x13);
send_data_8bit(drv, 0x2B);
send_data_8bit(drv, 0x3F);
send_data_8bit(drv, 0x54);
send_data_8bit(drv, 0x4C);
send_data_8bit(drv, 0x18);
send_data_8bit(drv, 0x0D);
send_data_8bit(drv, 0x0B);
send_data_8bit(drv, 0x1F);
send_data_8bit(drv, 0x23);
send_cmd(drv, 0xE1); //Negative Voltage Gamma Control
send_data_8bit(drv, 0xD0);
send_data_8bit(drv, 0x04);
send_data_8bit(drv, 0x0C);
send_data_8bit(drv, 0x11);
send_data_8bit(drv, 0x13);
send_data_8bit(drv, 0x2C);
send_data_8bit(drv, 0x3F);
send_data_8bit(drv, 0x44);
send_data_8bit(drv, 0x51);
send_data_8bit(drv, 0x2F);
send_data_8bit(drv, 0x1F);
send_data_8bit(drv, 0x1F);
send_data_8bit(drv, 0x20);
send_data_8bit(drv, 0x23);
send_cmd(drv, 0x21); //Display Inversion On
send_cmd(drv, 0x11); //Sleep Out
send_cmd(drv, 0x29); //Display On
}
static void lcd_set_windows(const struct driver *drv, uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end)
{
//set the X coordinates
send_cmd(drv, 0x2A);
send_data_8bit(drv, (x_start >> 8) & 0xFF);
send_data_8bit(drv, x_start & 0xFF);
send_data_8bit(drv, ((x_end - 1) >> 8) & 0xFF);
send_data_8bit(drv, (x_end - 1) & 0xFF);
//set the Y coordinates
send_cmd(drv, 0x2B);
send_data_8bit(drv, (y_start >> 8) & 0xFF);
send_data_8bit(drv, y_start & 0xFF);
send_data_8bit(drv, ((y_end - 1) >> 8) & 0xFF);
send_data_8bit(drv, (y_end - 1) & 0xFF);
send_cmd(drv, 0X2C);
}

146
src/st7789.cc Normal file
View File

@ -0,0 +1,146 @@
#include <cstdint>
#include "delay.h"
#include "st7789.h"
St7789::St7789(interfaces::SpiInterface & spi_if,
interfaces::GpioInterface & rst,
interfaces::GpioInterface & dc,
interfaces::GpioInterface & bl)
: spi(spi_if)
, reset(rst)
, data_command(dc)
, backlight(bl)
{
this->reset.set();
this->data_command.set();
this->backlight.set();
// hard reset
this->reset.clear();
delay_ms(100);
this->reset.set();
delay_ms(100);
}
void St7789::init()
{
send_cmd(0x36);
send_data(0x00);
send_cmd(0x3A);
send_data(0x05);
send_cmd(0xB2);
send_data(0x0C);
send_data(0x0C);
send_data(0x00);
send_data(0x33);
send_data(0x33);
send_cmd(0xB7); //Gate Control
send_data(0x35);
send_cmd(0xBB); //VCOM Setting
send_data(0x19);
send_cmd(0xC0); //LCM Control
send_data(0x2C);
send_cmd(0xC2); //VDV and VRH Command Enable
send_data(0x01);
send_cmd(0xC3); //VRH Set
send_data(0x12);
send_cmd(0xC4); //VDV Set
send_data(0x20);
send_cmd(0xC6); //Frame Rate Control in Normal Mode
send_data(0x0F);
send_cmd(0xD0); // Power Control 1
send_data(0xA4);
send_data(0xA1);
send_cmd(0xE0); //Positive Voltage Gamma Control
send_data(0xD0);
send_data(0x04);
send_data(0x0D);
send_data(0x11);
send_data(0x13);
send_data(0x2B);
send_data(0x3F);
send_data(0x54);
send_data(0x4C);
send_data(0x18);
send_data(0x0D);
send_data(0x0B);
send_data(0x1F);
send_data(0x23);
send_cmd(0xE1); //Negative Voltage Gamma Control
send_data(0xD0);
send_data(0x04);
send_data(0x0C);
send_data(0x11);
send_data(0x13);
send_data(0x2C);
send_data(0x3F);
send_data(0x44);
send_data(0x51);
send_data(0x2F);
send_data(0x1F);
send_data(0x1F);
send_data(0x20);
send_data(0x23);
send_cmd(0x21); //Display Inversion On
send_cmd(0x11); //Sleep Out
send_cmd(0x29); //Display On
}
void St7789::send_cmd(uint8_t cmd)
{
this->data_command.clear();
this->spi.send(&cmd, 1);
}
void St7789::send_data(uint8_t data)
{
this->data_command.set();
this->spi.send(&data, 1);
}
void St7789::clear(uint16_t Color)
{
unsigned int i,j;
set_windows(0, 0, 240, 240);
this->data_command.set();
for(i = 0; i < 240; i++) {
for(j = 0; j < 240; j++){
uint8_t c = (Color >> 8) & 0xff;
this->spi.send(&c, 1);
c = Color & 0xff;
this->spi.send(&c, 1);
}
}
}
void St7789::set_windows(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end)
{
//set the X coordinates
send_cmd(0x2A);
send_data((x_start >> 8) & 0xFF);
send_data(x_start & 0xFF);
send_data(((x_end - 1) >> 8) & 0xFF);
send_data((x_end - 1) & 0xFF);
//set the Y coordinates
send_cmd(0x2B);
send_data((y_start >> 8) & 0xFF);
send_data(y_start & 0xFF);
send_data(((y_end - 1) >> 8) & 0xFF);
send_data((y_end - 1) & 0xFF);
send_cmd(0X2C);
}

30
src/st7789.h Normal file
View File

@ -0,0 +1,30 @@
#ifndef __ST7789_H__
#define __ST7789_H__
#include <cstdint>
#include "gpio_interface.h"
#include "spi_interface.h"
class St7789
{
public:
St7789(interfaces::SpiInterface &,
interfaces::GpioInterface &,
interfaces::GpioInterface &,
interfaces::GpioInterface &);
void init();
void clear(uint16_t Color);
private:
interfaces::SpiInterface & spi;
interfaces::GpioInterface & reset;
interfaces::GpioInterface & data_command;
interfaces::GpioInterface & backlight;
void send_cmd(uint8_t);
void send_data(uint8_t);
void set_windows(uint16_t x_start, uint16_t y_start, uint16_t x_end, uint16_t y_end);
};
#endif