Перейти к содержанию

Лабораторная 11.16 — Захват RX на хосте до и после runtime-повторной инициализации RX common

Цель

Выяснить, достаточно ли записи в регистр AD9361 rx_common_ctrl после перезагрузки runtime-overlay через fpga_manager, чтобы восстановить тракт RX-захвата libiio на хосте.

Lab 11.13 показала, что RX-захват на хосте работает на чистом стоковом shell, но после горячей загрузки overlay курса отказывает (errno 110 — Connection timed out). Lab 11.15 подтвердила, что и RX-тракт PL остаётся «тёмным». Эта работа проверяет, может ли целевая повторная инициализация rx_common по SSH восстановить стоковый путь захвата на хосте без полной перезагрузки платы.

Почему это важно

Полная перезагрузка платы занимает ~2 минуты и сбрасывает всё состояние overlay. Если одна запись в регистр способна заново запустить DMA axi_ad9361_adc_dma без перезагрузки, цикл итеративных экспериментов с FPGA сокращается с минут до секунд.

Файлы

Путь Назначение
blocks/block_11_integrated_sdr_project/python/lab_11_16_runtime_rx_common_reinit_probe.py загрузить overlay, попытаться захватить на хосте, принудительно повторно инициализировать rx_common, снова попытаться захватить, составить отчёт
blocks/block_11_integrated_sdr_project/python/runtime_rx_common.py force_rx_common_ctrl_request(): отправляет по SSH последовательность повторной инициализации на стороне платы

Что делает скрипт

Для каждого этапа (до перезагрузки, после перезагрузки, после повторной инициализации) скрипт записывает:

  • снимок состояния платы AD9361 по SSH;
  • состояние регистров axi_ad9361_adc_dma;
  • одну попытку прямого захвата libiio Buffer.refill() с хоста;
  • одну попытку захвата iio_readdev;
  • хвост dmesg (последние 80 строк).

После того как этап после перезагрузки отказывает (как ожидается), он вызывает force_rx_common_ctrl_request() и повторяет обе попытки захвата.

Запуск

python blocks/block_11_integrated_sdr_project/python/lab_11_16_runtime_rx_common_reinit_probe.py \
  --bit-bin tmp/bridge_rx_only.wordswap.bit.bin \
  --json-out docs/assets/lab116_runtime_rx_common_reinit_probe_live.json

После успешного запуска скрипт пытается перезагрузить плату, чтобы вернуть стенд к базовой линии стокового shell. Передайте --no-reboot, чтобы пропустить перезагрузку.

Как интерпретировать результат

Захват после повторной инициализации Смысл
libiio успешен повторной инициализации rx_common достаточно; для итеративных тестов перезагрузка не нужна
libiio по-прежнему отказывает нехватка данных DMA глубже, чем регистр rx_common; требуется перезагрузка платы
частичное восстановление iio_readdev работает, а libiio нет: разница на уровне буфера, исследуйте iio_buffer_size

Живой результат 2026-06-23

Запись повторной инициализации rx_common (rx_common_ctrl = 0x70000001 по SSH) не восстановила путь захвата libiio на хосте. И Buffer.refill(), и iio_readdev продолжали отказывать с errno 110 после повторной инициализации. Нехватка данных DMA, вызванная перезагрузкой runtime-overlay, требует полной перезагрузки платы для восстановления.

Этот результат сужает оставшуюся проблему запуска: интерфейс регистра rx_common доступен, но не управляет зависанием refill DMA, вызванным переключением runtime-bitstream.

Чек-лист отчёта

  • Записано число отсчётов захвата до перезагрузки.
  • Записан результат захвата после перезагрузки (errno / успех).
  • Записано записанное значение rx_common_ctrl.
  • Записан результат захвата после повторной инициализации.
  • Приложена разница dmesg между этапами после перезагрузки и после повторной инициализации.

Шаблон инженерного вывода

После горячей загрузки runtime-overlay путь захвата libiio на хосте вернул
errno ____ (____). Запись rx_common_ctrl = 0x____ по SSH восстановила / не восстановила
путь захвата. Результат libiio после повторной инициализации: ____. Нехватка данных DMA
восстанавливается / не восстанавливается одной повторной инициализацией rx_common, потому что ______.