Лабораторная 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, потому что ______.