Compare commits
7 Commits
67a28afd24
...
371b4c0e80
Author | SHA1 | Date | |
---|---|---|---|
|
371b4c0e80 | ||
|
3093a80f2a | ||
|
f975a37bf3 | ||
|
53aa3ceda6 | ||
|
7f1721a536 | ||
|
44d7f39026 | ||
|
6bb235b676 |
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
@ -11,6 +11,9 @@
|
||||
"nrf52.h": "c",
|
||||
"system_nrf52.h": "c",
|
||||
"system_nrf.h": "c",
|
||||
"driver.h": "c"
|
||||
"driver.h": "c",
|
||||
"deque": "cpp",
|
||||
"string": "cpp",
|
||||
"vector": "cpp"
|
||||
}
|
||||
}
|
22
.vscode/tasks.json
vendored
22
.vscode/tasks.json
vendored
@ -6,10 +6,9 @@
|
||||
"env": {
|
||||
"PLATFORM": "nrf52",
|
||||
// "PLATFORM": "posix",
|
||||
// "APPLICATION": "blinky",
|
||||
// "APPLICATION": "button",
|
||||
"APPLICATION": "blinky",
|
||||
// "APPLICATION": "spi",
|
||||
"APPLICATION": "st7789_lcd",
|
||||
// "APPLICATION": "st7789_lcd",
|
||||
},
|
||||
},
|
||||
"tasks": [
|
||||
@ -80,6 +79,23 @@
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "check",
|
||||
"type":"shell",
|
||||
"command": "make check",
|
||||
"problemMatcher": {
|
||||
"base": "$gcc",
|
||||
"owner": "gcc",
|
||||
"fileLocation": [
|
||||
"relative",
|
||||
"${workspaceFolder}"
|
||||
]
|
||||
},
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
}
|
||||
],
|
||||
"presentation": {
|
||||
|
46
Makefile
46
Makefile
@ -7,8 +7,10 @@ TARGET_FILE ?= $(APPLICATION).elf
|
||||
|
||||
CC = $(CROSS_COMPILE)gcc
|
||||
CPP = $(CROSS_COMPILE)cpp
|
||||
CXX = $(CROSS_COMPILE)g++
|
||||
OBJCOPY = $(CROSS_COMPILE)objcopy
|
||||
SIZE = $(CROSS_COMPILE)size
|
||||
CHECK = cppcheck
|
||||
|
||||
SRC_DIR = src
|
||||
OBJ_DIR = obj/$(PLATFORM)
|
||||
@ -19,16 +21,24 @@ CPP_FLAGS += $(addprefix -I, $(INCLUDES))
|
||||
C_SRCS = $(wildcard $(SRC_DIR)/*.c)
|
||||
C_SRCS += $(wildcard $(SRC_DIR)/platform/$(PLATFORM)/*.c)
|
||||
C_SRCS += $(wildcard $(SRC_DIR)/application/$(APPLICATION)/*.c)
|
||||
C_OBJS = $(patsubst $(SRC_DIR)%,$(OBJ_DIR)%,$(patsubst %.c,%.o,$(C_SRCS)))
|
||||
OBJS = $(NRF_A_OBJS) $(NRF_C_OBJS) $(C_OBJS)
|
||||
C_OBJS = $(patsubst $(SRC_DIR)%,$(OBJ_DIR)%,$(patsubst %.c,%.c.o,$(C_SRCS)))
|
||||
|
||||
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_HEX = $(patsubst %.elf,%.hex,$(TARGET))
|
||||
TARGET_PACKAGE = $(patsubst %.hex,%.zip,$(TARGET_HEX))
|
||||
THIS_MAKEFILE := $(lastword $(MAKEFILE_LIST))
|
||||
|
||||
INCLUDES += src/
|
||||
INCLUDES += interfaces/
|
||||
INCLUDES += include/
|
||||
INCLUDES += include/application/$(APPLICATION)
|
||||
INCLUDES += include/platform/$(PLATFORM)
|
||||
|
||||
OPT = 3
|
||||
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 += -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)
|
||||
|
||||
debug:
|
||||
@echo $(TARGET_HEX)
|
||||
@echo $(CC_OBJS)
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET) $(TARGET_HEX) $(TARGET_PACKAGE)
|
||||
@ -53,9 +69,13 @@ clean:
|
||||
distclean:
|
||||
rm -rf bin obj
|
||||
|
||||
.PHONY:
|
||||
check: $(C_SRCS)
|
||||
$(CHECK) $(CHECK_FLAGS) --check-config $(CC_SRCS)
|
||||
|
||||
$(TARGET): $(OBJS) $(THIS_MAKEFILE)
|
||||
@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
|
||||
$(SIZE) -x $@
|
||||
|
||||
@ -67,7 +87,15 @@ $(OBJ_DIR)/%.d: $(SRC_DIR)/%.c $(THIS_MAKEFILE)
|
||||
@mkdir -p $(dir $@)
|
||||
$(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 $@)
|
||||
$(CC) -c $(CPP_FLAGS) $(C_FLAGS) $< -o $@
|
||||
|
||||
|
@ -1,6 +1,18 @@
|
||||
CPU = cortex-m4
|
||||
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_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
|
||||
|
||||
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
|
||||
A_FLAGS += -g$(OPT)
|
||||
A_FLAGS += -mcpu=$(CPU)
|
||||
@ -37,11 +66,11 @@ A_FLAGS += -DNRF52832_XXAA
|
||||
A_FLAGS += -DNRF52_PAN_74
|
||||
A_FLAGS += -DNRF_SD_BLE_API_VERSION=7
|
||||
A_FLAGS += -DS132
|
||||
A_FLAGS += -DSOFTDEVICE_PRESENT
|
||||
# A_FLAGS += -DSOFTDEVICE_PRESENT
|
||||
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
|
||||
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 += --specs=nano.specs
|
||||
|
||||
LIBS += c nosys m
|
||||
|
||||
.PHONY: package flash flash_softdevice erase
|
||||
|
||||
package: $(TARGET_HEX)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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"
|
@ -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)
|
@ -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
@ -1,8 +0,0 @@
|
||||
#ifndef __BOARD_H__
|
||||
#define __BOARD_H__
|
||||
|
||||
#if defined(BOARD_PCA10040)
|
||||
#include "platform/nrf52/nrf52-dk.h"
|
||||
#endif
|
||||
|
||||
#endif
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
@ -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
|
21
interfaces/gpio_interface.h
Normal file
21
interfaces/gpio_interface.h
Normal 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
|
16
interfaces/spi_interface.h
Normal file
16
interfaces/spi_interface.h
Normal 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
|
@ -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;
|
||||
}
|
30
src/application/blinky/main.cc
Normal file
30
src/application/blinky/main.cc
Normal 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;
|
||||
}
|
@ -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.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** @} */
|
@ -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);
|
||||
}
|
||||
}
|
21
src/application/spi/main.cc
Normal file
21
src/application/spi/main.cc
Normal 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();
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
24
src/application/st7789_lcd/main.cc
Normal file
24
src/application/st7789_lcd/main.cc
Normal 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();
|
||||
}
|
||||
}
|
67
src/driver.c
67
src/driver.c
@ -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;
|
||||
}
|
@ -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
11
src/platform/hal.h
Normal 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
|
@ -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;
|
||||
}
|
63
src/platform/nrf52/gpio.cc
Normal file
63
src/platform/nrf52/gpio.cc
Normal 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
25
src/platform/nrf52/gpio.h
Normal 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
|
@ -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
70
src/platform/nrf52/spi.cc
Normal 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
25
src/platform/nrf52/spi.h
Normal 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
|
192
src/st7789.c
192
src/st7789.c
@ -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
146
src/st7789.cc
Normal 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
30
src/st7789.h
Normal 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
|
Loading…
Reference in New Issue
Block a user