# 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 902–928 — регион США). Практический вывод: разработка и демо — **кабель с аттенюатором** или антенны на столе с минимальной мощностью (TX gain от −40) и без внешних усилителей. Это ограничение прототипа фиксируется в отчёте проекта; у целевой системы по ТЗ предполагается лицензированный канал. ## 4. RF-безопасность - Кабельный тест **только** через аттенюатор 30–40 дБ + `-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)` байты 8–11 (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@ 'cat /tmp/tx.log /tmp/rx.log' ```