转载How to Reset USB Device in Linux

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转载How to Reset USB Device in Linux相关的知识,希望对你有一定的参考价值。

USB devices are anywhere nowadays, even many embedded devices replace the traditional serial devices with usb devices. However, I experienced that USB devices hang from time to time. In most cases, a manual unplug and replug will solve the issue. Actually, usb reset can simulate the unplug and replug operation.

First, get the device path for your usb device. Enter the command lsusb will give you something similar as below,

Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 002: ID 04b3:310c IBM Corp. Wheel Mouse
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 002: ID 0a5c:2145 Broadcom Corp.
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Use the IBM Wheel Mouse as an example, the device node for it is /dev/bus/usb/006/002, where 006 is the bus number, and 002 is the device number.

Second, apply ioctl operation to reset the device. This is done in C code,

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>

void main(int argc, char **argv)
{
	const char *filename;
	int fd;

	filename = argv[1];
	fd = open(filename, O_WRONLY);
	ioctl(fd, USBDEVFS_RESET, 0);
	close(fd);
	return;
}

Save the code above as reset.c, then compile the code using

gcc -o reset reset.c
 

This will produce the a binary named reset. Again, using the wheel mouse as an example, execute the following commands,

sudo ./reset /dev/bus/usb/006/002
 

You can take a look at the message by,

tail -f /var/log/messages
 

On my Ubuntu desktop, the last line reads,

May 4 16:09:17 roman10 kernel: [ 1663.013118] usb 6-2:
reset low speed USB device using uhci_hcd and address 2
 

This reset operation is effectively the same as you unplug and replug a usb device.

For another method of reset usb using libusb, please refer here

Reference: http://forums.x-plane.org/index.php?app=downloads&showfile=9485.

ubuntu下不用拔盘就可以重新识别usb设备

#!/bin/sh
# Usage: ./resetusb ARGUMENT(The keyword for your usb device)

var1=$1
keyword=${var1:=Storage}

debug=$(lsusb)
bus=$(lsusb|grep $keyword|perl -nE "/\\D+(\\d+)\\D+(\\d+).+/; print qq(\\$1)")
device=$(lsusb|grep $keyword|perl -nE "/\\D+(\\d+)\\D+(\\d+).+/; print qq(\\$2)")

echo "/* usbreset -- send a USB port reset to a USB device */

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/ioctl.h>

#include <linux/usbdevice_fs.h>


int main(int argc, char **argv)
{
const char *filename;
int fd;
int rc;

if (argc != 2) {
return 1;
}
filename = argv[1];

fd = open(filename, O_WRONLY);
if (fd < 0) {
return 1;
}

rc = ioctl(fd, USBDEVFS_RESET, 0);
if (rc < 0) {
return 1;
}

close(fd);
return 0;
}" > /tmp/usbreset.c

$(cc /tmp/usbreset.c -o /tmp/usbreset)
$(chmod +x /tmp/usbreset)
$(cd /tmp/;./usbreset /dev/bus/usb/$bus/$device)
result=$?
if [ $result != 0 ];then
echo "Reset Usb Failed!"
echo "Please make sure you have inputted right device keyword: $keyword"
echo "You have chose bus:${bus:=Not Found},device:${device:=Not Found}"
echo "More info:\\n$debug"
else
echo "Reset Usb $keyword Successfully!"
fi

以上是关于转载How to Reset USB Device in Linux的主要内容,如果未能解决你的问题,请参考以下文章

HOW TO USE SCANIA XCOM RESET AN ECU

How to reset XiaoMi bluetooth headphone Youth edition.

How to reset LCM module of BMW E60 2006?

sh 来自http://stackoverflow.com/questions/17667023/git-how-to-reset-origin-master-to-a-commit

How to reset Nissan 350Z SRS light on after replacing clock spring?

sql 来自http://stackoverflow.com/questions/8923114/how-to-reset-auto-increment-in-mysql