Initial commit: OFDM-радиолиния на двух Pluto+ (PHY/link, код на ARM)

- src: transmitter, receiver, ofdm_bench, common (libiio local: + liquid-dsp)
- scripts: кросс-сборка зависимостей, деплой scp -O, e2e-тест с md5
- docs: бенчмарк CPU (выбор rate 1.92 MSPS), грабли FDD/регуляторика
- все текстовые файлы нормализованы в LF (.gitattributes принудительно):
  CRLF в toolchain.env/makefile ломал source и make на Linux
- .vscode: IntelliSense в режиме linux-gcc-arm, заголовки из .xarm/include

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Maxim
2026-07-10 11:00:38 +03:00
commit 0f207b146d
18 changed files with 1579 additions and 0 deletions

56
CLAUDE.md Normal file
View File

@@ -0,0 +1,56 @@
# CLAUDE.md — конституция проекта pluto-link
Прочитай этот файл первым. Полная документация — README.md, docs/.
## Контекст
Радиолиния точка-точка на двух Pluto+ (клон ADALM-Pluto: Zynq-7020,
2 × Cortex-A9 @ 667 МГц, NEON, 1 ГБ RAM, прошивка v0.38).
Весь сигнальный тракт исполняется НА ARM ВНУТРИ Pluto (libiio, контекст
`local:`). Хост (Raspberry Pi, aarch64) — только кросс-сборка и деплой.
PHY: OFDM через liquid-dsp 1.8.0 + FFTW/NEON, FEC RS(255,223).
## Жёсткие правила
1. Язык — C. НИКОГДА не предлагай Python, GNU Radio или обработку на хосте.
2. libiio только `local:` в тракте. `ip:` — только для хост-утилит отладки.
3. Статическая линковка, флаги обязательны:
`-O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard -ffast-math -static`
4. Никаких тяжёлых зависимостей (FFmpeg, cJSON, curl). JSON — руками.
5. Бюджет CPU: на DSP доступно ОДНО ядро 667 МГц (второе — IIO/FEC/IO).
Замерено: ofdmflexframesync тянет 2.34 Msps на кадрах, 5.32 Msps на шуме.
Поэтому sample rate = 1 920 000. НИКОГДА не поднимай до 3 840 000 —
система развалится под нагрузкой (0.61× от realtime).
6. Изменил PHY-параметры (M/CP/модуляция/rate) → сначала прогони
src/ofdm_bench.c на плате, обнови docs/BENCHMARK.md в том же коммите.
7. Порядок отладки: кабель+аттенюатор 3040 дБ (TX gain 40) → антенны
на столе → дистанция. Не отлаживать новый код сразу в эфире.
8. Изменения показывай в виде diff с объяснением каждой правки.
## Параметры тракта (текущие)
- rate 1 920 000, bw 1 500 000, OFDM M=64 CP=16 taper=4, QPSK, CRC32
- FEC RS(255,223), payload ≤ 1024 Б исходных (≤ 5 блоков, 1275 Б в эфире)
- Симплекс-тест: обе платы 915 МГц. FDD (этап 2): A TX915/RX868, B зеркально
- RX gain 50 дБ manual; TX gain: кабель 40, антенны от 20
## Формат кадра (заголовок 12 Б)
0-1: 0xF0 0xAA | 2-5: seq u32 BE | 6-7: len u16 BE | 8-9: nblocks |
10: last_block_bytes | 11: резерв
КРИТИЧНО: liquid по умолчанию передаёт 8 Б заголовка. Обязательно
`ofdmflexframegen_set_header_len(fg,12)` и
`ofdmflexframesync_set_header_len(fs,12)` на обеих сторонах.
## IIO-имена (первые грабли)
PHY: `ad9361-phy`; RX DMA: `cf-ad9361-lpc`; TX DMA: `cf-ad9361-dds-core-lpc`.
TX LO: канал `altvoltage1` (output); RX LO: `altvoltage0` (output).
Каналы данных: voltage0/voltage1 (I/Q, int16, диапазон ±2047 — 12 бит).
## Известный техдолг (README §9)
#1 header 12Б (см. выше) · #2 лимит nblocks ≤ 18, не 100 (стек recovered[4096])
· #3 fec_decode() liquid не сообщает об ошибках — rs_saved фиктивен
· #4 внешний NCO в receiver вреден, убрать · #5 TX пушит лишние сэмплы
· #6 нет детектора потерь по seq · #7 reciever.c → receiver.c
## Команды
Сборка: `make` · Деплой: `make deploy` (scp -O! sftp на плате нет)
Бенчмарк: `make bench && scripts/deploy.sh bench && ssh root@<pluto> '/tmp/ofdm_bench 1.92'`
E2E-тест: `scripts/test_file_link.sh`
Пароль root на Pluto: `analog`. rootfs в RAM — /tmp очищается при ребуте.