diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b946185 --- /dev/null +++ b/Makefile @@ -0,0 +1,203 @@ +# ========================================================================== +# PS2000 Reverse Engineered Library - Makefile +# ========================================================================== +# +# Build system for the reconstructed libps2000 library. +# Supports: +# - Compilation of all C modules +# - Generation of init script data from JSON +# - Shared library output +# +# Usage: +# make - Build the shared library +# make clean - Remove build artifacts +# make data - Regenerate data files from JSON +# make test - Build and run tests (if available) +# +# Dependencies: +# - libusb-1.0-dev +# - python3 (for data generation tools) +# +# ========================================================================== + +# Compiler and flags +CC = gcc +CFLAGS = -Wall -Wextra -Werror -O2 -fPIC -Iinclude -std=c11 +CFLAGS += -D_GNU_SOURCE -D_POSIX_C_SOURCE=200809L +LDFLAGS = -shared -lusb-1.0 -lpthread -lm -ldl + +# Directories +SRC_DIR = src +INC_DIR = include +BIN_DIR = build +TOOL_DIR = tools +DATA_DIR = data + +# Source files +SOURCES = $(wildcard $(SRC_DIR)/*.c) +OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o) +HEADERS = $(wildcard $(INC_DIR)/*.h) + +# Target library +TARGET = $(BIN_DIR)/libps2000_re.so + +# Data files +INIT_SCRIPT_JSON = $(DATA_DIR)/init_script.json +INIT_SCRIPT_INC = $(SRC_DIR)/init_script_data.inc +CONFIG_JSON = $(DATA_DIR)/config_data.json + +# Tools +INIT_TBL_ASM = $(TOOL_DIR)/init_tbl_asm.py +INIT_TBL_DISASM = $(TOOL_DIR)/init_tbl_disasm.py +CFG_ASM = $(TOOL_DIR)/cfg_asm.py +CFG_DISASM = $(TOOL_DIR)/cfg_disasm.py + +# ========================================================================== +# PHONY TARGETS +# ========================================================================== + +.PHONY: all clean dirs data test help + +# Default target +all: dirs $(TARGET) + @echo "" + @echo "==========================================" + @echo "Build complete: $(TARGET)" + @echo "==========================================" + +# Create build directory +dirs: + @mkdir -p $(BIN_DIR) + +# Clean build artifacts +clean: + @echo "Cleaning build artifacts..." + @rm -rf $(BIN_DIR) + @rm -f $(INIT_SCRIPT_INC) + @echo "Clean complete." + +# Generate data files from JSON +data: $(INIT_SCRIPT_INC) + @echo "Data generation complete." + +# Run tests (placeholder) +test: all + @echo "Running tests..." + @if [ -d tests ]; then \ + $(MAKE) -C tests; \ + else \ + echo "No tests directory found."; \ + fi + +# Help +help: + @echo "PS2000 Reverse Engineered Library - Build System" + @echo "" + @echo "Targets:" + @echo " all - Build the shared library (default)" + @echo " clean - Remove build artifacts" + @echo " data - Regenerate data files from JSON" + @echo " test - Build and run tests" + @echo " help - Show this help message" + @echo "" + @echo "Source files:" + @for f in $(SOURCES); do echo " $$f"; done + @echo "" + @echo "Dependencies:" + @echo " - libusb-1.0-dev" + @echo " - python3 (for data generation)" + +# ========================================================================== +# COMPILATION RULES +# ========================================================================== + +# Link shared library +$(TARGET): $(OBJECTS) + @echo "Linking $@..." + @$(CC) $(OBJECTS) -o $@ $(LDFLAGS) + @echo "Linked: $@" + +# Compile C sources +$(BIN_DIR)/%.o: $(SRC_DIR)/%.c $(HEADERS) + @echo "Compiling $<..." + @$(CC) $(CFLAGS) -c $< -o $@ + +# Special dependency: ps2000_hw.c depends on generated init script +$(BIN_DIR)/ps2000_hw.o: $(SRC_DIR)/ps2000_hw.c $(INIT_SCRIPT_INC) $(HEADERS) + @echo "Compiling $< (with init script)..." + @$(CC) $(CFLAGS) -c $< -o $@ + +# ========================================================================== +# DATA GENERATION RULES +# ========================================================================== + +# Generate init script include from JSON +$(INIT_SCRIPT_INC): $(INIT_SCRIPT_JSON) $(INIT_TBL_ASM) + @echo "Generating init script data..." + @python3 $(INIT_TBL_ASM) $(INIT_SCRIPT_JSON) --out $@ + @echo "Generated: $@" + +# Generate config data include from JSON (if needed) +$(SRC_DIR)/config_data.inc: $(CONFIG_JSON) $(CFG_ASM) + @echo "Generating config data..." + @python3 $(CFG_ASM) $(CONFIG_JSON) --out $@ + @echo "Generated: $@" + +# ========================================================================== +# UTILITY RULES +# ========================================================================== + +# Disassemble init script from binary (for development) +disasm-init: $(INIT_TBL_DISASM) + @if [ -f $(DATA_DIR)/init_script.bin ]; then \ + python3 $(INIT_TBL_DISASM) $(DATA_DIR)/init_script.bin \ + --stats --out $(INIT_SCRIPT_JSON); \ + echo "Disassembled to $(INIT_SCRIPT_JSON)"; \ + else \ + echo "Error: $(DATA_DIR)/init_script.bin not found"; \ + exit 1; \ + fi + +# Show compilation database (for IDE integration) +compile-db: + @echo "Generating compile_commands.json..." + @echo "[" > compile_commands.json + @first=1; \ + for f in $(SOURCES); do \ + if [ $$first -eq 1 ]; then first=0; else echo "," >> compile_commands.json; fi; \ + echo " {" >> compile_commands.json; \ + echo " \"directory\": \"$(PWD)\"," >> compile_commands.json; \ + echo " \"command\": \"$(CC) $(CFLAGS) -c $$f -o $(BIN_DIR)/$$(basename $$f .c).o\"," >> compile_commands.json; \ + echo " \"file\": \"$$f\"" >> compile_commands.json; \ + echo " }" >> compile_commands.json; \ + done + @echo "]" >> compile_commands.json + @echo "Generated compile_commands.json" + +# Static analysis (if cppcheck is available) +analyze: + @if command -v cppcheck >/dev/null 2>&1; then \ + cppcheck --enable=all --suppress=missingInclude \ + -I$(INC_DIR) $(SRC_DIR)/; \ + else \ + echo "cppcheck not found, skipping analysis"; \ + fi + +# Format code (if clang-format is available) +format: + @if command -v clang-format >/dev/null 2>&1; then \ + clang-format -i $(SRC_DIR)/*.c $(INC_DIR)/*.h; \ + echo "Code formatted"; \ + else \ + echo "clang-format not found, skipping format"; \ + fi + +# ========================================================================== +# DEPENDENCY TRACKING +# ========================================================================== + +# Include auto-generated dependencies +-include $(OBJECTS:.o=.d) + +# Generate dependencies during compilation +$(BIN_DIR)/%.o: CFLAGS += -MMD -MP \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..89e1b15 --- /dev/null +++ b/Readme.md @@ -0,0 +1,27 @@ +# libps2000_re (Reverse Engineered) + +Полная реконструкция драйвера `libps2000.so` для осциллографов PicoScope 2000 series на языке C. + +## Архитектура + +Проект разделен на функциональные модули, восстанавливающие логику оригинальной C++ библиотеки: + +- **`ps2000_core.c`**: Управление жизненным циклом контекста, глобальное состояние, подсчет ссылок. +- **`ps2000_ops.c`**: Диспетчер операций (реконструкция `sub_237C0`), таблица виртуальных методов. +- **`ps2000_usb.c`**: Транспортный уровень на базе `libusb-1.0`. +- **`ps2000_hw.c`**: Уровень абстракции оборудования (HAL), IO-команды, SPI, FPGA. +- **`ps2000_math.c`**: Централизованная математика (SSE/SSE2 паттерны, быстрое округление через 2^52). +- **`ps2000_osc.c`**: Осциллограф, расчет таймбаз, обработка данных. +- **`ps2000_gen.c`**: Генератор сигналов (DDS/AWG), встроенные формы волн. +- **`ps2000_cfg.c`**: Чтение EEPROM, калибровка, информация об устройстве. +- **`ps2000_trig.c`**: Валидация и расчет позиции триггера. +- **`ps2000_stream.c`**: Стриминг, кольцевой буфер, обработка raw-данных. +- **`ps2000_thread.c`**: Обертка над pthreads (замена C++ `IRunnable`). +- **`ps2000_fw.c`**: Загрузчик прошивок (протокол Cypress Anchor). +- **`ps2000_init_tbl.c`**: Парсер бинарного скрипта инициализации регистров. +- **`ps2000_log.c`**: Подсистема логирования с поддержкой callback. + +## Сборка + +```bash +make \ No newline at end of file