# pluto-link — кросс-сборка под ARM Pluto (armhf, static) # Цели: all | tx | rx | bench | deploy | test | clean | help # Переменные можно переопределить: make PLUTO_A=ip PLUTO_B=ip # --- тулчейн (согласовано с toolchain.env) --- CROSS ?= arm-linux-gnueabihf- CC := $(CROSS)gcc XARM ?= $(HOME)/xarm CFLAGS := -O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -ffast-math \ -Wall -Wextra -static -I$(XARM)/include -Isrc LDFLAGS := -L$(XARM)/lib LDLIBS := -lliquid -lfec -lfftw3f -lm -lpthread DEPS_LIBS := $(XARM)/lib/libliquid.a $(XARM)/lib/libfec.a $(XARM)/lib/libad9361.a $(XARM)/lib/libiio.a $(XARM)/lib/libfftw3f.a # --- платы --- A == transmitter, B == receiver PLUTO_A ?= 192.168.2.1 PLUTO_B ?= 192.168.3.1 BIN := build SRC := src all: $(BIN)/transmitter $(BIN)/receiver $(BIN)/ofdm_bench $(BIN)/udp_gw $(BIN)/udp_probe $(BIN): mkdir -p $(BIN) $(BIN)/transmitter: $(SRC)/transmitter.c $(SRC)/common.c $(SRC)/group_fec.c $(SRC)/frame_tx.c $(SRC)/feedback.c $(SRC)/common.h $(SRC)/group_fec.h $(SRC)/frame_tx.h $(SRC)/feedback.h $(DEPS_LIBS) | $(BIN) $(CC) $(CFLAGS) $(SRC)/transmitter.c $(SRC)/common.c $(SRC)/group_fec.c $(SRC)/frame_tx.c $(SRC)/feedback.c -o $@ $(LDFLAGS) -Wl,--start-group -lad9361 -liio $(LDLIBS) -Wl,--end-group $(BIN)/receiver: $(SRC)/receiver.c $(SRC)/common.c $(SRC)/group_fec.c $(SRC)/frame_tx.c $(SRC)/feedback.c $(SRC)/common.h $(SRC)/group_fec.h $(SRC)/frame_tx.h $(SRC)/feedback.h $(DEPS_LIBS) | $(BIN) $(CC) $(CFLAGS) $(SRC)/receiver.c $(SRC)/common.c $(SRC)/group_fec.c $(SRC)/frame_tx.c $(SRC)/feedback.c -o $@ $(LDFLAGS) -Wl,--start-group -lad9361 -liio $(LDLIBS) -Wl,--end-group $(BIN)/ofdm_bench: $(SRC)/ofdm_bench.c | $(BIN) $(CC) $(CFLAGS) $< -o $@ $(LDFLAGS) $(LDLIBS) # UDP-туннель (roadmap §10 п.8) — самостоятельный бинарь, без iio/liquid/fec. # Работает НА плате (piped с transmitter/receiver), поэтому та же кросс-сборка. $(BIN)/udp_gw: $(SRC)/udp_gw.c | $(BIN) $(CC) $(CFLAGS) $< -o $@ # Тестовый генератор/приёмник UDP для бринг-апа udp_gw (busybox без nc/socat). $(BIN)/udp_probe: $(SRC)/udp_probe.c | $(BIN) $(CC) $(CFLAGS) $< -o $@ # Оффлайн-самопроверка GF(256) — нативная сборка (gcc хоста, напр. RPi/aarch64) $(BIN)/gftest: $(SRC)/group_fec.c $(SRC)/group_fec.h | $(BIN) cc -O2 -Wall -DGF_SELFTEST $(SRC)/group_fec.c -o $@ # Оффлайн-самопроверка парсера udp_gw — та же логика, нативная сборка. $(BIN)/gwtest: $(SRC)/udp_gw.c | $(BIN) cc -O2 -Wall -Wextra -DGW_SELFTEST $(SRC)/udp_gw.c -o $@ tx: $(BIN)/transmitter rx: $(BIN)/receiver bench: $(BIN)/ofdm_bench gw: $(BIN)/udp_gw probe: $(BIN)/udp_probe gftest: $(BIN)/gftest $(BIN)/gftest gwtest: $(BIN)/gwtest $(BIN)/gwtest # --- деплой (scp -O: на прошивке v0.38 нет sftp-server) --- deploy: all scripts/deploy.sh $(PLUTO_A) $(PLUTO_B) # --- e2e: файл через радио + md5 --- test: deploy scripts/test_file_link.sh $(PLUTO_A) $(PLUTO_B) check-env: @which $(CC) >/dev/null || { echo "нет $(CC): sudo apt install gcc-arm-linux-gnueabihf"; exit 1; } @test -f $(XARM)/lib/libliquid.a || { echo "нет libliquid.a: запусти scripts/build_deps.sh"; exit 1; } @test -f $(XARM)/lib/libfftw3f.a || { echo "нет libfftw3f.a: запусти scripts/build_deps.sh"; exit 1; } @test -f $(XARM)/lib/libfec.a || { echo "нет libfec.a: запусти scripts/build_deps.sh"; exit 1; } @test -f $(XARM)/lib/libad9361.a || { echo "нет libad9361.a: запусти scripts/build_deps.sh"; exit 1; } @echo "OK: тулчейн и зависимости на месте" clean: rm -rf $(BIN) help: @echo "make [all] — собрать transmitter, receiver, ofdm_bench, udp_gw, udp_probe (static armhf)" @echo "make tx|rx|bench|gw|probe — собрать отдельную цель" @echo "make gftest — оффлайн-самопроверка group-FEC (нативный cc)" @echo "make gwtest — оффлайн-самопроверка парсера udp_gw (нативный cc)" @echo "make deploy — залить бинарники на обе платы (scp -O в /tmp)" @echo "make test — e2e-тест передачи файла с md5-сверкой" @echo "make check-env — проверить тулчейн и $(XARM)" @echo "make clean — удалить build/" @echo "переменные: PLUTO_A=$(PLUTO_A) PLUTO_B=$(PLUTO_B) XARM=$(XARM)" .PHONY: all tx rx bench gw probe gftest gwtest deploy test check-env clean help