Как настроить Radioberry на актуальной версии Raspberry Pi OS

от автора

Мы привыкли видеть Raspberry Pi в виде основы для различных SDR-приемников, декодеров и панорамирующих адаптеров. А вот полноценные КВ-трансиверы на базе RPI встретить сложно. Проект Radioberry — одно из редких приятных исключений. Эта маленькая плата превращает «малинку» в настоящую SDR-станцию со своим интерфейсом и возможностью как принимать, так и передавать в КВ-диапазоне.

До недавнего времени настройка была простой, но после обновления Raspberry Pi OS старые инструкции почти утратили актуальность: плата больше не определялась в системе. Один мой знакомый радиолюбитель даже решил, что она вышла из строя, и попросил меня о диагностике.

Что внутри

Radioberry интересна тем, что это не звуковая карта с антенным входом и не надоевший всем SDR-свисток. Это полноценная SDR-плата с двумя ключевыми микросхемами: Analog Devices AD9866 и FPGA Intel Cyclone 10 LP. Первая представляет собой широкополосный модем (MxFE, Mixed Signal Front End), который в одном корпусе объединяет АЦП, ЦАП, микшеры и цифровые преобразователи частоты. На нем построен SDR-трансивер прямого преобразования.

AD9866 — 12-битный, компромиссный, но вполне рабочий вариант для платы такого класса. Разумеется, до современных 14/16-битных чипов ему далеко, однако и цена у него значительно ниже. Так что ждать от Radioberry возможностей профессионального устройства с широким динамическим диапазоном не стоит — плата исключительно любительская. 

Второй чип также довольно интересный. Дело в том, что если попытаться отдать сырые данные на Raspberry, одноплатник не справится с обработкой потока данных из-за его высокой скорости. Именно здесь FPGA становится ключевым элементом — он берет данные от AD9866, формирует IQ-поток, фильтрует, снижает частоту дискретизации — и только после этого передает их на Raspberry Pi.

Программная часть

Перед установкой полезно понять, как все устроено. Большинство проблем с платой возникает как раз из-за того, что архитектура остается за кадром. В сети полно руководств по настройке отдельных частей, но целостной картины они не дают. В итоге настройка выполнена, а система молчит.

В системе выделяются четыре программных уровня, каждый со своей задачей. Чтобы Radioberry заработала, нужно настроить каждый из них:

Gateware

На самом нижнем слое находится двоичный файл конфигурации FPGA (битстрим с расширением .rbf), который должен лежать по адресу /lib/firmware/radioberry.rbf. После подачи питания FPGA «чиста» и ждет этот файл. Только после его загрузки микросхема начинает работать. При потере питания состояние сбрасывается.

Driver

Этот слой состоит из модуля ядра radioberry.ko и соответствующего device-tree оверлея. При загрузке системы модуль создает устройство /dev/radioberry и загружает битстрим в FPGA.

Firmware

Демон-прослойка /usr/local/bin/radioberry, действующий в пользовательском пространстве. Преобразует поток данных с шины SPI в стандартный сетевой протокол приложения HPSDR на интерфейсе lo. Он как переводчик позволяет HAT-плате на гребенке RPI представляться «взрослым» трансивером HPSDR/Hermes. Софт вроде pihpsdr вообще не будет знать, чем по-факту управляет.

Service

Финальный слой — автоматический запуск сервиса, чтобы все вышеперечисленные уровни выполняли свою работу. Если хотя бы один из них не запустится, pihpsdr будет искать устройство, а затем выдаст ошибку, что не нашел. С таким поведением и столкнулся мой знакомый.

Подготовка системы

Для начала залейте свежую Raspberry Pi OS на MicroSD-карту. Проще всего для этого использовать Raspberry Pi Imager или Balena Etcher. После успешной загрузки выполните обновление пакетов:

sudo apt update && sudo apt -y upgrade

Перезагрузитесь:

sudo reboot

Теперь откройте утилиту конфигурации «малинки»:

sudo raspi-config

Включите SPI в разделе Interface Options. Он нужен для управляющего обмена с FPGA, потоковая часть завязана на GPIO/IRQ. Для проверки выполните команду:

ls /dev/spidev*

В выводе команды должны появиться два устройства /dev/spidev0.0 и /dev/spidev0.1. Это будет означать, что вы достучались до девайса.

Установите зависимости для сборки:

sudo apt-get install git libpulse-dev libgtk-3-dev libasound2-dev libcurl4-openssl-dev libi2c-dev libgpiod-dev libusb-1.0-0-dev device-tree-compiler libfftw3-dev 

Сборка

Перейдите в домашнюю директорию:

cd ~ 

Клонируйте репозиторий проекта:

Зайдите в директорию Radioberry-2.x:

cd Radioberry-2.x

Запустите скачивание и установку всех необходимых подмодулей:

git submodule update —init —recursive —depth=1

Первая проблема — несовместимая библиотека libwdsp.so

Итак, для сборки вначале надо скопировать библиотеку WDSP в системную директорию. Приложение pihpsdr использует ее для всей цифровой обработки сигнала:

sudo cp ~/Radioberry-2.x/wdsp/libwdsp.so /usr/local/lib/

Файла там не оказалось. Моим первым (ошибочным) решением было скачать готовую библиотеку из стороннего репозитория:

wget https://github.com/g0orx/pihpsdr/raw/refs/heads/master/release/pihpsdr/libwdsp.so

sudo cp libwdsp.so /usr/local/lib/ 

sudo ldconfig 

Попытка сборки после этого закончилась типичной ошибкой линковки:

/usr/bin/ld: skipping incompatible /usr/local/lib/libwdsp.so when searching for -lwdsp /usr/bin/ld: cannot find -lwdsp: No such file or directory collect2: error: ld returned 1 exit status 

Если внимательно приглядеться к формулировке, то становится ясно, что линковщик видит файл, но пропускает как несовместимый. Причина в том, что библиотека собрана под x86_64, а мы работаем с aarch64. Готовых бинарников из чужих сборок много, и допустить эту ошибку оказалось проще простого.

Правильное решение — самостоятельная сборка библиотеки из исходников под конкретное железо:

cd /tmp

git clone —depth=1 https://github.com/g0orx/wdsp

cd wdsp

make -j$(nproc)

sudo make install

sudo ldconfig

Теперь проверьте, что получилось:

file /usr/local/lib/libwdsp.so

Должно выдать что-то вроде ELF 64-bit LSB shared object, ARM aarch64…

Теперь можно собирать pihpsdr из каталога проекта:

cd ~/Radioberry-2.x/pihpsdr

make clean

make CFLAGS=»-g -Wno-deprecated-declarations -I../wdsp» LDFLAGS=»-L../wdsp» -j$(nproc) 

Флаг -Wno-deprecated-declarations обязателен — код писался под старые версии GTK, и без него сборка упадет. Перед финальной установкой уточните, какая FPGA стоит на плате: CL016 или CL025:

sudo make install FPGATYPE=CL016

После завершения сборки запустим приложение и наткнемся на очередные (не последние) грабли.

Вторая проблема — pihpsdr не видит устройств

Первый запуск выглядел довольно эпично — pihpsdr отрисовал окно, построил планы FFTW, нашел аудиоустройства и запустил Discovery:

discover: looking for HPSDR devices on lo
discover: bound to lo discovery: bytes read -1
old_discovery: recvfrom socket failed for discover_receive_thread: Resource temporarily unavailable
discover: looking for HPSDR devices on usb0 …
discovery: found 0 devices

Плата физически подключена, синий огонек горит, SPI включен, /dev/spidev0.0 на месте, а вот софт ее в упор не видит. Программа ищет HPSDR-трансиверы по сети через UDP-запросы Discovery. Если ответа нет — вероятно, проблема на уровне Firmware. Демон должен был запустить эмуляцию HPSDR на интерфейсе loopback, но этого не произошло.

Проверяем модуль ядра:

lsmod | grep -i radioberry

В ответ тишина — модуля radioberry нет. На всякий случай еще заглядываем в dmesg:

dmesg | grep -i -E «radioberry|fpga|spi»

Пусто. Значит, модуль не загружен. Устанавливаем заголовки ядра:

sudo apt install raspberrypi-kernel-headers

ls /lib/modules/$(uname -r)/build && echo «headers OK»

Далее проверяем слой Driver и собираем недостающее:

cd ~/Radioberry-2.x/SBC/rpi-4/device_driver/driver

make

На выходе должно получиться два файла: radioberry.ko и radioberry.dtbo.  Тут стоит оговориться: модуль писали под старые ядра (4.x–5.x). На 6.12 он собрался без доработок, но, подозреваю, это скорее везение. В будущем, возможно, придется доставать напильник.

Скачиваем битстрим под FPGA. Готовые файлы лежат в репозитории, поэтому достаточно просто команды копирования. Тут я и сделал ошибку — не посмотрел маркировку FPGA, а воспользовался копипастой:

sudo cp ~/Radioberry-2.x/SBC/rpi-4/releases/stable/CL025/radioberry.rbf /lib/firmware/radioberry.rbf

Распределяем файлы по директориям. Держим в голове, что config.txt и overlays переехали из /boot/ в /boot/firmware/:

sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/sdr

sudo cp radioberry.ko /lib/modules/$(uname -r)/kernel/drivers/sdr/ 

sudo cp radioberry.dtbo /boot/firmware/overlays/ 

grep -Fxq «dtoverlay=radioberry» /boot/firmware/config.txt \ || echo «dtoverlay=radioberry» | sudo tee -a /boot/firmware/config.txt

sudo depmod

Теперь лечим слой Firmware-демона:

sudo apt-get install -y pigpio 

cd ~/Radioberry-2.x/SBC/rpi-4/device_driver/firmware 

make 

sudo cp radioberry /usr/local/bin/ 

sudo chmod +x /usr/local/bin/radioberry

Настраиваем автозапуск:

cd ~/Radioberry-2.x/SBC/rpi-4/device_driver/systemd

sudo cp radioberry.service /etc/systemd/system/

sudo cp radioberryd /etc/init.d/

sudo chmod +x /etc/init.d/radioberryd

Да, выглядит как странный гибрид systemd и старого init.d, но именно так устроен текущий сервис в репозитории Radioberry. Перечитываем список демонов и включаем сервис:

sudo systemctl daemon-reload

sudo systemctl enable radioberry

Перезагружаемся:

sudo reboot

Если вдруг после этого systemd выдаст ошибку Configuration file radioberry.service is marked executable , то выполните следующие две команды:

sudo chmod 644 /etc/systemd/system/radioberry.service

sudo systemctl daemon-reload

Проверка всех слоев перед запуском:

lsmod | grep radioberry

Модуль загружен.

ls -l /dev/radioberry

Устройство присутствует в системе.

dmesg | grep -i radioberry

Битстрим загружен в FPGA.

systemctl status radioberry

Демон в статусе active.

Правильный вывод dmesg выглядит примерно так:

radioberry_probe … Device property ‘rx-sample-gpio’ found!
Radioberry: registered correctly with major number 238
Radioberry gateware file size: 334039
inside radioberry_open function

Вот теперь пробуем запускать pihpsdr и видим: в Discovery появилось устройство. Победа или очередной сюрприз?

Третья проблема — подключение есть, водопада нет

Устройство вроде бы подключилось, окно открылось, но водопад отсутствует. Ползунки усиления не работают, в консоли pihpsdr идет поток ошибок:

old_protocol_init: num_hpsdr_receivers=2
metis_start_stop: 1
SEQ ERROR: last 71, recvd 74
SEQ ERROR: last 388, recvd 390
SEQ ERROR: last 230, recvd 260

Раньше в старом протоколе HPSDR у каждого пакета с данными был порядковый номер. Ошибки вида SEQ ERROR: last 71, recvd 74  означают, что пакеты потеряны: ожидали пакет после 71, а прилетел 74. Библиотека WDSP не может собрать непрерывный буфер и водопад остается пустым. Формально все работает, интерфейс отзывается, но данные — битые.

Признаться, на этом моменте я уже почти был готов сдаться. Причин могло быть несколько: от троттлинга самой RPI и неправильного питания до неверного количества приемников и sample rate. Перебрав все, что можно и нельзя, я пришел к единственной оставшейся версии — битстрим был залит не под ту версию FPGA.

Помните, я говорил, что есть два варианта? На моей плате оба чипа владелец заботливо прикрыл радиаторами, хотя они там вовсе не обязательны. Отклеил радиатор — а там не CL025, а CL016. Коварство в том, что FPGA без единой ошибки сожрал чужой битстрим: плата отвечала на Discovery, подключение устанавливалось, а внутри все шло не так.

Это самый неприятный тип ошибки в отладке — все вроде бы работает, а IQ-поток идет мусором с дырами. В итоге вылечилось тремя командами:

sudo systemctl stop radioberry

sudo cp ~/Radioberry-2.x/SBC/rpi-4/releases/stable/CL016/radioberry.rbf /lib/firmware/radioberry.rbf

sudo reboot

После ребута размер gateware в dmesg поменялся — прошивки CL016 и CL025 весят по-разному. Хороший способ проверить, что нужный файл встал на место и заработал.

dmesg | grep -i radioberry

Ошибки SEQ ERROR исчезли, водопад ожил и эфир пошел. Плата оказалась полностью рабочей — проблема была в программной части.

Выводы

Хотя этот опыт выдался непростым, он позволил сформулировать несколько полезных советов на будущее.

  • Не берите готовые бинарники из чужих сборок. Готовые .so и .ko могут оказаться собранными под другую архитектуру или ядро. Лучше потратить 15 минут на сборку из исходников, чем час на расшифровку ошибок линковщика.

  • Понимание архитектуры — ключ к успеху. Казалось бы, простая HAT-плата тянет за собой четыре программных уровня, и каждый должен работать как часы. Без этого отладка превращается в гадание.

  • Пути в Raspberry Pi OS изменились. В старых инструкциях все еще пишут про /boot, но на актуальной системе config.txt и overlays живут в /boot/firmware/. Не ленитесь проверять.

  • Всегда смотрите на маркировку чипов. Правильно собранный софт с неправильной прошивкой даст подключение, но не даст эфира. Если бы я сразу снял радиатор и проверил маркировку, то сэкономил бы пару часов.

Надеюсь, мой опыт поможет вам обойти все эти грабли и сэкономить время.

73

ссылка на оригинал статьи https://habr.com/ru/articles/1056976/