Software defined radio rtl sdr崩溃,带有“错误”;总线错误“;运行rtl_tcp或rtl_测试时

Software defined radio rtl sdr崩溃,带有“错误”;总线错误“;运行rtl_tcp或rtl_测试时,software-defined-radio,rtl-sdr,Software Defined Radio,Rtl Sdr,我在运行Kali Linux Arm64的Raspberry Pi 3上连接了一个SDR加密狗。特别提款权本身就是这样 问题是,每当我远程连接到rtl\u 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

我在运行Kali Linux Arm64的Raspberry Pi 3上连接了一个SDR加密狗。特别提款权本身就是这样

问题是,每当我远程连接到
rtl\u 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_测试-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
我如何防止这种情况发生,并正常运行

我尝试过的事情 无变化:

  • 我在Kali的回购协议中使用了RTL-SDR,并且使用
    git.osmocom.org/RTL-SDR.git
    repo-no change从源代码处编译
  • 将交换文件大小增加到2 GB-无更改
  • 一些变化:

    rtl\u测试中强制同步模式不会产生错误

    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.)
    
    通过在
    rtl\u tcp
    中引入
    b
    标志,我可以设置缓冲区的数量,这似乎没什么作用:

    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
    

    我不知道我是否能完全回答这个问题,但我在调试USB3设备时也遇到过类似的错误。出现问题似乎不是因为不支持USB3(它是USB3适配器),而是因为卡驱动程序无法分配足够的背板带宽来动态分配特定的USB管道

    我对RPi不太熟悉-您是否试图通过USB以太网/Wifi加密狗将捕获路由出去?撇开USB3不谈,我想知道这是否是类似的动态带宽分配问题


    --不久前报告了与零拷贝缓冲区代码有关的内容:根据描述,它以不同的方式显示,并应用了一种解决方法。

    我仍然不确定问题出在哪里,但根据@jsr给我的指示,我继续,删除了
    zerocopy
    代码,重新编译了
    rtlsdr
    ,它成功了

    这里有一个区别。这可能是程序中的一个bug,需要解决

    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) {
    

    讨论中的设备是USB2上的RTL-SDR,我正在尝试将捕获路由到以太网端口。但是,似乎错误是在捕获阶段抛出的,因为
    rtl_test
    只是捕获和转储数据。此外,更改缓冲区的数量也无助于解决问题。我用一个例子更新了这个问题。也许我应该试着注释你链接的电子邮件中的代码。USB2和USB3都会动态分配数据管道,作为USB协议栈的一部分,具有一些前端带宽-这可能会在底层USB硬件驱动程序中失败,这取决于一系列的情况,并且从内存中,我看到其中一个没有足够的PCI(背板)带宽-换言之,它一直依赖于当前的硬件状态。我认为libusb可以通过启用调试标志来编译,以获得更多信息。我最终进入内核源代码xhci,以了解最终发生了什么。删除zerocopy代码对我来说很有效!我认为这是一个bug,需要解决。
    ~/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