标签: libusb

将驱动程序转换为Linux

我正在尝试将linux驱动程序写入我拥有Windows驱动程序的设备(类似于此处描述的情况,但是设备不同)

我正在使用Libusb进行linux端的通信,而SourceUSB作为我的USB嗅探器(在windows机器上).现在我认为我已经正确地复制了控件和批量,但是我无法真正测试针对windows的linux日志.我正在VM上运行Ubuntu 12.04.

所以我的问题是:

  1. 有多平台记录器吗?这可以真正简化日志比较过程.
  2. 当我将USB设备连接到VM时 - 我在Windows中获得了VM驱动程序.嗅探这个设备可以准确地告诉我设备看到了什么,对吧?我的意思是 - 这是我想要嗅闻的地方吗?

编辑:我已经在Windows上编译了我的应用程序(libusb是跨平台的 - 非常感谢libusb开发人员做得很好)并且我的应用程序正常工作.

在Linux上运行我的应用程序时嗅探VM驱动程序时,我看到USB的请求为VENDOR_DEVICE而不是CONTROL_TRANSFER和BULK_OR_INTERRUPT.如果我理解正确,这似乎是问题,因为这是设备"看到"的内容.

所以我想我现在的问题是为什么Linux将我的请求作为供应商发送.

另一个编辑:问题解决了:

  1. 听VM驱动程序给了我错误的请求(我正在听VM驱动器流量,而不是我想要的,我的USB linux驱动程序的流量
  2. Libusb完全是多平台的.我花了几分钟时间让我的代码在windows下编译,从那里调试和比较日志非常容易

linux usb driver libusb

5
推荐指数
1
解决办法
1689
查看次数

LibUSBDotNet:使用 USB 设备一段时间后出现奇怪的错误

我在与简单 USB 设备通信的 WPF 应用程序中使用 LibUSBDotNet 库。我只向设备发送 3 个字节作为命令,没有预期的响应,我的代码就像一个魅力:

MyUsbFinder = new UsbDeviceFinder(vid, pid);
MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
wholeUsbDevice = MyUsbDevice as IUsbDevice;
if (!ReferenceEquals(wholeUsbDevice, null))
{
    wholeUsbDevice.SetConfiguration(1);
    wholeUsbDevice.ClaimInterface(0);
}

writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);
Run Code Online (Sandbox Code Playgroud)

然后是写入设备的过程:

byte[] update = { 0x21, some_code_generated_byte, some_code_generated_byte };
int bytesWritten;

if (MyUsbDevice != null)
{
     ec = writer.Write(update, 2000, out bytesWritten);
}
Run Code Online (Sandbox Code Playgroud)

我对使用 USB 还比较陌生,但到目前为止我已经掌握了一切,而且一切正常。但是,一段时间后,在尝试再次写入设备时,我会时不时地遇到以下两个错误之一:

Win32Error:GetOverlappedResult Ep 0x01
31:The parameter is incorrect.

Win32Error:PipeTransferSubmit Ep 0x01
87:The parameter is incorrect.
Run Code Online (Sandbox Code Playgroud)

通常我需要重新启动设备/应用程序几次,然后它才能再次开始工作,然后在它再次发生之前又像魅力一样工作了几个小时......到目前为止,我也无法在测试环境中复制崩溃.

我做了很多研究,试图找到与我类似的问题/解决方案,但没有成功。我留下的唯一建议是,在某些时候设备没有足够的电量,它会进入这种错误模式,但即使这样似乎也不太可能,因为它有一个单独的 12V 电源,它所做的只是打开和关闭几个继电器...

我还尝试用大量连续命令一个接一个地淹没设备,包括垃圾命令,但它仍然可以正常工作并且行为正常,只是稍后会崩溃。

欢迎任何建议或想法,谢谢!

编辑:经过多次尝试后,我仍然无法确定问题的根本原因,但我设法达到了代码正常工作的程度,并且能够使用尝试重置设备的重新连接功能从 OverlappedResult …

c# wpf usb libusb libusbdotnet

5
推荐指数
1
解决办法
4328
查看次数

通过 pyusb 从 USB 鼠标(单芯片,ADNS-2700)获取图像

我想提取单芯片光学鼠标传感器(特别是 ADNS-2700)捕获的实际图像。与互联网上使用微控制器与成像芯片的 SPI 接口通信的各种其他教程(如下所示)不同,我尝试使用的芯片集成了 USB 接口。

ADNS-2700 数据表

系统:Windows 7、Python2.7、PyUSB 1.0

我已经成功提取了以下示例中的按钮按下、速度和滚轮:

import usb.core
import usb.util

VENDOR_ID = 6447
PRODUCT_ID = 2326

# find the USB device
device = usb.core.find(idVendor=VENDOR_ID,
                       idProduct=PRODUCT_ID)

# use the first/default configuration
device.set_configuration()

# first endpoint
endpoint = device[0][(0,0)][0]

# read a data packet
attempts = 10
data = None
while attempts > 0:
    try:
        data = device.read(endpoint.bEndpointAddress,
                           endpoint.wMaxPacketSize)
        print data

    except usb.core.USBError as e:
        data = None
        if e.args == ('Operation timed …
Run Code Online (Sandbox Code Playgroud)

python usb libusb pyusb

5
推荐指数
1
解决办法
3407
查看次数

Android L 5.0和libusb 1.0.9 - 没有权限?

我目前有一个Android应用程序通过USB OTG连接到设备.使用libusb 1.0.9进行通信,并且它对api级别<21的其他设备运行良好.(由于性能问题,通信必须是原生的)在Android L下运行应用程序时,我从libusb_init收到以下错误(空值):

type=1400 audit(0.0:107): avc: denied { read } for name="usb" dev="tmpfs" ino=24433 scontext=u:r:untrusted_app:s0 tcontext=u: object_r:usb_device:s0 tclass=dir
A/libc(12605): Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 12605 (mapp.sdk.sample)
Run Code Online (Sandbox Code Playgroud)

我正在使用我的Nexus 5上的最新NDK 10c编译libusb 1.0.9.我不认为这是ART运行时问题,因为该应用程序适用于Android 4.4.4,启用ART而不是Dalvik.有谁熟悉这个问题?(看起来很相似)这可能与PIE有关吗?

谢谢.

java android libusb android-ndk

5
推荐指数
1
解决办法
2075
查看次数

使用libusb测试应用程序而不使用真正的硬件

我正在编写的应用程序的一部分使用libusb与设备通信,我很难测试我的代码.是否有一个框架来创建虚假的USB设备或另一种模拟libusb的方法,以便更好地自动化测试,能够在CI上进行测试,重现边缘情况等?

testing libusb

5
推荐指数
1
解决办法
290
查看次数

libusb 无法声明设备

我正在尝试使用 libusb-1.0 和 QtUsb 库进行 USB 设备访问。它是一个简单的批量设备,在我进行一些更新之前就可以工作。\n目前我使用

\n\n
Linux nadhh.fritz.box 4.11.8-200.fc25.x86_64 #1 SMP Thu Jun 29 16:13:56 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux\n
Run Code Online (Sandbox Code Playgroud)\n\n

我以用户或 root 身份运行并不重要,因为设备将被 udev 设置为组用户和权限 666

\n\n
[timestamp] [threadID] facility level [function call] <message>\n--------------------------------------------------------------------------------\n[ 0.012281] [00000fc6] libusb: error [op_get_configuration] device unconfigured\nType:1, cat:default, file:../src/qlibusb.cpp, line:114, f:virtual qint32 QUsbDevice::open(), msg:Cannot Claim Interface\nType:1, cat:default, file:../src/qlibusb.cpp, line:168, f:void QUsbDevice::printUsbError(int), msg:libusb Error: Entity not found\n[ 0.951403] [00000fc6] libusb: warning [libusb_exit] application left some devices open\n
Run Code Online (Sandbox Code Playgroud)\n\n

我是否以用户或 root 身份运行并不重要,因为设备将被 udev 设置为组用户和权限 …

linux usb libusb

5
推荐指数
1
解决办法
7247
查看次数

我如何告诉 CMake 在哪里可以找到 libusb?

我正在尝试构建logger1 ,它通过ElasticFusion从 Kinect 收集数据以进行离线 SLAM 。我正在 Windows 上构建。我正在尝试使用 VS10 构建 x64(我也有 VS12,但一些依赖项已预先配置到 VS10,因此为了简单起见,我正在使用它。)我正在使用 CMake 3.9.0。

我已经解决了大部分依赖关系,但 libusb 给我带来了麻烦。

我从 CMake 得到以下输出:

...
Checking for module 'libusb-1.0'
  No package 'libusb-1.0' found
CMake Error at C:/Program Files/CMake/share/cmake-3.9/Modules/FindPkgConfig.cmake:412 (message):
  A required package was not found
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.9/Modules/FindPkgConfig.cmake:588 (_pkg_check_modules_internal)
  CMakeLists.txt:12 (pkg_check_modules)
Run Code Online (Sandbox Code Playgroud)

通常,此时 CMake GUI 会以红色显示一些包含和库路径的新配置变量,以及一些非功能性默认值,例如ZLIB_INCLUDE_DIR-NOTFOUND我必须更改为实际路径并重新运行配置。

但是,在 的情况下libusb-1.0,GUI 中没有给我任何新的配置变量。我勾选了“高级”复选框,但所需的变量仍然没有显示。

我已经下载了一个预建的libusb-1.0.21,但是CMake不可避免地找不到它;这不是 *nix,其中库路径定义良好。我在文件服务器上有自己的目录结构来处理这些事情,所以 CMake 绝对无法找到东西,除非它询问我它们在哪里,但在本例中它没有这样做。

经过一番摸索,我在 Logger1's 中找到了一些参考资料CMakeLists.txt,如下:

find_package(PkgConfig)
pkg_check_modules(libusb-1.0 REQUIRED libusb-1.0) …
Run Code Online (Sandbox Code Playgroud)

cmake libusb cmake-gui

5
推荐指数
1
解决办法
6867
查看次数

如何强制 libusb 事件以便 libusb_handle_events() 返回

假设我有一个仅使用热插拔 API 的 libusb 程序。您注册了一个回调,然后显然必须libusb_handle_events()在循环中调用,然后调用您的热插拔回调。

int LIBUSB_CALL hotplugCallback(libusb_context* ctx,
                                libusb_device* device,
                                libusb_hotplug_event event,
                                void* user_data)
{
    cout << "Device plugged in or unplugged";
}

void main()
{
    libusb_init(nullptr);

    libusb_hotplug_register_callback(nullptr,
                                    static_cast<libusb_hotplug_event>(LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT),
                                    LIBUSB_HOTPLUG_NO_FLAGS,
                                    LIBUSB_HOTPLUG_MATCH_ANY,
                                    LIBUSB_HOTPLUG_MATCH_ANY,
                                    LIBUSB_HOTPLUG_MATCH_ANY,
                                    &hotplugCallback,
                                    this,
                                    &hotplugCallbackHandle);

    for (;;)
    {
        if (libusb_handle_events_completed(nullptr, nullptr) != LIBUSB_SUCCESS)
            return 1;
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果没有超时黑客,我怎样才能干净地退出这个事件循环?我找不到任何强制libusb_handle_events()(或libusb_handle_events_completed()) 返回的函数。理论上他们永远不会回来。

libusb

5
推荐指数
1
解决办法
3654
查看次数

gcc - 对“libusb_init”的未定义引用

我正在尝试编译一段使用 libusb 的代码:

#include <stdio.h>
#include <libusb-1.0/libusb.h>
#include <assert.h>

int main(void) {
    libusb_context *context = NULL;
    int rc = 0;

    rc = libusb_init(&context);
    assert(rc == 0);

    libusb_exit(context);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译后gcc -lusb -lusb-1.0 sample.c -o sample出现以下错误:

/tmp/ccr65JBT.o: In function `main':
sample.c:(.text+0x2e): undefined reference to `libusb_init'
sample.c:(.text+0x62): undefined reference to `libusb_exit'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

为了确保 libusb 在我的系统上可用:

raven@enforcer:~/sample$ pkg-config --libs libusb-1.0
-lusb-1.0
raven@enforcer:~/sample$ pkg-config --libs libusb
-lusb
Run Code Online (Sandbox Code Playgroud)

我正在运行带有 gcc 7.3.0-16ubuntu3 的 Ubuntu 18.04,如何修复?

c gcc libusb libusb-1.0

5
推荐指数
1
解决办法
7281
查看次数

libusb 设备描述符:bcdUSB 可能值

我正在使用 libusb-1.0 开发一个 C 应用程序。我想获取一些与USB设备相关的配置参数。我的问题与 bcdUSB 参数有关。我的代码如下:

libusb_device *dev;
struct libusb_device_descriptor desc;

....

ret = libusb_get_device_descriptor(dev, &desc);

if (ret<0) {
    fprintf(stderr, "error in getting device descriptor\n");
    return 1;
}

printf("bcdUSB: %04x\n", desc.bcdUSB);
Run Code Online (Sandbox Code Playgroud)

对于某些设备,我得到 0401 值:

bcdUSB: 0401
Run Code Online (Sandbox Code Playgroud)

我不明白这个值的具体含义是什么。

在libusb代码中,我在libusb_device_descriptor结构代码中找到了这个注释:

/** USB specification release number in binary-coded decimal. A value of
 * 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. */
uint16_t bcdUSB;
Run Code Online (Sandbox Code Playgroud)

它仅指定 0200 和 0110 值的含义。是否有包含 0401 在内的 bcdUSB 所有可能值的文档?

c linux usb libusb libusb-1.0

5
推荐指数
1
解决办法
3995
查看次数

标签 统计

libusb ×10

usb ×5

linux ×3

c ×2

libusb-1.0 ×2

android ×1

android-ndk ×1

c# ×1

cmake ×1

cmake-gui ×1

driver ×1

gcc ×1

java ×1

libusbdotnet ×1

python ×1

pyusb ×1

testing ×1

wpf ×1