Compare commits
4
Commits
8d4c4751fd
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12457af536 | ||
|
|
d4159ec998 | ||
|
|
79f59d15f7 | ||
|
|
a7cf13b37a |
@@ -1,6 +1,7 @@
|
|||||||
# Buid files
|
# Buid files
|
||||||
build/
|
build/
|
||||||
*.tar.gz
|
*.tar.gz
|
||||||
|
cx9261a_riscv_bin.c
|
||||||
|
|
||||||
# System generated files
|
# System generated files
|
||||||
# -- macOS
|
# -- macOS
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ CFLAGS_DEBUG := $(CFLAGS) $(DEBUG_FLAGS)
|
|||||||
CFLAGS_RELEASE := $(CFLAGS) $(RELEASE_FLAGS)
|
CFLAGS_RELEASE := $(CFLAGS) $(RELEASE_FLAGS)
|
||||||
|
|
||||||
# Collect source files
|
# Collect source files
|
||||||
|
RISCV_BINARY := $(CURDIR)/cx9261A_api/MultiPointsCalib_v1.8.bin
|
||||||
|
BIN_SRC := $(CURDIR)/cx9261a_riscv_bin.c
|
||||||
SRCS := $(CURDIR)/cx9261adriver_c.cpp $(CURDIR)/cx9261A_api/cx9261adriver.cpp
|
SRCS := $(CURDIR)/cx9261adriver_c.cpp $(CURDIR)/cx9261A_api/cx9261adriver.cpp
|
||||||
TEST_SRC := ld_test.c
|
TEST_SRC := ld_test.c
|
||||||
PACKAGE_HEADERS := ./cx9261adriver_c.h
|
PACKAGE_HEADERS := ./cx9261adriver_c.h
|
||||||
@@ -33,6 +35,9 @@ PACKAGE_HEADERS := ./cx9261adriver_c.h
|
|||||||
# Default target
|
# Default target
|
||||||
all: $(foreach arch, $(ARCHS), $(BUILD_DIR)/$(arch)/lib$(PROJECT_NAME)_dbg.a $(BUILD_DIR)/$(arch)/lib$(PROJECT_NAME).a)
|
all: $(foreach arch, $(ARCHS), $(BUILD_DIR)/$(arch)/lib$(PROJECT_NAME)_dbg.a $(BUILD_DIR)/$(arch)/lib$(PROJECT_NAME).a)
|
||||||
|
|
||||||
|
$(BIN_SRC): $(RISCV_BINARY)
|
||||||
|
$(CURDIR)/tools/gen_riscvbin.py $< -o $(CURDIR)
|
||||||
|
|
||||||
# Rule to create debug libraries for different architectures
|
# Rule to create debug libraries for different architectures
|
||||||
$(BUILD_DIR)/%/lib$(PROJECT_NAME)_dbg.a: $(SRCS)
|
$(BUILD_DIR)/%/lib$(PROJECT_NAME)_dbg.a: $(SRCS)
|
||||||
@mkdir -p $(BUILD_DIR)/$*/debug
|
@mkdir -p $(BUILD_DIR)/$*/debug
|
||||||
@@ -48,21 +53,22 @@ $(BUILD_DIR)/%/lib$(PROJECT_NAME).a: $(SRCS)
|
|||||||
# Clean up
|
# Clean up
|
||||||
clean:
|
clean:
|
||||||
rm -rf $(BUILD_DIR) *.tar.gz
|
rm -rf $(BUILD_DIR) *.tar.gz
|
||||||
|
rm -rf $(CURDIR)/cx9261a_riscv_bin.c
|
||||||
|
|
||||||
# Run link tests
|
# Run link tests
|
||||||
test: all $(foreach arch, $(ARCHS), $(BUILD_DIR)/$(arch)/ld_test $(BUILD_DIR)/$(arch)/ld_test_dbg)
|
test: all $(foreach arch, $(ARCHS), $(BUILD_DIR)/$(arch)/ld_test $(BUILD_DIR)/$(arch)/ld_test_dbg)
|
||||||
@echo "Link test success!"
|
@echo "Link test success!"
|
||||||
|
|
||||||
# Debug link tests
|
# Debug link tests
|
||||||
$(BUILD_DIR)/%/ld_test_dbg: $(SRCS) $(TEST_SRC)
|
$(BUILD_DIR)/%/ld_test_dbg: $(SRCS) $(TEST_SRC) $(BIN_SRC)
|
||||||
@$(CC) $(CFLAGS_DEBUG) -mcpu=$* ld_test.c -o $@ -L$(BUILD_DIR)/$* -l$(PROJECT_NAME)_dbg -lstdc++ -lm -specs=nosys.specs
|
@$(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
|
# Release link tests
|
||||||
$(BUILD_DIR)/%/ld_test: $(SRCS) $(TEST_SRC)
|
$(BUILD_DIR)/%/ld_test: $(SRCS) $(TEST_SRC) $(BIN_SRC)
|
||||||
@$(CC) $(CFLAGS_RELEASE) -mcpu=$* ld_test.c -o $@ -L$(BUILD_DIR)/$* -l$(PROJECT_NAME) -lstdc++ -lm -specs=nosys.specs
|
@$(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 for release - bundle debug and release versions for each architecture separately
|
||||||
package: all
|
package: all $(BIN_SRC)
|
||||||
@echo "Packaging for release..."
|
@echo "Packaging for release..."
|
||||||
@$(foreach arch, $(ARCHS), \
|
@$(foreach arch, $(ARCHS), \
|
||||||
mkdir -p release_$(arch)/lib; \
|
mkdir -p release_$(arch)/lib; \
|
||||||
@@ -72,6 +78,7 @@ package: all
|
|||||||
cp $(BUILD_DIR)/$(arch)/lib$(PROJECT_NAME).a release_$(arch)/lib/; \
|
cp $(BUILD_DIR)/$(arch)/lib$(PROJECT_NAME).a release_$(arch)/lib/; \
|
||||||
cp $(PACKAGE_HEADERS) release_$(arch)/include/; \
|
cp $(PACKAGE_HEADERS) release_$(arch)/include/; \
|
||||||
cp $(SRCS) release_$(arch)/dbg/cx9261a_c/; \
|
cp $(SRCS) release_$(arch)/dbg/cx9261a_c/; \
|
||||||
|
cp $(CURDIR)/cx9261a_riscv_bin.c release_$(arch)/; \
|
||||||
tar -czvf release_$(arch).tar.gz -C release_$(arch) .; \
|
tar -czvf release_$(arch).tar.gz -C release_$(arch) .; \
|
||||||
rm -rf release_$(arch); \
|
rm -rf release_$(arch); \
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
ver 1.4.0
|
||||||
|
API变动:
|
||||||
|
1. 增加了多点跳频相关函数,configRxMultiPointsQec,readRxCalibPredis,saveRxCalibPredis需要结合片上处理器程序一起使用
|
||||||
|
2. configPll*函数现在接收Clock结构体而不是原来的参考时钟值(double)
|
||||||
|
|
||||||
|
驱动优化:
|
||||||
|
1. configPll*函数现在不再使用std::map容器储存寄存器值,改为使用std::vector以增加在高速跳频情况下的响应速度
|
||||||
|
2. 枚举变量显式指定大小为std::uint8_t,即unsigned char
|
||||||
|
|
||||||
|
|
||||||
|
ver 1.3.0
|
||||||
|
API变动:
|
||||||
|
1. configBBPLL函数现在需要传入CX9261AConfiguration结构体,而不是原来的Clock结构体
|
||||||
|
2. 增加txCalib函数,接受CX9261AConfiguration结构体,对Tx通道进行校准,包含原来的txBisectionQecCalib以及txBisectionDcCalib,并且自动进行电源管理配置
|
||||||
|
3. configInterface函数现在需要传入Interface结构体,不再需要传入adc速率
|
||||||
|
4. 增加IOMode枚举类型,包含CMOS,LVDS顺序模式和LVDS奇偶模式
|
||||||
|
5. Interface结构体现在增加一个IOMode类型的变量,指示芯片接口模式
|
||||||
|
|
||||||
|
驱动优化:
|
||||||
|
1. configBBPLL函数现在会配置IOMode相关以及adc速率相关寄存器
|
||||||
|
2. pll环路参数选择范围小幅度变化
|
||||||
|
3. Rx窄带校准使用新的校准方法
|
||||||
|
4. waitRxTSTFinished函数现在会在十次qecDelay后返回
|
||||||
|
5. configPll函数现在在不同频率下行为一致
|
||||||
|
6. configInterface函数现在增加IOMode相关寄存器配置,删除adc速率相关寄存器配置
|
||||||
|
7. initialRxChannel函数修改0x706/0x722/0x73E寄存器配置,从0x65改到0x6D
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ver 1.2.0
|
||||||
|
1. BUG FIX:配置流程中需要先切换到休眠模式再切换到校准模式
|
||||||
|
2. configTxChannelFrequency函数需要在configTxChannel函数之前调用
|
||||||
|
|
||||||
|
ver 1.1.0
|
||||||
|
1. BUG FIX:修复了0x6C3寄存器在选择通道来源Off并且使用外本振时值不对的错误。
|
||||||
|
2. waitRxTSTFinished函数修改,现在会在校准结束后寄存器0x77E写入0x00,而不是在原来的恢复寄存器部分。
|
||||||
|
3. initialTxChannel函数修改,现在initialTxChannel不再需要输入参数,原来需要输入通道本振频率配置的寄存器移到了新的函数configTxChannelFrequency中。
|
||||||
|
4. rxTSTCalib函数修改,现在rxTSTCalib不再自动调用waitRxTSTFinished函数。
|
||||||
|
5. BUG FIX:修复了rxTSTCalib函数在tx通道配置为外本振时不能正确校准的错误。
|
||||||
|
6. beforeQecState函数修改,移除了冗余的寄存器状态保存。
|
||||||
|
7. configQecCalib函数修改,删除了在不进行Tx校准时仍然进行寄存器恢复的代码。
|
||||||
|
8. configTxChannelFrequency函数添加,用于配置Tx通道本振频率相关寄存器。
|
||||||
|
9. 代码格式化。
|
||||||
|
10. main.cpp demo调整。
|
||||||
|
|
||||||
|
ver 1.0.1
|
||||||
|
1. 添加了configTxChannel函数,内部调用的configTxBandwidth和configTxMixer函数
|
||||||
|
2. 校准过程中的pll锁定增加了锁定判断
|
||||||
|
3. 添加了配合Demo工程的configFPGA函数以及对应的setPin函数
|
||||||
Binary file not shown.
@@ -1,10 +1,17 @@
|
|||||||
// ReSharper disable CppCompileTimeConstantCanBeReplacedWithBooleanConstant
|
#include "cx9261adriver.h"
|
||||||
// ReSharper disable CppUseRangeAlgorithm
|
|
||||||
// ReSharper disable CppUseStructuredBinding
|
|
||||||
// ReSharper disable CppTooWideScopeInitStatement
|
|
||||||
#include "cx9261adriver.h"
|
|
||||||
#include "utils.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 {
|
namespace CX9261A {
|
||||||
|
|
||||||
void initialChip()
|
void initialChip()
|
||||||
@@ -672,6 +679,9 @@ void configRISCV(const bool on)
|
|||||||
if (on) {
|
if (on) {
|
||||||
writeSpi(0x071, 0x00);
|
writeSpi(0x071, 0x00);
|
||||||
writeSpi(0x071, 0x29);
|
writeSpi(0x071, 0x29);
|
||||||
|
for (size_t i = 0; i < CX9261A_RiscvBinLen; i++) {
|
||||||
|
writeSpi(0x070, CX9261A_RiscvBin[i]);
|
||||||
|
}
|
||||||
writeSpi(0x236, 0x0F);
|
writeSpi(0x236, 0x0F);
|
||||||
writeSpi(0x20A, 0x01);
|
writeSpi(0x20A, 0x01);
|
||||||
writeSpi(0x071, 0x26);
|
writeSpi(0x071, 0x26);
|
||||||
@@ -1047,15 +1057,15 @@ void rxCalib(const CX9261AConfiguration& config, const RxChannel chan)
|
|||||||
{
|
{
|
||||||
LOGGING(toString(chan) + "校准");
|
LOGGING(toString(chan) + "校准");
|
||||||
if (config.calib.rxMethod == CalibMethod::TST) {
|
if (config.calib.rxMethod == CalibMethod::TST) {
|
||||||
if (chan == RxChannel::Rx1 && config.pllSource.rx1Source == LoSource::Off) {
|
if (chan == RxChannel::Rx1 && config.pllSource.rx1Source == LoSource::Off && !config.pllSource.rxUseExt) {
|
||||||
LOGGING(toString(chan) + " OFF")
|
LOGGING(toString(chan) + " OFF")
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (chan == RxChannel::Rx2 && config.pllSource.rx2Source == LoSource::Off) {
|
if (chan == RxChannel::Rx2 && config.pllSource.rx2Source == LoSource::Off && !config.pllSource.rxUseExt) {
|
||||||
LOGGING(toString(chan) + " OFF")
|
LOGGING(toString(chan) + " OFF")
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (chan == RxChannel::Rx3 && config.pllSource.rx3Source == LoSource::Off) {
|
if (chan == RxChannel::Rx3 && config.pllSource.rx3Source == LoSource::Off && !config.pllSource.rxUseExt) {
|
||||||
LOGGING(toString(chan) + " OFF")
|
LOGGING(toString(chan) + " OFF")
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1429,7 +1439,7 @@ void configQecCalib(const CX9261AConfiguration& config)
|
|||||||
configCalibMethod(config.calib);
|
configCalibMethod(config.calib);
|
||||||
// Rx校准只在有任意Rx通道不是Off时发生
|
// Rx校准只在有任意Rx通道不是Off时发生
|
||||||
const bool calibRx = config.pllSource.rx1Source != LoSource::Off || config.pllSource.rx2Source != LoSource::Off
|
const bool calibRx = config.pllSource.rx1Source != LoSource::Off || config.pllSource.rx2Source != LoSource::Off
|
||||||
|| config.pllSource.rx3Source != LoSource::Off;
|
|| config.pllSource.rx3Source != LoSource::Off || config.pllSource.rxUseExt;
|
||||||
if (calibRx) {
|
if (calibRx) {
|
||||||
rxCalib(config, RxChannel::Rx1);
|
rxCalib(config, RxChannel::Rx1);
|
||||||
rxCalib(config, RxChannel::Rx2);
|
rxCalib(config, RxChannel::Rx2);
|
||||||
@@ -1490,7 +1500,8 @@ void configQecCalib(const CX9261AConfiguration& config)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Tx校准只在任意Tx通道不是Off时发生
|
// Tx校准只在任意Tx通道不是Off时发生
|
||||||
const bool calibTx = config.pllSource.tx1Source != LoSource::Off || config.pllSource.tx2Source != LoSource::Off;
|
const bool calibTx = config.pllSource.tx1Source != LoSource::Off || config.pllSource.tx2Source != LoSource::Off
|
||||||
|
|| config.pllSource.txUseExt;
|
||||||
if (calibTx) {
|
if (calibTx) {
|
||||||
txCalib(config);
|
txCalib(config);
|
||||||
restoreQecState(regsState);
|
restoreQecState(regsState);
|
||||||
@@ -1642,7 +1653,7 @@ void configInterface(const Interface& interface)
|
|||||||
if (interface.workMode == WorkMode::FDD)
|
if (interface.workMode == WorkMode::FDD)
|
||||||
writeSpi(0x201, 0x00);
|
writeSpi(0x201, 0x00);
|
||||||
else if (interface.portMode == PortMode::Single && interface.trMode == TrMode::R2T2)
|
else if (interface.portMode == PortMode::Single && interface.trMode == TrMode::R2T2)
|
||||||
writeSpi(0x201, 0x3F);
|
writeSpi(0x201, 0x3D);
|
||||||
else
|
else
|
||||||
writeSpi(0x201, 0x15);
|
writeSpi(0x201, 0x15);
|
||||||
// 0x202
|
// 0x202
|
||||||
@@ -2067,7 +2078,7 @@ void configFPGA(const Interface& interface)
|
|||||||
setPin(40, 1);
|
setPin(40, 1);
|
||||||
|
|
||||||
setPin(32, 1);
|
setPin(32, 1);
|
||||||
setPin(7, interface.ioMode == IOMode::CMOS ? 0 : 1);
|
setPin(7, interface.ioMode == IOMode::LVDS_E ? 0 : 1);
|
||||||
setPin(34, 1);
|
setPin(34, 1);
|
||||||
setPin(34, 0);
|
setPin(34, 0);
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
#ifndef CX9261ADRIVER_CX9261ADRIVER_H
|
#ifndef CX9261ADRIVER_CX9261ADRIVER_H
|
||||||
#define CX9261ADRIVER_CX9261ADRIVER_H
|
#define CX9261ADRIVER_CX9261ADRIVER_H
|
||||||
|
|
||||||
#define VERSION 1.9.0
|
#define VERSION 1.10.0
|
||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ extern "C" {
|
|||||||
#define MAX_NUM_FIR 64
|
#define MAX_NUM_FIR 64
|
||||||
#define MAX_MULTI_POINTS 64
|
#define MAX_MULTI_POINTS 64
|
||||||
|
|
||||||
|
extern uint32_t CX9261A_RiscvBinLen;
|
||||||
|
extern uint8_t *CX9261A_RiscvBin;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
CX9261A_WKM_Rx,
|
CX9261A_WKM_Rx,
|
||||||
CX9261A_WKM_Tx,
|
CX9261A_WKM_Tx,
|
||||||
|
|||||||
Executable
+73
@@ -0,0 +1,73 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
def convert_bin_to_c(bin_file, output_dir):
|
||||||
|
# Read the bin file
|
||||||
|
with open(bin_file, 'rb') as f:
|
||||||
|
bin_data = f.read()
|
||||||
|
|
||||||
|
# Get the length of the bin file
|
||||||
|
bin_len = len(bin_data)
|
||||||
|
|
||||||
|
# Set the output file path within the specified directory
|
||||||
|
output_file = os.path.join(output_dir, 'cx9261a_riscv_bin.c')
|
||||||
|
|
||||||
|
with open(output_file, 'w') as f:
|
||||||
|
# Write metadata comments
|
||||||
|
f.write(f'// Generated C code array\n')
|
||||||
|
f.write(f'// Date: {datetime.now().strftime("%Y-%m-%d %H:%M:%S")}\n')
|
||||||
|
f.write(f'// Source file: {os.path.basename(bin_file)}\n\n')
|
||||||
|
|
||||||
|
# Write headers and data length
|
||||||
|
f.write('#include <stdint.h>\n')
|
||||||
|
f.write('#include "cx9261adriver_c.h"\n\n')
|
||||||
|
f.write(f'uint32_t CX9261A_RiscvBinLen = {bin_len};\n')
|
||||||
|
f.write(f'uint8_t *CX9261A_RiscvBin = (uint8_t[]){{\n\t')
|
||||||
|
|
||||||
|
# Write data as hex values in the array
|
||||||
|
for i, byte in enumerate(bin_data):
|
||||||
|
f.write(f'0x{byte:02X}, ')
|
||||||
|
# Add a newline every 12 bytes
|
||||||
|
if (i + 1) % 12 == 0:
|
||||||
|
f.write('\n\t')
|
||||||
|
|
||||||
|
# Add a newline if the last line has fewer than 12 bytes
|
||||||
|
if bin_len % 12 != 0:
|
||||||
|
f.write('\n')
|
||||||
|
|
||||||
|
# End the array
|
||||||
|
f.write('};\n')
|
||||||
|
|
||||||
|
print(f"Generated C file: {output_file}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
# Set up command line argument parsing
|
||||||
|
parser = argparse.ArgumentParser(description="Convert a CX9261A Riscv bin file to a C code array.")
|
||||||
|
parser.add_argument("bin_file", type=str, nargs='?', help="Path to the bin file (optional)")
|
||||||
|
parser.add_argument("-o", "--output_dir", type=str, default=".", help="Output directory (default is the current directory)")
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# If no bin file is provided, search for a .bin file in the current directory
|
||||||
|
if args.bin_file is None:
|
||||||
|
bin_files = glob.glob("*.bin")
|
||||||
|
if len(bin_files) == 0:
|
||||||
|
print("Error: No .bin file found in the current directory.")
|
||||||
|
exit(1)
|
||||||
|
elif len(bin_files) > 1:
|
||||||
|
print("Error: Multiple .bin files found in the current directory. Specify one as an argument.")
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
args.bin_file = bin_files[0]
|
||||||
|
|
||||||
|
# Check if output directory exists, create if not
|
||||||
|
if not os.path.isdir(args.output_dir):
|
||||||
|
os.makedirs(args.output_dir)
|
||||||
|
|
||||||
|
# Perform the conversion
|
||||||
|
convert_bin_to_c(args.bin_file, args.output_dir)
|
||||||
Reference in New Issue
Block a user