Сбой rtl-sdr с "ошибкой шины" при запуске rtl_tcp или rtl_test

У меня подключен SDR-ключ на Raspberry Pi 3 под управлением Kali Linux Arm64. СДР сама является этой конкретной моделью

Проблема в том, что когда я подключаюсь к rtl_tcp сервер удаленно, он выходит:

rtl_tcp -a 192.168.200.132
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
Tuned to 100000000 Hz.
listening...
Use the device argument 'rtl_tcp=192.168.200.132:1234' in OsmoSDR (gr-osmosdr) source
to receive samples in GRC and control rtl_tcp parameters (frequency, gain, ...).
client accepted! 192.168.200.102 64098
Allocating 15 zero-copy buffers
Bus error

Тестирование с rtl_test -t Это хорошо:

rtl_test -t
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6
[R82XX] PLL not locked!
Sampling at 2048000 S/s.
No E4000 tuner found, aborting.

Но тестирование с частотой дискретизации приводит к тому же нежелательному поведению.

rtl_test -s 2048000
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6
[R82XX] PLL not locked!
Sampling at 2048000 S/s.

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in async mode...
Allocating 15 zero-copy buffers
Bus error

Как мне предотвратить это и заставить RTL-SDR работать должным образом?

Вещи, которые я пробовал

Без изменений:

  1. Я использовал RTL-SDR в репозиториях Kali, а также скомпилировал из исходного кода, используя git.osmocom.org/rtl-sdr.git репо - без изменений
  2. Увеличен размер файла подкачки до 2 ГБ - без изменений

Некоторые изменения:

Принудительный синхронный режим в rtl_test не выдал ошибку.

rtl_test -s 2048000 -S
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6
[R82XX] PLL not locked!
Sampling at 2048000 S/s.

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in sync mode...
(Samples are being lost but not reported.)

Представляя b флаг в rtl_tcp позволяет мне установить количество буферов, которые, кажется, не делают много:

rtl_tcp -a 192.168.200.132 -b 1
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
Tuned to 100000000 Hz.
listening...
Use the device argument 'rtl_tcp=192.168.200.132:1234' in OsmoSDR (gr-osmosdr) source
to receive samples in GRC and control rtl_tcp parameters (frequency, gain, ...).
client accepted!
Allocating 1 zero-copy buffers
Bus error

2 ответа

Я до сих пор не уверен, в чем проблема, но, основываясь на указании, которое дал мне @jsr, я пошел дальше и удалил zerocopy код и перекомпилирован rtl-sdr и это сработало.

Вот разница. Это, вероятно, ошибка в программе, и ее необходимо устранить.

diff --git a/src/librtlsdr.c b/src/librtlsdr.c
index 89ec903..61bcebc 100644
--- a/src/librtlsdr.c
+++ b/src/librtlsdr.c
@@ -1748,50 +1748,6 @@ static int _rtlsdr_alloc_async_buffers(rtlsdr_dev_t *dev)
        dev->xfer_buf = malloc(dev->xfer_buf_num * sizeof(unsigned char *));
        memset(dev->xfer_buf, 0, dev->xfer_buf_num * sizeof(unsigned char *));

-#if defined (__linux__) && LIBUSB_API_VERSION >= 0x01000105
-       fprintf(stderr, "Allocating %d zero-copy buffers\n", dev->xfer_buf_num);
-
-       dev->use_zerocopy = 1;
-       for (i = 0; i < dev->xfer_buf_num; ++i) {
-               dev->xfer_buf[i] = libusb_dev_mem_alloc(dev->devh, dev->xfer_buf_len);
-
-               if (dev->xfer_buf[i]) {
-                       /* Check if Kernel usbfs mmap() bug is present: if the
-                        * mapping is correct, the buffers point to memory that
-                        * was memset to 0 by the Kernel, otherwise, they point
-                        * to random memory. We check if the buffers are zeroed
-                        * and otherwise fall back to buffers in userspace.
-                        */
-                       if (dev->xfer_buf[i][0] || memcmp(dev->xfer_buf[i],
-                                                         dev->xfer_buf[i] + 1,
-                                                         dev->xfer_buf_len - 1)) {
-                               fprintf(stderr, "Detected Kernel usbfs mmap() "
-                                               "bug, falling back to buffers "
-                                               "in userspace\n");
-                               dev->use_zerocopy = 0;
-                               break;
-                       }
-               } else {
-                       fprintf(stderr, "Failed to allocate zero-copy "
-                                       "buffer for transfer %d\nFalling "
-                                       "back to buffers in userspace\n", i);
-                       dev->use_zerocopy = 0;
-                       break;
-               }
-       }
-
-       /* zero-copy buffer allocation failed (partially or completely)
-        * we need to free the buffers again if already allocated */
-       if (!dev->use_zerocopy) {
-               for (i = 0; i < dev->xfer_buf_num; ++i) {
-                       if (dev->xfer_buf[i])
-                               libusb_dev_mem_free(dev->devh,
-                                                   dev->xfer_buf[i],
-                                                   dev->xfer_buf_len);
-               }
-       }
-#endif
-
        /* no zero-copy available, allocate buffers in userspace */
        if (!dev->use_zerocopy) {
                for (i = 0; i < dev->xfer_buf_num; ++i) {

После перекомпиляции программа работала как положено:

~/sandbox/rtl-sdr# rtl_tcp -a 192.168.200.132 -f 89000 -b 100
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
[R82XX] PLL not locked!
[R82XX] PLL not locked!
Tuned to 89000 Hz.
listening...
Use the device argument 'rtl_tcp=192.168.200.132:1234' in OsmoSDR (gr-osmosdr) source
to receive samples in GRC and control rtl_tcp parameters (frequency, gain, ...).
client accepted!
set gain mode 1
set agc mode 0
set direct sampling 0
Disabled direct sampling mode
[R82XX] PLL not locked!
set offset tuning 0
set bias tee 0
set sample rate 1800000
[R82XX] PLL not locked!
ll+, now 1
set freq 24000000
set gain 495
ll+, now 2
set gain 495
set gain 495
set freq 106661000
ll+, now 3
ll+, now 4
ll+, now 5
ll+, now 6

Я не знаю, смогу ли я ответить на вопрос полностью, но у меня возникли похожие ошибки при отладке устройства USB3. Похоже, проблема возникла не потому, что USB3 не поддерживается (это был адаптер USB3), а потому, что драйвер карты не смог выделить достаточную полосу пропускания объединительной платы для динамического выделения конкретного канала USB.

Я не очень знаком с RPi - вы пытаетесь направить захват через USB-Ethernet/Wifi ключ? Если не считать USB3, мне интересно, если это похоже на проблему с динамическим распределением пропускной способности.

- Некоторое время назад сообщалось о том, что связано с буферным кодом нулевой копии: https://www.mail-archive.com/osmocom-sdr@lists.osmocom.org/msg01204.html из описания, которое он отображает в другой способ, а также был применен обходной путь.

Другие вопросы по тегам