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

107 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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. Быстрые команды-шпаргалки
```bash
# что видит плата
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'
```