Files
Pluto-SDR/docs/NOTES.md
Maxim 0f207b146d 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>
2026-07-10 11:00:38 +03:00

7.0 KiB
Raw Blame History

NOTES.md — грабли, ограничения и почему так

Здесь собрано всё, что не является кодом, но экономит дни отладки.

1. Плата: Pluto+ ≠ ADALM-Pluto

Наши платы — клоны «Pluto+» (Zynq-7020). Отличия от стокового ADALM-Pluto (7010), которые влияют на проект:

Pluto+ (у нас) ADALM-Pluto сток
SoC Zynq-7020 Zynq-7010
Ядра ARM 2 активных 1 (второе — через хак)
RAM 1 ГБ 512 МБ
Ethernet есть гигабитный нет (только USB)

Следствия: бюджет «одно ядро на DSP, второе на IO» валиден только на наших платах; на стоковом Pluto весь тракт не поместится. Все замеры (docs/BENCHMARK.md) сделаны на Pluto+.

Особенности прошивки v0.38:

  • нет sftp-server → только scp -O (legacy protocol);
  • rootfs в RAM → всё в /tmp и /root пропадает при ребуте; бинарники заливаются заново (make deploy), «установить навсегда» = пересборка прошивки, нам не нужно;
  • BogoMIPS 333 в /proc/cpuinfo — артефакт таймера, реальная частота 667 МГц;
  • пароль root: analog.

2. FDD и самоглушение (главный риск этапа «в воздух»)

План FDD: A TX 915 / RX 868; B TX 868 / RX 915 (разнос 47 МГц). Проблема: дуплексеров нет. Собственный передатчик платы в паре сантиметров от собственного приёмника:

  • широкополосный шум TX попадает в полосу RX даже при разносе 47 МГц;
  • сильный сигнал TX блокирует (десенсибилизирует) входной каскад RX.

Характерный симптом: симплекс и loopback работают идеально, а в дуплексе RX платы «глохнет», как только её TX активен. Это не баг кода.

Меры (по нарастанию):

  1. максимальный tx_attenuation, какой позволяет линия;
  2. физический разнос TX/RX антенн + кросс-поляризация;
  3. SAW-фильтр 868 МГц на RX-вход (копеечный, SRD-диапазон);
  4. если ничего не помогает — честный TDD на одной частоте.

Поэтому порядок работ: сначала симплекс (обе платы 915 МГц, полудуплекс по очереди), FDD — отдельным этапом с замерами деградации RX при активном TX.

3. Регуляторика (868/915 МГц в регионе ETSI)

  • 868 МГц — SRD-диапазон: ограничения на полосу канала (сотни кГц), ЭИИМ и duty cycle. Наш сигнал 1.5 МГц в них не вписывается.
  • 915 МГц — в Европе это uplink GSM-900, не ISM (ISM 902928 — регион США).

Практический вывод: разработка и демо — кабель с аттенюатором или антенны на столе с минимальной мощностью (TX gain от 40) и без внешних усилителей. Это ограничение прототипа фиксируется в отчёте проекта; у целевой системы по ТЗ предполагается лицензированный канал.

4. RF-безопасность

  • Кабельный тест только через аттенюатор 3040 дБ + -g -40. Прямое соединение TX→RX выжигает входной каскад AD9361.
  • Диапазон DAC/ADC — 12 бит (±2047 в int16). Клиппинг при амплитуде TX > ~0.5 виден как рост EVM на RX.

5. Особенности liquid-dsp, найденные в бою

  • Заголовок пользователя по умолчанию 8 байт. Наш формат — 12 байт. Без ofdmflexframegen_set_header_len(fg,12) / ofdmflexframesync_set_header_len(fs,12) байты 811 (nblocks, last_block_bytes) в эфир не уходят, RX читает мусор за границей буфера.
  • fec_decode() не сообщает об ошибках: RS-декодер liquid всегда «успешен», неисправимый блок просто отдаёт мусор. Единственный надёжный критерий целостности — CRC/md5 поверх декодированных данных.
  • Без FFTW liquid молча деградирует на встроенный FFT. Проверка после сборки обязательна: grep HAVE_LIBFFTW3F config.log.
  • ofdmflexframesync сам оценивает и компенсирует CFO по преамбуле; внешний NCO-контур поверх него (как в раннем receiver.c) не нужен и с set_phase(0) на границах буферов — вреден.

6. Почему архитектурные решения именно такие

  • Статическая линковка: независимость от libc прошивки, деплой одним файлом, нет возни с sysroot ADI. Цена ~2 МБ — ничто при 1 ГБ RAM.
  • rate 1.92, а не 3.84 MSPS: замер (BENCHMARK.md) — 2.34 Msps потолок синхронизатора на кадрах. 3.84 даёт отказ «работает на демо, падает под нагрузкой» — худший для радиолинии вид отказа.
  • OFDM оставлен, несмотря на цену CPU: код написан и проверен; single-carrier QPSK дал бы ту же полезную скорость дешевле, но потребовал бы написать и отладить синхронизацию заново. Решение можно пересмотреть, если понадобится rate > 1.92 MSPS (см. резервы в BENCHMARK.md).
  • Симплекс раньше FDD: изолирует проблемы кода от проблем RF (п. 2).

7. Быстрые команды-шпаргалки

# что видит плата
iio_info -u ip:192.168.2.1 | less
iio_attr -u ip:192.168.2.1 -c ad9361-phy altvoltage1 frequency   # TX LO

# загрузка CPU на плате во время линии (busybox top)
ssh root@192.168.2.1 top

# логи TX/RX после test_file_link.sh
ssh root@<ip> 'cat /tmp/tx.log /tmp/rx.log'