From 79f59d15f77c22f46ff1573dc3d819534593af89 Mon Sep 17 00:00:00 2001 From: Gatsby Date: Thu, 31 Oct 2024 20:00:42 +0800 Subject: [PATCH] feat: write RISC-V binary file with weakly linked, overridable symbols - Adds functionality to write RISC-V binary files using weak symbols, allowing overrides in linked projects - Supports flexible integration where default binary data can be replaced by custom definitions if needed --- .gitignore | 1 + Makefile | 16 +++++++++++----- cx9261A_api/MultiPointsCalib_v1.7.bin | Bin 0 -> 61516 bytes cx9261A_api/cx9261adriver.cpp | 14 ++++++++++++++ 4 files changed, 26 insertions(+), 5 deletions(-) create mode 100755 cx9261A_api/MultiPointsCalib_v1.7.bin diff --git a/.gitignore b/.gitignore index d283c2c..de851a0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Buid files build/ *.tar.gz +cx9261a_riscv_bin.c # System generated files # -- macOS diff --git a/Makefile b/Makefile index 1d7fa5e..66d699b 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,7 @@ CFLAGS_DEBUG := $(CFLAGS) $(DEBUG_FLAGS) CFLAGS_RELEASE := $(CFLAGS) $(RELEASE_FLAGS) # Collect source files +BIN_SRC := $(CURDIR)/cx9261a_riscv_bin.c SRCS := $(CURDIR)/cx9261adriver_c.cpp $(CURDIR)/cx9261A_api/cx9261adriver.cpp TEST_SRC := ld_test.c PACKAGE_HEADERS := ./cx9261adriver_c.h @@ -33,6 +34,9 @@ PACKAGE_HEADERS := ./cx9261adriver_c.h # Default target all: $(foreach arch, $(ARCHS), $(BUILD_DIR)/$(arch)/lib$(PROJECT_NAME)_dbg.a $(BUILD_DIR)/$(arch)/lib$(PROJECT_NAME).a) +$(BIN_SRC): $(CURDIR)/cx9261A_api/MultiPointsCalib_v1.7.bin + $(CURDIR)/tools/gen_riscvbin.py $< -o $(CURDIR) + # Rule to create debug libraries for different architectures $(BUILD_DIR)/%/lib$(PROJECT_NAME)_dbg.a: $(SRCS) @mkdir -p $(BUILD_DIR)/$*/debug @@ -48,21 +52,22 @@ $(BUILD_DIR)/%/lib$(PROJECT_NAME).a: $(SRCS) # Clean up clean: rm -rf $(BUILD_DIR) *.tar.gz + rm -rf $(CURDIR)/cx9261a_riscv_bin.c # Run link tests test: all $(foreach arch, $(ARCHS), $(BUILD_DIR)/$(arch)/ld_test $(BUILD_DIR)/$(arch)/ld_test_dbg) @echo "Link test success!" # Debug link tests -$(BUILD_DIR)/%/ld_test_dbg: $(SRCS) $(TEST_SRC) - @$(CC) $(CFLAGS_DEBUG) -mcpu=$* ld_test.c -o $@ -L$(BUILD_DIR)/$* -l$(PROJECT_NAME)_dbg -lstdc++ -lm -specs=nosys.specs +$(BUILD_DIR)/%/ld_test_dbg: $(SRCS) $(TEST_SRC) $(BIN_SRC) + @$(CC) $(CFLAGS_DEBUG) -mcpu=$* ld_test.c $(BIN_SRC) -o $@ -L$(BUILD_DIR)/$* -l$(PROJECT_NAME)_dbg -lstdc++ -lm -specs=nosys.specs # Release link tests -$(BUILD_DIR)/%/ld_test: $(SRCS) $(TEST_SRC) - @$(CC) $(CFLAGS_RELEASE) -mcpu=$* ld_test.c -o $@ -L$(BUILD_DIR)/$* -l$(PROJECT_NAME) -lstdc++ -lm -specs=nosys.specs +$(BUILD_DIR)/%/ld_test: $(SRCS) $(TEST_SRC) $(BIN_SRC) + @$(CC) $(CFLAGS_RELEASE) -mcpu=$* ld_test.c $(BIN_SRC) -o $@ -L$(BUILD_DIR)/$* -l$(PROJECT_NAME) -lstdc++ -lm -specs=nosys.specs # Package for release - bundle debug and release versions for each architecture separately -package: all +package: all $(BIN_SRC) @echo "Packaging for release..." @$(foreach arch, $(ARCHS), \ mkdir -p release_$(arch)/lib; \ @@ -72,6 +77,7 @@ package: all cp $(BUILD_DIR)/$(arch)/lib$(PROJECT_NAME).a release_$(arch)/lib/; \ cp $(PACKAGE_HEADERS) release_$(arch)/include/; \ cp $(SRCS) release_$(arch)/dbg/cx9261a_c/; \ + cp $(CURDIR)/cx9261a_riscv_bin.c release_$(arch)/; \ tar -czvf release_$(arch).tar.gz -C release_$(arch) .; \ rm -rf release_$(arch); \ ) diff --git a/cx9261A_api/MultiPointsCalib_v1.7.bin b/cx9261A_api/MultiPointsCalib_v1.7.bin new file mode 100755 index 0000000000000000000000000000000000000000..1e24cea1557bf55d763bf49d39f95ad2d7e2806a GIT binary patch literal 61516 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

7h)Ta>cFdBJcg-l}SW7A+$n`k-bxyq%%Jv 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 AbpQYW literal 0 HcmV?d00001 diff --git a/cx9261A_api/cx9261adriver.cpp b/cx9261A_api/cx9261adriver.cpp index 2b2ee83..bbf1cbb 100644 --- a/cx9261A_api/cx9261adriver.cpp +++ b/cx9261A_api/cx9261adriver.cpp @@ -5,6 +5,17 @@ #include "cx9261adriver.h" #include "utils.h" +#ifdef __cplusplus +extern "C" { +#endif + +__attribute__((weak)) uint32_t CX9261A_RiscvBinLen = 0; +__attribute__((weak)) uint8_t *CX9261A_RiscvBin = nullptr; + +#ifdef __cplusplus +} +#endif + namespace CX9261A { void initialChip() @@ -672,6 +683,9 @@ void configRISCV(const bool on) if (on) { writeSpi(0x071, 0x00); writeSpi(0x071, 0x29); + for (size_t i = 0; i < CX9261A_RiscvBinLen; i++) { + writeSpi(0x070, CX9261A_RiscvBin[i]); + } writeSpi(0x236, 0x0F); writeSpi(0x20A, 0x01); writeSpi(0x071, 0x26);