Linux 想要 libusb 基本示例
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4813764/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
libusb basic example wanted
提问by Vladimir
I'm writing user-space program that is intended to control some device via usb so I decided to use libusb (libusb-1.0) to send control messages to and receive responses from that device.
我正在编写旨在通过 USB 控制某些设备的用户空间程序,因此我决定使用 libusb (libusb-1.0) 向该设备发送控制消息并从该设备接收响应。
But I constantly receive the following bunch of errors from my code (even when it's executed using 'sudo'):
但是我不断从我的代码中收到以下一堆错误(即使它是使用“sudo”执行的):
USB error: could not set config 0: Device or resource busy
set configuration: failed
Check that you have permissions to write to 007/012 and, if you don't, that you set up hotplug (http://linux-hotplug.sourceforge.net/) correctly.
USB error: could not claim interface 0: Device or resource busy
claim interface: failed
USB error: error submitting URB: No such file or directory
bulk writing: failed
USB error: error submitting URB: No such file or directory
bulk reading: failed
response was:
The code is:
代码是:
usb_dev_handle* find_device ();
int
main (int argc, char *argv[])
{
usb_dev_handle* udev;
int status;
char request[] = "K1"; // 'ping' command used to check communication
char response[256];
udev = find_device ();
// udev is successfully found here
status = usb_set_configuration (udev, 0);
printf ("set configuration: %s\n", status ? "failed" : "passed");
status = usb_claim_interface (udev, 0);
printf ("claim interface: %s\n", status ? "failed" : "passed");
status = usb_bulk_write (udev, 3, request, sizeof (request), 500);
printf ("bulk writing: %s\n", status ? "failed" : "passed");
status = usb_bulk_read (udev, 2, response, sizeof (response), 500);
printf ("bulk reading: %s\n", status ? "failed" : "passed");
printf ("response was: %s\n", response);
usb_close (udev);
return 0;
}
What's wrong with the code? And how it could be fixed?
代码有什么问题?以及如何修复?
OS: Ubuntu 10.10
操作系统: Ubuntu 10.10
回答by AlwaysLearning
Don't you need to open() the device before you set its configuration and claim it?
在设置其配置并声明它之前,您不需要 open() 设备吗?
回答by Samuzzal Choudhury
Answering this question as I had faced this issue on the same OS and was able to solve in the following manner:
回答这个问题,因为我在同一操作系统上遇到过这个问题,并且能够通过以下方式解决:
Download and Compile the latest libusb source code 1.0.8.
下载并编译最新的 libusb 源代码 1.0.8。
Following are some API calls that I used in order to claim USB interface 0:
以下是我用于声明 USB 接口 0 的一些 API 调用:
libusb_init(NULL);
libusb_open_device_with_vid_pid(NULL, vendor_id, product_id);
libusb_detach_kernel_driver(devh, 0);
libusb_claim_interface(devh, 0);
libusb_close(devh);
libusb_exit(NULL);
Description of the variables in the above example:
上例中的变量说明:
static struct libusb_device_handle *devh = NULL;
uint16_t vendor_id;
uint16_t product_id;
To get the vendor ID and product ID, you may run the following commands (Ex. my device info)
要获取供应商 ID 和产品 ID,您可以运行以下命令(例如我的设备信息)
$ lsusb
...
Bus 001 Device 013: ID 0930:6544Toshiba Corp. Kingston DataTraveler 2.0 Stick (2GB)
...
$ lsusb
...
Bus 001 Device 013: ID 0930:6544Toshiba Corp. Kingston DataTraveler 2.0 Stick (2GB)
...
The bold colon delimited string contains vendor and product id respectively.
粗体冒号分隔的字符串分别包含供应商和产品 ID。
How to compile the code:
如何编译代码:
I used the following command to compile my code:
我使用以下命令来编译我的代码:
/bin/bash libtool --silent --tag=CC --mode=link g++ -Wall -Wundef -Wunused -Wshadow -D_DEBUG -I../libusb -g -O2 -o read read.cpp ../libusb/libusb-1.0.la -lusb-1.0 -lrt
/bin/bash libtool --silent --tag=CC --mode=link g++ -Wall -Wundef -Wunused -Wshadow -D_DEBUG -I../libusb -g -O2 -o read read.cpp ../libusb/ libusb-1.0.la -lusb-1.0 -lrt
Copy libtool to the compilation area from the extracted libusb-1.0.8 directory.
从解压出来的 libusb-1.0.8 目录中将 libtool 复制到编译区。
Hope this helps.
希望这可以帮助。
回答by Daniel McGrath
here's a generic example of a libusb program that you can adapt as needed.
这是一个 libusb 程序的通用示例,您可以根据需要对其进行调整。
also see the API, which is great!
另请参阅API,这很棒!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <libusb.h>
#include <err.h>
#define MFGR_ID 0 // given manufacturer ID
#define DEV_ID 0 // given device ID
/* If device IDs are not known, use libusb_get_device_list() to see a
list of all USB devices connected to the machine. Follow this call with
libusb_free_device_list() to free the allocated device list memory.
*/
int main() {
int init = libusb_init(NULL); // NULL is the default libusb_context
if (init < 0) {
errx(1,”\n\nERROR: Cannot Initialize libusb\n\n”);
}
struct libusb_device_handle *dh = NULL; // The device handle
dh = libusb_open_device_with_vid_pid(NULL,MFGR_ID,DEV_ID);
if (!dh) {
errx(1,”\n\nERROR: Cannot connect to device %d\n\n”,DEV_ID);
}
// set fields for the setup packet as needed
uint8_t bmReqType = 0; // the request type (direction of transfer)
uint8_t? bReq = 0; // the request field for this packet
uint16_t? wVal = 0; // the value field for this packet
uint16_t? wIndex = 0; // the index field for this packet
unsigned char*? data = ‘ ‘; // the data buffer for the in/output data
uint16_t? wLen = 0; // length of this setup packet
unsigned int? to?= 0; // timeout duration (if transfer fails)
// transfer the setup packet to the USB device
int config =
libusb_control_transfer(dh,bmReqType,bReq,wVal,wIndex,data,wLen,to);
if (config < 0) {
errx(1,”\n\nERROR: No data transmitted to device %d\n\n”,DEV_ID);
}
// now you can use libusb_bulk_transfer to send raw data to the device
libusb_exit(NULL);
}