Compare commits
No commits in common. "371b4c0e8072f6833d3b8ae0f3e90349a6304ee9" and "67a28afd2405cc6b0a7586c9bbbcf9b16d194aa4" have entirely different histories.
371b4c0e80
...
67a28afd24
5
.vscode/settings.json
vendored
5
.vscode/settings.json
vendored
@ -11,9 +11,6 @@
|
||||
"nrf52.h": "c",
|
||||
"system_nrf52.h": "c",
|
||||
"system_nrf.h": "c",
|
||||
"driver.h": "c",
|
||||
"deque": "cpp",
|
||||
"string": "cpp",
|
||||
"vector": "cpp"
|
||||
"driver.h": "c"
|
||||
}
|
||||
}
|
22
.vscode/tasks.json
vendored
22
.vscode/tasks.json
vendored
@ -6,9 +6,10 @@
|
||||
"env": {
|
||||
"PLATFORM": "nrf52",
|
||||
// "PLATFORM": "posix",
|
||||
"APPLICATION": "blinky",
|
||||
// "APPLICATION": "blinky",
|
||||
// "APPLICATION": "button",
|
||||
// "APPLICATION": "spi",
|
||||
// "APPLICATION": "st7789_lcd",
|
||||
"APPLICATION": "st7789_lcd",
|
||||
},
|
||||
},
|
||||
"tasks": [
|
||||
@ -79,23 +80,6 @@
|
||||
"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,10 +7,8 @@ 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)
|
||||
@ -21,24 +19,16 @@ 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,%.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)
|
||||
C_OBJS = $(patsubst $(SRC_DIR)%,$(OBJ_DIR)%,$(patsubst %.c,%.o,$(C_SRCS)))
|
||||
OBJS = $(NRF_A_OBJS) $(NRF_C_OBJS) $(C_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/platform/$(PLATFORM)
|
||||
INCLUDES += include/application/$(APPLICATION)
|
||||
|
||||
OPT = 3
|
||||
C_FLAGS += -O$(OPT) -g$(OPT)
|
||||
@ -46,21 +36,15 @@ C_FLAGS += -Wall -Werror
|
||||
C_FLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
|
||||
C_FLAGS += -DPLATFORM_$(PLATFORM)
|
||||
|
||||
CXX_FLAGS += -O$(OPT) -g$(OPT)
|
||||
CXX_FLAGS += -Wall -Werror
|
||||
CXX_FLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
|
||||
CXX_FLAGS += -DPLATFORM_$(PLATFORM)
|
||||
LIBS += c nosys m
|
||||
|
||||
CHECK_FLAGS = $(addprefix -I,$(INCLUDES))
|
||||
CHECK_FLAGS += --enable=all --template=gcc --error-exitcode=1 --suppress=missingIncludeSystem --inline-suppr --force --language=c++
|
||||
include config/build/$(PLATFORM)/$(APPLICATION)/Makefile.$(APPLICATION)
|
||||
|
||||
include build_system/platform/$(PLATFORM)/Makefile.$(PLATFORM)
|
||||
|
||||
.PHONY: all install uninstall clean distclean debug check
|
||||
.PHONY: all install uninstall clean distclean debug
|
||||
all: $(TARGET)
|
||||
|
||||
debug:
|
||||
@echo $(CC_OBJS)
|
||||
@echo $(TARGET_HEX)
|
||||
|
||||
clean:
|
||||
rm -f $(TARGET) $(TARGET_HEX) $(TARGET_PACKAGE)
|
||||
@ -69,13 +53,9 @@ clean:
|
||||
distclean:
|
||||
rm -rf bin obj
|
||||
|
||||
.PHONY:
|
||||
check: $(C_SRCS)
|
||||
$(CHECK) $(CHECK_FLAGS) --check-config $(CC_SRCS)
|
||||
|
||||
$(TARGET): $(OBJS) $(THIS_MAKEFILE)
|
||||
@mkdir -p $(dir $@)
|
||||
$(CXX) $(CXX_FLAGS) $(LD_FLAGS) $(OBJS) $(addprefix -l,$(LIBS)) -o $@
|
||||
$(CC) $(CC_FLAGS) $(LD_FLAGS) $(OBJS) $(addprefix -l,$(LIBS)) -o $@
|
||||
ln -sf $(shell pwd)/$@ $(shell pwd)/bin/firmware.elf
|
||||
$(SIZE) -x $@
|
||||
|
||||
@ -87,15 +67,7 @@ $(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)/%.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)
|
||||
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(THIS_MAKEFILE)
|
||||
@mkdir -p $(dir $@)
|
||||
$(CC) -c $(CPP_FLAGS) $(C_FLAGS) $< -o $@
|
||||
|
||||
|
@ -1,18 +1,6 @@
|
||||
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
|
||||
@ -35,23 +23,6 @@ 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)
|
||||
@ -66,11 +37,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 = build_system/platform/$(PLATFORM)/$(PLATFORM)_without_sd.ld
|
||||
LINKER_SCRIPT = config/build/$(PLATFORM)/$(APPLICATION)/linker.ld
|
||||
|
||||
# Linker flags
|
||||
LD_FLAGS += -O$(OPT) -g$(OPT)
|
||||
@ -80,8 +51,6 @@ 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)
|
30
config/build/nrf52/blinky/Makefile.blinky
Normal file
30
config/build/nrf52/blinky/Makefile.blinky
Normal file
@ -0,0 +1,30 @@
|
||||
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)
|
33
config/build/nrf52/button/Makefile.button
Normal file
33
config/build/nrf52/button/Makefile.button
Normal file
@ -0,0 +1,33 @@
|
||||
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)
|
54
config/build/nrf52/spi/Makefile.spi
Normal file
54
config/build/nrf52/spi/Makefile.spi
Normal file
@ -0,0 +1,54 @@
|
||||
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)
|
64
config/build/nrf52/spi/linker.ld
Normal file
64
config/build/nrf52/spi/linker.ld
Normal file
@ -0,0 +1,64 @@
|
||||
/* 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"
|
56
config/build/nrf52/st7789_lcd/Makefile.st7789_lcd
Normal file
56
config/build/nrf52/st7789_lcd/Makefile.st7789_lcd
Normal file
@ -0,0 +1,56 @@
|
||||
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)
|
64
config/build/nrf52/st7789_lcd/linker.ld
Normal file
64
config/build/nrf52/st7789_lcd/linker.ld
Normal file
@ -0,0 +1,64 @@
|
||||
/* 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"
|
3347
include/application/blinky/sdk_config.h
Normal file
3347
include/application/blinky/sdk_config.h
Normal file
File diff suppressed because it is too large
Load Diff
3230
include/application/button/sdk_config.h
Normal file
3230
include/application/button/sdk_config.h
Normal file
File diff suppressed because it is too large
Load Diff
4430
include/application/spi/sdk_config.h
Normal file
4430
include/application/spi/sdk_config.h
Normal file
File diff suppressed because it is too large
Load Diff
4430
include/application/st7789_lcd/sdk_config.h
Normal file
4430
include/application/st7789_lcd/sdk_config.h
Normal file
File diff suppressed because it is too large
Load Diff
8
include/board.h
Normal file
8
include/board.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef __BOARD_H__
|
||||
#define __BOARD_H__
|
||||
|
||||
#if defined(BOARD_PCA10040)
|
||||
#include "platform/nrf52/nrf52-dk.h"
|
||||
#endif
|
||||
|
||||
#endif
|
34
include/driver.h
Normal file
34
include/driver.h
Normal file
@ -0,0 +1,34 @@
|
||||
#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
|
12
include/framebuffer.h
Normal file
12
include/framebuffer.h
Normal file
@ -0,0 +1,12 @@
|
||||
#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
|
34
include/gpio.h
Normal file
34
include/gpio.h
Normal file
@ -0,0 +1,34 @@
|
||||
#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
|
117
include/platform/nrf52/nrf52-dk.h
Normal file
117
include/platform/nrf52/nrf52-dk.h
Normal file
@ -0,0 +1,117 @@
|
||||
#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
|
23
include/spi.h
Normal file
23
include/spi.h
Normal file
@ -0,0 +1,23 @@
|
||||
#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
|
30
include/st7789.h
Normal file
30
include/st7789.h
Normal file
@ -0,0 +1,30 @@
|
||||
#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
|
@ -1,21 +0,0 @@
|
||||
#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
|
@ -1,16 +0,0 @@
|
||||
#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
|
22
src/application/blinky/main.c
Normal file
22
src/application/blinky/main.c
Normal file
@ -0,0 +1,22 @@
|
||||
#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;
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
#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;
|
||||
}
|
113
src/application/button/main.c
Normal file
113
src/application/button/main.c
Normal file
@ -0,0 +1,113 @@
|
||||
/**
|
||||
* 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.
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** @} */
|
36
src/application/spi/main.c
Normal file
36
src/application/spi/main.c
Normal file
@ -0,0 +1,36 @@
|
||||
#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);
|
||||
}
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
|
||||
#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();
|
||||
}
|
||||
}
|
33
src/application/st7789_lcd/main.c
Normal file
33
src/application/st7789_lcd/main.c
Normal file
@ -0,0 +1,33 @@
|
||||
#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);
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
#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
Normal file
67
src/driver.c
Normal file
@ -0,0 +1,67 @@
|
||||
#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;
|
||||
}
|
76
src/framebuffer.c
Normal file
76
src/framebuffer.c
Normal file
@ -0,0 +1,76 @@
|
||||
#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;
|
||||
}
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
#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
|
63
src/platform/nrf52/gpio.c
Normal file
63
src/platform/nrf52/gpio.c
Normal file
@ -0,0 +1,63 @@
|
||||
#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;
|
||||
}
|
@ -1,63 +0,0 @@
|
||||
#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)));
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
#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
|
61
src/platform/nrf52/spi.c
Normal file
61
src/platform/nrf52/spi.c
Normal file
@ -0,0 +1,61 @@
|
||||
#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;
|
||||
}
|
@ -1,70 +0,0 @@
|
||||
#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;
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
#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
Normal file
192
src/st7789.c
Normal file
@ -0,0 +1,192 @@
|
||||
#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
146
src/st7789.cc
@ -1,146 +0,0 @@
|
||||
#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
30
src/st7789.h
@ -1,30 +0,0 @@
|
||||
#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