106 lines
3.8 KiB
Makefile
106 lines
3.8 KiB
Makefile
# LYWSD03MMC B1.5 BTHome v2 beacon + LCD + OTA
|
|
#
|
|
# Builds against the official Telink BLE SDK for TLSR825x (B85m):
|
|
# git clone -b release/V3.4.3.0 https://github.com/telink-semi/tc_ble_single_sdk ../tc_ble_single_sdk
|
|
# (apply the patches in tc_ble_single_sdk_v3.4.3.0_Patch/ as Patch_Guide.txt says)
|
|
# make TC32_PATH=/path/to/tc32/bin/
|
|
#
|
|
# Same compiler flags, startup code, linker script, libraries and post-build
|
|
# step as the SDK's own 825x_ble_sample project (project/tlsr_tc32/B85/.cproject).
|
|
# The SDK itself is used unmodified.
|
|
|
|
PROJECT_NAME ?= LYWSD03MMC-BTHome
|
|
SDK_PATH ?= ../tc_ble_single_sdk/tc_ble_single_sdk
|
|
TC32_PATH ?=
|
|
|
|
SRC_PATH := ./src
|
|
OUT_PATH := ./out
|
|
|
|
ifneq ($(MAKECMDGOALS),clean)
|
|
ifeq ($(wildcard $(SDK_PATH)/boot/B85/cstartup_825x.S),)
|
|
$(error Telink SDK not found: set SDK_PATH to the tc_ble_single_sdk/tc_ble_single_sdk directory)
|
|
endif
|
|
endif
|
|
|
|
CC := $(TC32_PATH)tc32-elf-gcc
|
|
LD := $(TC32_PATH)tc32-elf-ld
|
|
OBJCOPY := $(TC32_PATH)tc32-elf-objcopy
|
|
NM := $(TC32_PATH)tc32-elf-nm
|
|
|
|
# TLSR8251: 32 KiB SRAM (stack top 0x848000)
|
|
STARTUP := MCU_STARTUP_8251
|
|
|
|
INCLUDES := -I$(SDK_PATH) -I$(SDK_PATH)/vendor/common -I$(SDK_PATH)/common \
|
|
-I$(SDK_PATH)/drivers/B85 -I$(SRC_PATH)
|
|
|
|
# -include: the SDK selects app_config.h only for its own demo projects
|
|
# (vendor/common/user_config.h), so ours is forced into every file
|
|
CFLAGS := -DCHIP_TYPE=CHIP_TYPE_825x -D$(STARTUP)=1 \
|
|
-ffunction-sections -fdata-sections -Wall -O2 -fpack-struct \
|
|
-fshort-enums -finline-small-functions -std=gnu99 \
|
|
-fshort-wchar -fms-extensions \
|
|
$(INCLUDES) -include $(SRC_PATH)/app_config.h
|
|
|
|
ASFLAGS := -D$(STARTUP)=1 $(INCLUDES)
|
|
|
|
APP_SRCS := $(wildcard $(SRC_PATH)/*.c)
|
|
|
|
# Everything the SDK's ble_sample compiles from the SDK (minus USB/audio
|
|
# code, which this device has no use for); --gc-sections keeps only what
|
|
# is referenced
|
|
SDK_DIRS := drivers/B85 drivers/B85/driver_ext drivers/B85/flash common vendor/common
|
|
SDK_SRCS := $(foreach d,$(SDK_DIRS),$(wildcard $(SDK_PATH)/$(d)/*.c))
|
|
SDK_ASMS := $(SDK_PATH)/boot/B85/cstartup_825x.S $(SDK_PATH)/common/div_mod.S
|
|
|
|
OBJS := $(patsubst $(SRC_PATH)/%.c,$(OUT_PATH)/app/%.o,$(APP_SRCS)) \
|
|
$(patsubst $(SDK_PATH)/%.c,$(OUT_PATH)/sdk/%.o,$(SDK_SRCS)) \
|
|
$(patsubst $(SDK_PATH)/%.S,$(OUT_PATH)/sdk/%.o,$(SDK_ASMS))
|
|
|
|
LDSCRIPT := $(SDK_PATH)/project/tlsr_tc32/B85/boot.link
|
|
LIBS := -L$(SDK_PATH)/proj_lib -llt_825x -llt_general_stack
|
|
|
|
ELF := $(OUT_PATH)/$(PROJECT_NAME).elf
|
|
BIN := $(PROJECT_NAME).bin
|
|
|
|
# Post-build: the SDK's check_fw (Linux x86-64 binary) pads the image, sets
|
|
# the size and marker in the header and appends the CRC the OTA server
|
|
# checks. Copied to out/ because the SDK checkout does not mark it executable.
|
|
CHECK_FW = cp $(SDK_PATH)/script/tl_check_fw/check_fw $(OUT_PATH)/check_fw && \
|
|
chmod +x $(OUT_PATH)/check_fw && $(OUT_PATH)/check_fw $(BIN)
|
|
|
|
all: $(BIN)
|
|
|
|
$(OUT_PATH)/app/%.o: $(SRC_PATH)/%.c $(wildcard $(SRC_PATH)/*.h)
|
|
@mkdir -p $(dir $@)
|
|
$(CC) $(CFLAGS) -c -o $@ $<
|
|
|
|
$(OUT_PATH)/sdk/%.o: $(SDK_PATH)/%.c $(SRC_PATH)/app_config.h
|
|
@mkdir -p $(dir $@)
|
|
@echo CC $<
|
|
@$(CC) $(CFLAGS) -c -o $@ $<
|
|
|
|
$(OUT_PATH)/sdk/%.o: $(SDK_PATH)/%.S
|
|
@mkdir -p $(dir $@)
|
|
$(CC) $(ASFLAGS) -c -o $@ $<
|
|
|
|
$(ELF): $(OBJS)
|
|
$(LD) --gc-sections -T $(LDSCRIPT) -o $@ $(OBJS) $(LIBS)
|
|
@$(NM) $@ | awk ' \
|
|
function hex(s, i, n) { n = 0; for (i = 1; i <= length(s); i++) \
|
|
n = n * 16 + index("0123456789abcdef", substr(tolower(s), i, 1)) - 1; return n } \
|
|
$$3 == "_rstored_" { r = hex($$1) } \
|
|
$$3 == "_retention_size_" { t = hex($$1) } \
|
|
$$3 == "_bin_size_" { b = hex($$1) } \
|
|
$$3 == "_ram_use_end_" { e = hex($$1) - 8650752 } \
|
|
END { printf "RAM code %d B, retention (code + data) %d B -> %s deep retention, RAM used %d B of 32768, image %d B\n", \
|
|
r, t, (t < 16384 ? "16K" : "32K"), e, b }'
|
|
|
|
$(BIN): $(ELF)
|
|
$(OBJCOPY) -O binary $< $@
|
|
$(CHECK_FW)
|
|
|
|
clean:
|
|
rm -rf $(OUT_PATH) $(BIN)
|
|
|
|
.PHONY: all clean
|