我正在尝试将linux驱动程序写入我拥有Windows驱动程序的设备(类似于此处描述的情况,但是设备不同)
我正在使用Libusb进行linux端的通信,而SourceUSB作为我的USB嗅探器(在windows机器上).现在我认为我已经正确地复制了控件和批量,但是我无法真正测试针对windows的linux日志.我正在VM上运行Ubuntu 12.04.
所以我的问题是:
编辑:我已经在Windows上编译了我的应用程序(libusb是跨平台的 - 非常感谢libusb开发人员做得很好)并且我的应用程序正常工作.
在Linux上运行我的应用程序时嗅探VM驱动程序时,我看到USB的请求为VENDOR_DEVICE而不是CONTROL_TRANSFER和BULK_OR_INTERRUPT.如果我理解正确,这似乎是问题,因为这是设备"看到"的内容.
所以我想我现在的问题是为什么Linux将我的请求作为供应商发送.
另一个编辑:问题解决了:
我在与简单 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 …
我想提取单芯片光学鼠标传感器(特别是 ADNS-2700)捕获的实际图像。与互联网上使用微控制器与成像芯片的 SPI 接口通信的各种其他教程(如下所示)不同,我尝试使用的芯片集成了 USB 接口。
我已经成功提取了以下示例中的按钮按下、速度和滚轮:
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) 我目前有一个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有关吗?
谢谢.
我正在编写的应用程序的一部分使用libusb与设备通信,我很难测试我的代码.是否有一个框架来创建虚假的USB设备或另一种模拟libusb的方法,以便更好地自动化测试,能够在CI上进行测试,重现边缘情况等?
我正在尝试使用 libusb-1.0 和 QtUsb 库进行 USB 设备访问。它是一个简单的批量设备,在我进行一些更新之前就可以工作。\n目前我使用
\n\nLinux 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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n我是否以用户或 root 身份运行并不重要,因为设备将被 udev 设置为组用户和权限 …
我正在尝试构建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) 假设我有一个仅使用热插拔 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 的代码:
#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,如何修复?
我正在使用 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 所有可能值的文档?