本文主要是介绍How to Reset USB Device in Linux–using libusb,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文转载至:http://www.roman10.net/how-to-reset-usb-device-in-linuxusing-libusb/
This is a follow up of the previous entry How to Reset USB Device in Linux. The previous blog covers a method to reset usb device using ioctl system call. This blog gives an alternative approach to reset usb device, using libusb.
libusb is a cross-platform library giving user level application uniform access to usb devices. You’ll need to install the development package first. Simply typing the following commands to your terminal (using Ubuntu as an example),
sudo apt-get install libusb-1.0-0-dev
After installation, you can use the methods in libusb. Below is the C source code to reset usb device using libusb API,
#include <stdio.h>#include <stdlib.h>#include <libusb-1.0/libusb.h>//compile: gcc usbreset.c -o usbreset -lusb-1.0
//usage: ./usbreset 2 6
//use lsusb to check out the bus number and device number
struct libusb_device_handle *devh;
struct libusb_device *dev;
struct libusb_device **devs;
void resetUSB() {
int success;
int bpoint = 0;
do {
success = libusb_reset_device(devh);if ((bpoint % 10) == 0) {
printf(".");}++bpoint;if (bpoint > 100) {
success = 1;}} while (success < 0);
if (success) {
printf("\nreset usb device failed:%d\n", success);} else {
printf("\nreset usb device ok\n");}}struct libusb_device* search_device(int _busNum, int _devNum) {libusb_device *l_dev;int i = 0;
int l_busNum, l_devNum;
while ((l_dev = devs[i++]) != NULL) {
printf("check against %d device\n", i);l_busNum =(int) libusb_get_bus_number(l_dev);
l_devNum =(int) libusb_get_device_address(l_dev);
printf("bus number: %d; device number: %d\n", l_busNum, l_devNum);if ((l_busNum == _busNum) && (l_devNum == _devNum)) {
printf("found device\n");return l_dev;
}}return NULL;
}int main(int argc, char **argv) {//parse the input parameters to get the bus number and device number
int l_busNum, l_devNum;
int l_ret;
printf("program started!\n");if (argc < 3) {
printf("not enough arguments!\n");printf("usage: ./usbreset <bus number> <dev number>\n");return 0;
}printf("bus number: %s\n", argv[1]);printf("dev number: %s\n", argv[2]);l_busNum = atoi(argv[1]);
l_devNum = atoi(argv[2]);
printf("bus number: %d; dev number: %d\n", l_busNum, l_devNum);l_ret = libusb_init(NULL);if (l_ret < 0) {
return l_ret;
}l_ret = libusb_get_device_list(NULL, &devs);if (l_ret < 0) {
return (int) l_ret;}dev = search_device(l_busNum, l_devNum);if (dev == NULL) {
printf("device not found\n");return 0;
}l_ret = libusb_open(dev, &devh);if (l_ret == 0) {
printf("got the usb handle successfully.\n");} else {
printf("error getting usb handle.\n");}//reset the usb device
resetUSB();//free the device list
libusb_free_device_list(devs, 1);libusb_exit(NULL);return 0;
}The code can be compiled using
gcc usbreset.c -o usbreset -lusb-1.0To use the complied program usbreset, you can simply use,
sudo ./usbreset <bus number> <device number>To check the bus number and device number of a usb device, you can use lsusb command.
To check if a device is resetted or not, you can use tail -f /var/log/messages.
An detailed example is given in How to Reset USB Device.
这篇关于How to Reset USB Device in Linux–using libusb的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!