ADALM-PLUTO:
«Основанный на AD9363, он предлагает один канал приёма и один канал передачи, которые могут работать в полнодуплексном режиме, способен генерировать или измерять аналоговые радиочастотные сигналы от 325 до 3800 МГц со скоростью до 61,44 мегавыборок в секунду...»
Способен — но недолго. Интерфейс связи USB 2.0 позволяет непрерывно получать (или передавать) только 7,5 мегавыборок в секунду, или 3,2 — при полнодуплексной работе.
Часть полосы занимает тяжеловесный промышленный интерфейс IIO.
Возникает идея обойти IIO, и это уже сделано:
https://github.com/pgreenland/pluto-sdr-usb-gadget
Предложенный метод добавляет новое устройство USB gadget и увеличивает скорость до 10 мегавыборок в секунду — это уже достойно внимания.Однако для этого требуется прошивка, отличная от оригинальной. При выходе новой версии официальной прошивки потребуется её повторная перекомпиляция.
В данной статье предлагается метод перезапуска USB gadget с помощью загружаемого модуля ядра, который можно применять непосредственно из создаваемой программы.
PlutoSDR — это автономная радиочастотная лаборатория в ваших руках.
То есть, устройство содержит ARM-процессор и ОС Linux.
Позволяет загружать программы по SSH и выполнять их непосредственно (хотя и ограниченно, из-за слабого CPU) на самом устройстве.
Обход IIO через libusb-1.0
Мы можем загрузить на устройство сценарии запуска модуля ядра и сам модуль из проекта выше, а затем использовать передачу данных через стандартную библиотеку libusb-1.0
, в обход IIO.
Подготовка
Соберите модуль ядра из проекта:
https://github.com/pgreenland/pluto-sdr-usb-gadget-
Скачайте файл конфигурации USB gadget из прошивки:
https://github.com/pgreenland/plutosdr-buildroot/blob/.../S23udcВ этом файле уже указан нужный модуль ядра:
SDR_USB_GADGET_OPTS="/dev/sdr_gadget_ffs"
Переименуйте этот скрипт в
S24udc
.
Сценарий перезапуска USB gadget
#!/bin/bash
rm /etc/init.d/S23udc
/etc/init.d/rcK
sleep 0.5
/etc/init.d/rcS
Назовите файл, например, runme.sh
.
Скрипт удаляет S23udc
, выполняет rcK
(завершает все процессы USB gadget), затем запускает все S*udc
, включая наш S24udc
.
Загрузка на устройство по SSH
#!/bin/bash
INPUT=$1
# create askpass.sh script
cat > askpass.sh <<EOF
echo -n analog
EOF
chmod 0755 askpass.sh
# copy sdr_usb_gadget
env SSH_ASKPASS=./askpass.sh SSH_ASKPASS_REQUIRE=force \
scp -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null \
./sdr_usb_gadget root@$INPUT:/usr/sbin
sleep 0.1
# copy S24udc
env SSH_ASKPASS=./askpass.sh SSH_ASKPASS_REQUIRE=force \
scp -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null \
./S24udc root@$INPUT:/etc/init.d
sleep 0.1
# copy runme.sh
env SSH_ASKPASS=./askpass.sh SSH_ASKPASS_REQUIRE=force \
scp -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null \
./runme.sh root@$INPUT:/tmp
sleep 0.1
# run script on device
env SSH_ASKPASS=./askpass.sh SSH_ASKPASS_REQUIRE=force \
ssh -t root@$INPUT \
-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null \
/tmp/runme.sh
Сценарий создаёт askpass.sh
, который возвращает пароль analog
— он используется по умолчанию на устройстве.
Используются переменные SSH_ASKPASS
и SSH_ASKPASS_REQUIRE=force
для автоматического ввода пароля.
Файлы копируются в нужные каталоги устройства, а затем выполняется скрипт runme.sh
.
Итог
Устройство готово к работе через libusb-1.0
.
Сценарий запускается на ПК с Linux. Для Windows потребуется создать аналогичный .bat
или .cmd
файл.
При запуске программы все подготовленные файлы можно упаковать в её ресурсы. После распаковки вызывается последний скрипт как отдельный процесс, ожидается его завершение, затем выполняется очистка.
Использование libusb-1.0
совместно с IIO можно посмотреть в проекте:
https://github.com/pgreenland/SoapyPlutoSDR/tree/master
После выключения устройства при следующем включении будет загружена оригинальная прошивка. Её можно будет обновлять без дополнительных действий.