Resetting usb ports linux

C — how can i reset the USB Bus under linux?

Daily—about 5 to 10 times—my USB camera disappears from the system. It’s been happening from day 1 because the manufacturer driver is not compatible with Linux. lsusb and dmesg show it correctly at first, but after a longer period of time sometimes it disappears. The best solution to fix it is to reset the USB interface for that camera to get it back. I did it a few times manually using the C source code and it worked, but when I am doing it in a Bash loop it seems it’s failing over and over. Any idea? How can I make both programs work, so that I get my /dev/video0 or 1 or 2 always available? Step 1: Resetting the USB bus under Linux using this code:

/* few times it's resetting but when I use it in a Bash loop it's not doing it */ #include #include int main(int argc, char *argv[]) < struct usb_bus *busses; usb_init(); usb_find_busses(); usb_find_devices(); busses = usb_get_busses(); struct usb_bus *bus; int c, i, a; for (bus = busses; bus; bus = bus->next) < struct usb_device *dev; int val; usb_dev_handle *junk; for (dev = bus->devices; dev; dev = dev->next) < char buf[1024]; junk = usb_open ( dev ); usb_get_string_simple(junk,2,buf,1023); switch(argc) < case 1: if ( junk == NULL ) < printf("Can't open %p (%s)\n", dev, buf ); >else if (strcmp(buf,"HD Pro Webcam C920")==0) < val = usb_reset(junk); printf( "reset %p %d (%s)\n", dev, val, buf ); >break; default: if ( junk == NULL ) < printf("Can't open %p (%s)\n", dev, buf ); >else < val = usb_reset(junk); printf( "reset %p %d (%s)\n", dev, val, buf ); >> usb_close(junk); > > > 

Step 2: Running as scanner — to make sure video0 or 1 or 2 is available, if not available resetting the USB bus

#!/bin/bash j=true while $j do for i in 0 1 2 do tmp="/dev/video$i" if [ -e $tmp ] then echo "/dev/video$i" j=false else echo "NO - camera found - restarting the USB $i" echo ROOT_PASSWORD_TO_EXECUTE | sudo -S /var/tmp/c-restartusb/restartusb fi done done echo "Camera - logic ended, expecting the camera is available now" 
NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 NO - camera found - restart the USB 2 NO - camera found - restart the USB 0 NO - camera found - restart the USB 1 

Источник

Reset USB 2.0 (ehci) & USB 3.0 (xhci) Without Reboot in Linux Kernel

Recently I got my USB mouse behaves very strange. Talk shortly, my mouse seems already broken partially and annoyingly it freezes the USB 2.0 port where it is plugged on. No action can be done such as reading a flash drive nor using any other USB mouse. Fortunately, there is a good hack from DavidJB and with it I successfully reset my USB 2.0 and 3.0 port without rebooting. Big thanks for DavidJB. Here I give you all commands plus one bash script example to make it easier.

ehci and xhci, are USB standard interfaces for 2.0 and 3.0 respectively. ehci-pci or ehci_hcd is a Linux kernel driver for USB 2.0 handling, while xhci_hcd is the same for USB 3.0. ehci stands for Enhanced Host Controller Interface, xhci stands for eXtensible Host Controller Interface, while hcd stands for Host Controller Driver. They are low level things inside our Linux kernel.

1. For Ubuntu 14.04 until 16.04

There are two groups of commands, one group is for USB 2.0 port and another one is for USB 3.0. Run one group of commands either one by one or just run them at once by a bash script.

I have tested them in 14.04, 15.04, 15.10, and 16.04. I am sorry I have not tested these in 13.10, 13.04, and 12.10. Please help testing if you can.

echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci-pci/unbind echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci-pci/unbind echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci-pci/bind echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci-pci/bind
echo -n "0000:03:00.0" | tee /sys/bus/pci/drivers/xhci_hcd/unbind echo -n "0000:03:00.0" | tee /sys/bus/pci/drivers/xhci_hcd/bind

2. For Ubuntu 12.04 and Older Versions

There are also two groups of commands. But the only difference from the newer version’s commands is located at ehci_hcd directory. In Ubuntu 12.04, there is no ehci-pci like we find in newer Ubuntu versions. But there is ehci_hcd. Older Ubuntu versions have ehci_hcd and xhci_hcd, while newer Ubuntu versions have ehci-pci and xhci_hcd. Notice the underscore. So the difference between newer and older Ubuntu commands here is only in the USB 2.0.

echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci_hcd/unbind echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci_hcd/unbind echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci_hcd/bind echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci_hcd/bind
echo -n "0000:03:00.0" | tee /sys/bus/pci/drivers/xhci_hcd/unbind echo -n "0000:03:00.0" | tee /sys/bus/pci/drivers/xhci_hcd/bind

As I said, you may insert a group of commands in a bash script. For those are not familiar with it, here a simple script example for you:

#!/bin/bash # this script reset the usb 2.0 port controlled by linux kernel in Ubuntu 14.04 and later echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci-pci/unbind echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci-pci/unbind echo -n "0000:00:1a.0" | tee /sys/bus/pci/drivers/ehci-pci/bind echo -n "0000:00:1d.0" | tee /sys/bus/pci/drivers/ehci-pci/bind

Name this script anything such as `resetusb`, give it executable permission, and place this script in /usr/bin/ directory. To run it, in Terminal, switch user to root and type resetusb command.

How It Works

There are something you need to understand:

The something like `zero zero zero` (0000:00:1a.0) code number is taken from the same `zero zero zero` file name from the same directory of unbind and bind. You may check it in /sys/bus/pci/drivers/ directory.

The expected output is all of echo-ed `zero zero zero` code text entered to be displayed in one single line in your Terminal.

The not expected (the error one) output is your shell saying no such file or directory. If that happens, you should recheck your code perhaps there is an incorrect spelling there.

The lines of code for every USB port must be run one by one sequentially. I found that if I run it randomly, I got no such file or directory error.

Источник

How do I reset an USB device without unplugging it in Linux?

Every now and then there might come a need to reset a USB device, is there a way to perform the reset in software without unplugging the device itself and then pluggin it back in? More specifically I have a webcam which gets confused when playing too much with the settings in guvcapture and then needs a reset to get back on track.

5 Answers 5

usbutils includes usbreset.

Run it without any arguments to see usage and a list of devices. It requires superuser access to actually reset devices.

Usage: usbreset PPPP:VVVV - reset by product and vendor id usbreset BBB/DDD - reset by bus and device number usbreset "Product" - reset by product name 

This allows resetting individual devices which is an improvement over some answers that reset the entire bus. It might not resolve intermediary hub/bus issues, but it’s a lot less disruptive to only reset the desired device.

You could try Benjamin Close’s resetusb program to reset all devices — there are no binaries available, but compiling it is rather easy. Save the source code as resetusb.c , then run:

gcc -lusb resetusb.c -o resetusb 

You can now run the tool as resetusb . Alternatively, @unhammer points to Alan Stern’s single-device version (plus some hints on how to use it).

modprobe -vr ehci_hcd modprobe -v ehci_hcd 

(you could of course script this)

Some distributions may also have their own tools to restart the USB subsystem; Mandrake apparently has /etc/init.d/usb .

$ sudo modprobe -vr ehci_hcd results in modprobe: FATAL: Module ehci_hcd is builtin. on kubuntu trusty.

On my laptop with debian 8, ehci_hcd gives errors. However, rmmod ehci_pci && sleep 2 && modprobe ehci_pci works perfectly.

Let’s say I want to reset /dev/sdc .

# udevadm info -q all /dev/sdc | grep DEVPATH E: DEVPATH=/devices/pci0000:00/0000:00:14.0/usb2/2-1/2-1.4/2-1.4:1.0/host2/target2:0:0/2:0:0:0/block/sdc 

I take the 2-1.4 above (yours might just be 2-1 — my device is plugged into a hub) and do:

# echo 2-1.4 > /sys/bus/usb/drivers/usb/unbind # echo 2-1.4 > /sys/bus/usb/drivers/usb/bind 

I’ve made a one-liner(-ish) for that: DEV=»sdc»; USB=$(udevadm info -q all /dev/$DEV | grep DEVPATH | grep -o ‘/usb8*/[1-9,-]*’ | cut -d’/’ -f3); echo $USB > /sys/bus/usb/drivers/usb/unbind; echo $USB > /sys/bus/usb/drivers/usb/bind Make DEV the drive you want to reset, and run — it’ll extract the USB port number and unbind/bind it (untested).

You can restart the hardware abstraction layer: sudo /etc/init.d/hal restart

i think HAL is replaced by something else in the newest version of ubuntu.. so its depend of distrib..

I seriously doubt it would have worked anyway. HAL wasn’t a low-level abstraction layer like the Windows component of the same name.

I’ve created a Python script that simplifies the whole process:

Save the script below as reset_usb.py or clone this repo.

python reset_usb.py help # Show this help sudo python reset_usb.py list # List all USB devices sudo python reset_usb.py path /dev/bus/usb/XXX/YYY # Reset USB device using path /dev/bus/usb/XXX/YYY sudo python reset_usb.py search "search terms" # Search for USB device using the search terms within the search string returned by list and reset matching device sudo python reset_usb.py listpci # List all PCI USB devices sudo python reset_usb.py pathpci /sys/bus/pci/drivers/. /XXXX:XX:XX.X # Reset PCI USB device using path /sys/bus/pci/drivers/. /XXXX:XX:XX.X sudo python reset_usb.py searchpci "search terms" # Search for PCI USB device using the search terms within the search string returned by listpci and reset matching device 
#!/usr/bin/env python import os import sys from subprocess import Popen, PIPE import fcntl instructions = ''' Usage: python reset_usb.py help : Show this help sudo python reset_usb.py list : List all USB devices sudo python reset_usb.py path /dev/bus/usb/XXX/YYY : Reset USB device using path /dev/bus/usb/XXX/YYY sudo python reset_usb.py search "search terms" : Search for USB device using the search terms within the search string returned by list and reset matching device sudo python reset_usb.py listpci : List all PCI USB devices sudo python reset_usb.py pathpci /sys/bus/pci/drivers/. /XXXX:XX:XX.X : Reset PCI USB device using path sudo python reset_usb.py searchpci "search terms" : Search for PCI USB device using the search terms within the search string returned by listpci and reset matching device ''' if len(sys.argv) < 2: print(instructions) sys.exit(0) option = sys.argv[1].lower() if 'help' in option: print(instructions) sys.exit(0) def create_pci_list(): pci_usb_list = list() try: lspci_out = Popen('lspci -Dvmm', shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().decode('utf-8') pci_devices = lspci_out.split('%s%s' % (os.linesep, os.linesep)) for pci_device in pci_devices: device_dict = dict() categories = pci_device.split(os.linesep) for category in categories: key, value = category.split('\t') device_dictResetting usb ports linux] = value.strip() if 'USB' not in device_dict['Class']: continue for root, dirs, files in os.walk('/sys/bus/pci/drivers/'): slot = device_dict['Slot'] if slot in dirs: device_dict['path'] = os.path.join(root, slot) break pci_usb_list.append(device_dict) except Exception as ex: print('Failed to list pci devices! Error: %s' % ex) sys.exit(-1) return pci_usb_list def create_usb_list(): device_list = list() try: lsusb_out = Popen('lsusb -v', shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().decode('utf-8') usb_devices = lsusb_out.split('%s%s' % (os.linesep, os.linesep)) for device_categories in usb_devices: if not device_categories: continue categories = device_categories.split(os.linesep) device_stuff = categories[0].strip().split() bus = device_stuff[1] device = device_stuff[3][:-1] device_dict = device_info = ' '.join(device_stuff[6:]) device_dict['description'] = device_info for category in categories: if not category: continue categoryinfo = category.strip().split() if categoryinfo[0] == 'iManufacturer': manufacturer_info = ' '.join(categoryinfo[2:]) device_dict['manufacturer'] = manufacturer_info if categoryinfo[0] == 'iProduct': device_info = ' '.join(categoryinfo[2:]) device_dict['device'] = device_info path = '/dev/bus/usb/%s/%s' % (bus, device) device_dict['path'] = path device_list.append(device_dict) except Exception as ex: print('Failed to list usb devices! Error: %s' % ex) sys.exit(-1) return device_list if 'listpci' in option: pci_usb_list = create_pci_list() for device in pci_usb_list: print('path=%s' % device['path']) print(' manufacturer=%s' % device['SVendor']) print(' device=%s' % device['SDevice']) print(' search string=%s %s' % (device['SVendor'], device['SDevice'])) sys.exit(0) if 'list' in option: usb_list = create_usb_list() for device in usb_list: print('path=%s' % device['path']) print(' description=%s' % device['description']) print(' manufacturer=%s' % device['manufacturer']) print(' device=%s' % device['device']) print(' search string=%s %s %s' % (device['description'], device['manufacturer'], device['device'])) sys.exit(0) if len(sys.argv) < 3: print(instructions) sys.exit(0) option2 = sys.argv[2] print('Resetting device: %s' % option2) # echo -n "0000:39:00.0" | tee /sys/bus/pci/drivers/xhci_hcd/unbind;echo -n "0000:39:00.0" | tee /sys/bus/pci/drivers/xhci_hcd/bind def reset_pci_usb_device(dev_path): folder, slot = os.path.split(dev_path) try: fp = open(os.path.join(folder, 'unbind'), 'wt') fp.write(slot) fp.close() fp = open(os.path.join(folder, 'bind'), 'wt') fp.write(slot) fp.close() print('Successfully reset %s' % dev_path) sys.exit(0) except Exception as ex: print('Failed to reset device! Error: %s' % ex) sys.exit(-1) if 'pathpci' in option: reset_pci_usb_device(option2) if 'searchpci' in option: pci_usb_list = create_pci_list() for device in pci_usb_list: text = '%s %s' % (device['SVendor'], device['SDevice']) if option2 in text: reset_pci_usb_device(device['path']) print('Failed to find device!') sys.exit(-1) def reset_usb_device(dev_path): USBDEVFS_RESET = 21780 try: f = open(dev_path, 'w', os.O_WRONLY) fcntl.ioctl(f, USBDEVFS_RESET, 0) print('Successfully reset %s' % dev_path) sys.exit(0) except Exception as ex: print('Failed to reset device! Error: %s' % ex) sys.exit(-1) if 'path' in option: reset_usb_device(option2) if 'search' in option: usb_list = create_usb_list() for device in usb_list: text = '%s %s %s' % (device['description'], device['manufacturer'], device['device']) if option2 in text: reset_usb_device(device['path']) print('Failed to find device!') sys.exit(-1) 

Источник

Читайте также:  Nvidia geforce 210 linux driver
Оцените статью
Adblock
detector