कमांड लाइन से आप USB डिवाइस को कैसे रीसेट करते हैं?


164

क्या पीसी से शारीरिक रूप से डिस्कनेक्ट / कनेक्ट किए बिना, यूएसबी डिवाइस के कनेक्शन को रीसेट करना संभव है?

विशेष रूप से, मेरा डिवाइस एक डिजिटल कैमरा है। मैं उपयोग कर रहा हूं gphoto2, लेकिन हाल ही में मुझे "डिवाइस रीड एरर" मिलता है, इसलिए मैं कनेक्शन का सॉफ़्टवेयर-रीसेट करने का प्रयास करना चाहता हूं।

जो मैं बता सकता हूं, उसमें कैमरे के लिए कोई कर्नेल मॉड्यूल लोड नहीं किए जा रहे हैं। केवल वही दिखता है जो संबंधित है usbhid


आप उबंटू के किस संस्करण का उपयोग कर रहे हैं?
उपयोगकर्ता

मैं ली लो और ssokolow द्वारा दोनों समाधानों की कोशिश की, सब मुझे मिल रहा है अनुमति से इनकार कर दिया है, अगर मैं usbreset कोड या कमांड लाइन "इको 0> ..." का उपयोग करता हूं, तो मैं sudo का उपयोग करता हूं, मेरे USB डिवाइस रूट के स्वामित्व में हैं लेकिन मैं व्यवस्थापक अधिकारों (कैमरों ..) के बिना उनका उपयोग कर सकते हैं

1
यदि आपको पढ़ने में त्रुटि हो रही है, तो आपके पास कुछ भ्रष्टाचार हो सकता है। यदि आपका कैमरा एक बाहरी मेमोरी कार्ड (जैसे कि माइक्रोएसडी) का उपयोग करता है, तो इसे कंप्यूटर से कनेक्ट करने और fsck चलाने में समझदारी हो सकती है।
TSJNachos117

जवाबों:


118

निम्न के रूप में सहेजें usbreset.c

/* 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) {
        fprintf(stderr, "Usage: usbreset device-filename\n");
        return 1;
    }
    filename = argv[1];

    fd = open(filename, O_WRONLY);
    if (fd < 0) {
        perror("Error opening output file");
        return 1;
    }

    printf("Resetting USB device %s\n", filename);
    rc = ioctl(fd, USBDEVFS_RESET, 0);
    if (rc < 0) {
        perror("Error in ioctl");
        return 1;
    }
    printf("Reset successful\n");

    close(fd);
    return 0;
}

टर्मिनल में निम्नलिखित कमांड चलाएँ:

  1. कार्यक्रम संकलित करें:

    $ cc usbreset.c -o usbreset
    
  2. जिस USB डिवाइस को रीसेट करना चाहते हैं, उसका बस और डिवाइस आईडी प्राप्त करें:

    $ lsusb  
    Bus 002 Device 003: ID 0fe9:9010 DVICO  
    
  3. हमारे संकलित कार्यक्रम को निष्पादन योग्य बनाएं:

    $ chmod +x usbreset
    
  4. सूडो विशेषाधिकार के साथ कार्यक्रम निष्पादित करें; कमांड चलाकर जैसा पाया गया है, उसके लिए आवश्यक प्रतिस्थापन करें <Bus>और <Device>आईडी lsusb:

    $ sudo ./usbreset /dev/bus/usb/002/003  
    

उपरोक्त कार्यक्रम का स्रोत: http://marc.info/?l=linux-usb&m=121459435621262&&=2


3
यह ubuntu 13.10 के साथ काम करता है। डिवाइस आईडी अलग-अलग हो सकती है। माउस के लिए इसे पाने के लिए मैंने कुछ शेल कमांड्स में कोड से ऊपर लपेटा हैecho $(lsusb | grep Mouse) mouse=$( lsusb | grep Mouse | perl -nE "/\D+(\d+)\D+(\d+).+/; print qq(\$1/\$2)") sudo /path/to/c-program/usbreset /dev/bus/usb/$mouse
knb

1
मेरी बाहरी ड्राइव अनिर्दिष्ट प्रतीत होती है (मुझे USB केबल को फिर से जोड़ना है); यह एक usb2.0 usb3.0 डेस्कटॉप पीसी पोर्ट पर जुड़ा हुआ है; जब मैं चला usbreset /dev/bus/usb/011/001कि 2 USB 3.0 रूट हब में से एक है lsusb, तो यह त्रुटि: "ioctl में त्रुटि: एक निर्देशिका है", कोई विचारधारा? मैंने दोनों USB 3.0 हब
कुंभ पावर

1
अगर इसे पढ़ने वाले किसी के पास (usb) माउस फ्रीज है, तो वह उबंटू 16.04 ("इनपुट irq स्टेटस -75" द्वारा भरे गए dmesg के साथ) में लॉग इन कर सकता है, मैं पुष्टि कर सकता हूं कि यह एकमात्र समाधान है जो मेरे लिए काम करता है। धन्यवाद
अगस्टिन बाएज़

1
@ कुम्भ, मुझे भी यही त्रुटि "ioctl में त्रुटि: एक निर्देशिका है"। क्या इसका हल है?
रैनश

1
मेरा उत्तर यहाँ देखें askubuntu.com/a/988297/558070 जो इस उत्तर के रूप में रीसेट की एक ही विधि का उपयोग करता है, लेकिन यह भी सरलीकृत लिस्टिंग की अनुमति देता है और उपकरणों की खोज करता है।
मैकर्न्स

58

मैंने पहले खुद को आपकी विशिष्ट परिस्थितियों में नहीं पाया है, इसलिए मुझे यकीन नहीं है कि यह पर्याप्त होगा, लेकिन मैंने USB डिवाइस को रीसेट करने का सबसे सरल तरीका यह आदेश दिया है: (कोई बाहरी एप्लिकेशन आवश्यक नहीं)

sudo sh -c "echo 0 > /sys/bus/usb/devices/1-4.6/authorized"
sudo sh -c "echo 1 > /sys/bus/usb/devices/1-4.6/authorized"

यही कारण है कि मैं अपने Kinect को रीसेट करने के लिए उपयोग करता हूं क्योंकि libfreenect लगता है कि इसे वापस सोने के लिए कोई एपीआई नहीं है। यह मेरे Gentoo बॉक्स पर है, लेकिन कर्नेल sysfs के लिए समान पथ संरचना का उपयोग करने के लिए पर्याप्त नया होना चाहिए।

आपका स्पष्ट रूप से नहीं होगा, 1-4.6लेकिन आप या तो अपने कर्नेल लॉग ( dmesg) से उस डिवाइस पथ को खींच सकते हैं या आप lsusbविक्रेता और उत्पाद आईडी प्राप्त करने के लिए कुछ का उपयोग कर सकते हैं और फिर इस तरह से एक त्वरित आदेश का उपयोग कर यह सूची कर सकते हैं कि पथ विभिन्न विक्रेता से कैसे संबंधित हैं / उत्पाद आईडी जोड़े:

for X in /sys/bus/usb/devices/*; do 
    echo "$X"
    cat "$X/idVendor" 2>/dev/null 
    cat "$X/idProduct" 2>/dev/null
    echo
done

निर्देशिका अस्तित्वहीन: श: 1: /sys/bus/usb/devices/1-3.1:1.0/authorized नहीं बना सकते
निकोलस Marchildon

ऐसा लगता है कि उन्होंने usbfs फाइल सिस्टम के लेआउट को बदल दिया है। मैं यह जानने की कोशिश करूंगा कि एक बार नींद न आने के बाद क्या चीजें उबंटू में करने का नया तरीका है।
ssokolow

9
धन्यवाद आपने बहुत अच्छा काम किया! हो सकता है कि आपको echo 1 > /sys/bus/usb/devices/whatever/authorizedडिवाइस को फिर से सक्षम करने के लिए स्क्रिप्ट के अंदर प्रदर्शन करने का भी उल्लेख करना चाहिए जैसे ही वह अक्षम हो गया है। मैंने इसे अपने माउस और USB कीबोर्ड दोनों पर किया और मैं पूरी तरह से बधिर प्रणाली के साथ समाप्त हो गया :)
Avio

1
यह अत्यंत अजीब है अगर यह स्वचालित रूप से 1 पर मान को फिर से सेट कर देता है जैसा कि इसे 0 पर सेट करना यह बता रहा है कि आप डिवाइस को "अधिकृत" नहीं करना चाहते हैं और इसलिए दुर्गम है।
टिम टिसडल

2
किसी के लिए एक नोट जो | sudo tee ...विशेषाधिकार प्राप्त करने के लिए दृष्टिकोण पर स्विच करने की कोशिश करता है /sysलिखते हैं: यदि आप पहले से ही अपने sudo क्रेडेंशियल्स कैश नहीं है, तो यह बुरी तरह से टूट जाता है। sudo sh -c "..."जब sudo पासवर्ड के लिए प्रॉम्प्ट करने की आवश्यकता हो तो उम्मीद के मुताबिक काम करता है।
ssokolow

51

यह सभी USB1 / 2/3 संलग्न पोर्ट को रीसेट करेगा [1]:

for i in /sys/bus/pci/drivers/[uoex]hci_hcd/*:*; do
  [ -e "$i" ] || continue
  echo "${i##*/}" > "${i%/*}/unbind"
  echo "${i##*/}" > "${i%/*}/bind"
done

मुझे विश्वास है कि इससे आपकी समस्या दूर हो जाएगी। यदि आप सभी USB समापन बिंदुओं को रीसेट नहीं करना चाहते हैं, तो आप उपयुक्त डिवाइस ID का उपयोग कर सकते हैं/sys/bus/pci/drivers/ehci_hcd


नोट: [१]: *hci_hcdकर्नेल चालक आमतौर पर USB पोर्ट को नियंत्रित करते हैं। ohci_hcdऔर uhci_hcdUSB1.1 बंदरगाहों के लिए हैं, ehci_hcdUSB2 बंदरगाहों के लिए है और xhci_hcdUSB3 बंदरगाहों के लिए है। (देखें https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire) )


क्या आप मानते हैं कि यह एक USB संग्रहण को जगाने के लिए काम कर सकता है ?
कुंभ राशि

2
हालाँकि मुझे निम्न संदेश मिला है: ls: cannot access /sys/bus/pci/drivers/ehci_hcd/: No such file or directoryइससे समस्या हल हो गई है, माउस ने तुरंत काम करना शुरू कर दिया है। +1
एटिला फुलोप

2
@ ओटस OHCI और UHCI USB 1.1 होस्ट मानक हैं, EHCI USB 2.0 होस्ट मानक है, और XHCI USB 3.0 होस्ट मानक है।
19ok पर ssokolow

2
यह एक सुंदर उपाय है। हालांकि, कुछ बाद में कर्नेल और अन्य * निक्स वितरण पर, आप पाएंगे कि आपको इसके *hci_hcdसाथ स्थानापन्न करने की आवश्यकता है *hci-pci, क्योंकि hci_hcd ड्राइवर पहले से ही कर्नेल में संकलित है।
not2qubit

1
एक केले पाई पर, जाहिरा तौर पर कोई पीसीआई बस नहीं है, मुझे निम्नलिखित का उपयोग करना था:for i in /sys/bus/usb/drivers/*/*:*; do
मार्टिन हैनसन

10

मुझे इसे अजगर लिपि में स्वचालित करने की आवश्यकता थी, इसलिए मैंने LiLo के अत्यंत उपयोगी उत्तर को निम्नलिखित के लिए अनुकूलित किया:

#!/usr/bin/env python
import os
import sys
from subprocess import Popen, PIPE
import fcntl
driver = sys.argv[-1]
print "resetting driver:", driver
USBDEVFS_RESET= 21780

try:
    lsusb_out = Popen("lsusb | grep -i %s"%driver, shell=True, bufsize=64, stdin=PIPE, stdout=PIPE, close_fds=True).stdout.read().strip().split()
    bus = lsusb_out[1]
    device = lsusb_out[3][:-1]
    f = open("/dev/bus/usb/%s/%s"%(bus, device), 'w', os.O_WRONLY)
    fcntl.ioctl(f, USBDEVFS_RESET, 0)
except Exception, msg:
    print "failed to reset device:", msg

मेरे मामले में यह cp210x ड्राइवर था (जिसे मैं बता सकता था lsmod | grep usbserial), इसलिए आप उपरोक्त स्निपेट को reset_usb.py के रूप में सहेज सकते हैं और फिर ऐसा कर सकते हैं:

sudo python reset_usb.py cp210x

यदि आप पहले से ही अपने सिस्टम पर एसी कंपाइलर सेटअप नहीं करते हैं, तो भी यह मददगार हो सकता है, लेकिन आपके पास अजगर है।


मेरे लिए एक रास्पबेरी पर काम किया
webo80

1
कृपया अपने समाधान पर कुछ और शब्द। उदाहरण के लिए, स्थिरांक के बारे में कुछ USBDEVFS_RESET। क्या यह हमेशा सभी प्रणालियों के लिए समान है?
Not2qubit

@ not2qubit USBDEVFS_RESETसभी प्रणालियों के लिए समान है। एमआइपी के लिए यह 536892692 है।
येगोरिच

Lsusb के नए संस्करणों को -tड्राइवर की जानकारी दिखाने के लिए तर्क (ट्री मोड) की आवश्यकता है जो इस स्क्रिप्ट की अपेक्षा कर रहा है, लेकिन स्क्रिप्ट को इसके बाद उत्पन्न होने वाले विभिन्न आउटपुट लाइनों को पार्स करने के लिए कुछ अपडेट की आवश्यकता होती है
Cheetah

इस स्क्रिप्ट के एक बहुत बेहतर संस्करण के लिए मेरा उत्तर पूछें। यहाँ पूछें : ububuntu.com/a/988297/558070
मार्केन्स

8

मैंने एक पायथन लिपि बनाई है, जो यहां उत्तरों के आधार पर पूरी प्रक्रिया को सरल बनाती है।

नीचे दी गई स्क्रिप्ट को reset_usb.py के रूप में सहेजें या इस रेपो को क्लोन करें

उपयोग:

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_dict[key[:-1]] = 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 = {'bus': bus, 'device': device}
            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)

यह इस सवाल का सबसे अच्छा जवाब है।
kapad

4

चूंकि प्रश्न का विशेष मामला USB पर कैमरे के साथ gphoto2 की संचार समस्या है, इसलिए अपने USB कनेक्शन को रीसेट करने के लिए gphoto2 में एक विकल्प है:

gphoto2 --reset

शायद यह विकल्प 2010 में मौजूद नहीं था जब सवाल पूछा गया था।


3

रीसेट करने का सबसे तेज तरीका यूएसबी नियंत्रक को स्वयं रीसेट करना होगा। ऐसा करने पर डिवाइस को डिसकनेक्शन पर अपंजीकृत करने के लिए udv लागू हो जाएगा, और इसे सक्षम करने के बाद रजिस्टर वापस आ जाएगा।

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

यह अधिकांश पीसी वातावरण के लिए काम करना चाहिए। हालाँकि, यदि आप कुछ कस्टम हार्डवेयर का उपयोग कर रहे हैं, तो आप केवल डिवाइस नामों के माध्यम से पुनरावृति कर सकते हैं। इस विधि से आपको lsusb द्वारा डिवाइस नाम का पता लगाने की आवश्यकता नहीं है। आप एक स्वचालित स्क्रिप्ट में भी शामिल कर सकते हैं।


1
आपको इन कमांड को रूट / सुडो के रूप में चलाने की आवश्यकता है, और यह सभी सिस्टम पर काम नहीं करेगा (कुछ पर, आपको इसके ehci_hcdसाथ बदलने की आवश्यकता होगी ehci-pci। इस समाधान पर अधिक जानकारी (शायद यह कहां से आया?): Davidjb.com/blog /
2012/06

3

मैं मॉड्यूल को पुनः लोड करके स्लेजहेमर का उपयोग कर रहा हूं। यह मेरी usb_reset.sh स्क्रिप्ट है:

#!/bin/bash

# USB drivers
rmmod xhci_pci
rmmod ehci_pci

# uncomment if you have firewire
#rmmod ohci_pci

modprobe xhci_pci
modprobe ehci_pci

# uncomment if you have firewire
#modprobe ohci_pci

और यह मेरी systemd सर्विस फ़ाइल /usr/lib/systemd/system/usbreset.service है जो usb_reset.sh को चलाती है जब मेरे डिप्लोमा मैनेजर ने शुरू किया है:

[Unit]
Description=usbreset Service
After=gdm.service
Wants=gdm.service

[Service]
Type=oneshot
ExecStart=/path/to/usb_reset.sh

यहाँ मेरी स्क्रिप्ट के सूची विकल्प का उपयोग करते हुए: askubuntu.com/a/988297/558070 यह पता लगाने में मदद करेगा कि कौन से USB मॉड्यूल को पुनः लोड करना है (जैसे। Xhci_pci, ehci_pci)।
मैकर्न्स

2
दुर्भाग्य से अपने सिस्टम पर इन कर्नेल मॉड्यूल कर्नेल फार्म अलग नहीं कर रहे हैं, तो यह काम नहीं करेगा:rmmod: ERROR: Module xhci_pci is builtin.
unfa

3

मैंने एक पायथन स्क्रिप्ट बनाई जो डिवाइस नंबर के आधार पर एक विशेष यूएसबी डिवाइस को रीसेट करेगी। आप कमांड lsusb से डिवाइस नंबर का पता लगा सकते हैं।

उदाहरण के लिए:

$ lsusb

Bus 002 Device 004: ID 046d:c312 Logitech, Inc. DeLuxe 250 Keyboard

इस स्ट्रिंग में 004 डिवाइस नंबर है

import os
import argparse
import subprocess

path='/sys/bus/usb/devices/'

def runbash(cmd):
    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
    out = p.stdout.read().strip()
    return out

def reset_device(dev_num):
    sub_dirs = []
    for root, dirs, files in os.walk(path):
            for name in dirs:
                    sub_dirs.append(os.path.join(root, name))

    dev_found = 0
    for sub_dir in sub_dirs:
            if True == os.path.isfile(sub_dir+'/devnum'):
                    fd = open(sub_dir+'/devnum','r')
                    line = fd.readline()
                    if int(dev_num) == int(line):
                            print ('Your device is at: '+sub_dir)
                            dev_found = 1
                            break

                    fd.close()

    if dev_found == 1:
            reset_file = sub_dir+'/authorized'
            runbash('echo 0 > '+reset_file) 
            runbash('echo 1 > '+reset_file) 
            print ('Device reset successful')

    else:
            print ("No such device")

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-d', '--devnum', dest='devnum')
    args = parser.parse_args()

    if args.devnum is None:
            print('Usage:usb_reset.py -d <device_number> \nThe device    number can be obtained from lsusb command result')
            return

    reset_device(args.devnum)

if __name__=='__main__':
    main()

मुझे यह समाधान पसंद है! : मैं अपने खुद के स्वाद के लिए स्क्रिप्ट के कुछ बदलाव कर दिया है gist.github.com/willstott101/7a455817ec6f4b8d89571ce72bdfd34a
विल एस

2

यहां स्क्रिप्ट है जो केवल एक मिलान वाले उत्पाद / विक्रेता आईडी को रीसेट करेगी।

#!/bin/bash

set -euo pipefail
IFS=$'\n\t'

VENDOR="045e"
PRODUCT="0719"

for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
  if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
        $(cat $DIR/idVendor) == $VENDOR && $(cat $DIR/idProduct) == $PRODUCT ]]; then
    echo 0 > $DIR/authorized
    sleep 0.5
    echo 1 > $DIR/authorized
  fi
done

1
मैंने पाया कि आपकी स्क्रिप्ट उपयोगी है। लेकिन अगर $DIRगायब हो जाए और डिवाइस दिखाई न दे तो मुझे क्या करना चाहिए ?
यूजेन कोनकोव

1

क्या किसी ने एक स्लेजहैमर का आदेश दिया? यह यहाँ विभिन्न अन्य उत्तरों से एक साथ pieced है।

#!/bin/bash

# Root required
if (( UID )); then
        exec sudo "$0" "$@"
fi

cd /sys/bus/pci/drivers

function reinit {(
        local d="$1"
        test -e "$d" || return

        rmmod "$d"

        cd "$d"

        for i in $(ls | grep :); do
                echo "$i" > unbind
        done

        sleep 1

        for i in $(ls | grep :); do
                echo "$i" > bind
        done

        modprobe "$d"

)}

for d in ?hci_???; do
        echo " - $d"
        reinit "$d"
done

निशान, क्या तुमने पाया है कि unbinding वास्तव में आवश्यक है या यह सिर्फ सुरक्षित पक्ष पर होने के लिए यहाँ है?
ndemou

यह एक स्लेजहैमर है, यह संभवतः बहुत सारी अनावश्यक चीजें करता है
मार्क के कोवान

@MarkKowan, आप इसका उपयोग कैसे करते हैं? आदेश तर्कों की क्या आवश्यकता / अपेक्षा है?
not2qubit

1
@ not2qubit: कोई कमांड-लाइन तर्क की आवश्यकता नहीं है। $@Sudo प्रॉक्सी में सिर्फ habbit के बल यह कीड़े से बचाता है, तो मैं बाद में तर्क जोड़ने (और sudo प्रॉक्सी अपडेट करने का) करने का फैसला होने है।
मार्क के कोवान

1
@ मर्ककॉवन दोह! क्षमा करो दोस्त! अरे हाँ अभिशाप! मुझे सोते समय इस साइट पर टिप्पणी नहीं करनी चाहिए। Upvoted!
नॉटआउट

1

कभी-कभी मैं एक विशेष उपकरण पर इस ऑपरेशन को करना चाहता हूं, जैसा कि वीआईडी ​​(विक्रेता आईडी) और पीआईडी ​​(उत्पाद आईडी) द्वारा पहचाना जाता है। यह एक स्क्रिप्ट है जिसे मैंने इस उद्देश्य के लिए उपयोगी पाया है, जिसमें निफ्टी लिबस लाइब्रेरी का उपयोग किया गया है।

प्रथम रन:

sudo apt-get install libusb-dev

फिर, इस c ++ फ़ाइल के रीसेटडिवकॉन्सेक्शन को यह कार्य करना चाहिए, vid और pid द्वारा पहचाने गए डिवाइस कनेक्शन को रीसेट करने का।

#include <libusb-1.0/libusb.h>

int resetDeviceConnection(UINT_16 vid, UINT_16 pid){
    /*Open libusb*/
    int resetStatus = 0;
    libusb_context * context;
    libusb_init(&context);

    libusb_device_handle * dev_handle = libusb_open_device_with_vid_pid(context,vid,pid);
    if (dev_handle == NULL){
      printf("usb resetting unsuccessful! No matching device found, or error encountered!\n");
      resetStatus = 1;
    }
    else{
      /*reset the device, if one was found*/
      resetStatus = libusb_reset_device(dev_handle);
    }
    /*exit libusb*/
    libusb_exit(context);
    return resetStatus;
}

(मेरी व्यक्तिगत TIL कैटलॉग से चोरी: https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )


3
कृपया आप यह दिखा सकते हैं कि यह स्क्रिप्ट कैसे चलाई जाती है।
जॉर्ज उदेन

निश्चित बात है, मुझे अपडेट करने दें।
मैरवील

1
@Marviel, हम अभी भी एक अद्यतन के लिए प्रतीक्षा कर रहे हैं ...
not2qubit

बेकार के रूप में डाउनवोट की जरूरत है
यूजेन कोनकोव

1

मैंने विशेष USB डिवाइस को रीसेट करने के लिए एक सरल बैश स्क्रिप्ट बनाई।

#!/bin/bash
#type lsusb to find "vendor" and "product" ID in terminal
set -euo pipefail
IFS=$'\n\t'

#edit the below two lines of vendor and product values using lsusb result
dev=$(lsusb -t | grep usbdevicename | grep 'If 1' | cut -d' ' -f13|cut -d"," -f1)
#VENDOR=05a3
#PRODUCT=9230
VENDOR=$(lsusb -s $dev | cut -d' ' -f6 | cut -d: -f1)
PRODUCT=$(lsusb -s $dev | cut -d' ' -f6 | cut -d: -f2)

for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
  if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
        $(cat $DIR/idVendor) == $VENDOR && $(cat $DIR/idProduct) == $PRODUCT ]]; then
    echo 0 > $DIR/authorized
    sleep 0.5
    echo 1 > $DIR/authorized
  fi
done

0

शायद यह कैमरे के लिए भी काम करता है:

मेरी तरफ USB 3.0एक 3.4.42(k गिने.नेट) लिनक्स पर एक भूखे एचडीडी को पुनर्जीवित करने के बाद । dmesgबताया, कि यह 360s के बाद कमांड आउट कर रहा था (क्षमा करें, मैं यहां syslog की नकल नहीं कर सकता, न कि कनेक्टेड नेटवर्क नहीं) और ड्राइव पूरी तरह से लटका दिया गया। डिवाइस को एक्सेस करने वाली प्रक्रियाओं को कर्नेल में अवरुद्ध किया गया था, अयोग्य। NFSत्रिशंकु, ZFSत्रिशंकु, ddत्रिशंकु।

ऐसा करने के बाद, सब कुछ फिर से काम किया। डिवाइस के dmesgबारे में सिर्फ एक ही लाइन बताई USB

मुझे वास्तव में पता नहीं है कि निम्नलिखित विस्तार से क्या करता है। लेकिन इसने काम किया।

निम्न उदाहरण आउटपुट 2.6.32-5-686कर्नेल के साथ डेबियन स्क्वीज़ से है , इसलिए मुझे लगता है कि यह 2.6 और इसके बाद के संस्करण के लिए काम करता है:

$ ls -al /dev/sdb
brw-rw---T 1 root floppy 8, 16 Jun  3 20:24 /dev/sdb

$ ls -al /sys/dev/block/8:16/device/rescan
--w------- 1 root root 4096 Jun  6 01:46 /sys/dev/block/8:16/device/rescan

$ echo 1 > /sys/dev/block/8:16/device/rescan

यदि यह काम नहीं करता है, तो शायद कोई अन्य व्यक्ति यह पता लगा सकता है कि किसी डिवाइस पर वास्तविक रीसेट कैसे भेजा जाए।


0

यह कोशिश करो, यह एक सॉफ्टवेयर अनप्लग (इजेक्ट) है।

कभी-कभी कुछ उपकरणों के लिए बस unbind डिवाइस काम नहीं करता है।

उदाहरण:

मैं अपने "Genius NetScroll 120" को हटाना या निकालना चाहता हूं।

फिर मैं पहली बार अपने संलग्न USB डिवाइस की जाँच करें

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 003: ID 03f0:231d Hewlett-Packard 
Bus 001 Device 004: ID 138a:0007 Validity Sensors, Inc. VFS451 Fingerprint Reader
Bus 001 Device 005: ID 04f2:b163 Chicony Electronics Co., Ltd 
Bus 002 Device 009: ID 0458:003a KYE Systems Corp. (Mouse Systems) NetScroll+ Mini Traveler / Genius NetScroll 120  **<----This my Mouse! XDDD**

ठीक है, मुझे मेरा माउस मिला, इसमें बस 002, डिवाइस 009, आईडीवीएनडी 0458 और आईडीप्रोड 003 ए है, इसलिए यह माउस के बारे में एक संदर्भ डिवाइस जानकारी है।

यह महत्वपूर्ण है, बस नंबर डिवाइस का शुरुआती नाम पथ है और मैं सही डिवाइस को निकालने के लिए उत्पाद आईडी और विक्रेता की जांच करूंगा।

$ ls /sys/bus/usb/drivers/usb/
1-1/    1-1.1/  1-1.3/  1-1.5/  2-1/    2-1.3/  bind    uevent  unbind  usb1/   usb2/

फ़ोल्डरों पर ध्यान दें, फ़ोल्डर नंबर 2 के साथ भीख की जाँच करें, मैं इस एक की जांच करूंगा क्योंकि मेरी बस 002 है, और एक-एक करके मैंने अपने माउस जानकारी के बारे में सही idVendor और idProduct वाले प्रत्येक फ़ोल्डर की जांच की है।

इस मामले में, मैं इस कमांड के साथ जानकारी पुनः प्राप्त करूंगा:

cat /sys/bus/usb/drivers/usb/2-1.3/idVendor
0458
cat /sys/bus/usb/drivers/usb/2-1.3/idProduct
003a

ठीक है, मेरी जानकारी माउस के साथ पथ /sys/bus/usb/drivers/usb/2-1.3/! XDDD।

यह डिवाइस को हटाने का समय है!

su -c "echo 1 > /sys/bus/usb/drivers/usb/2-1.3/remove"

USB डिवाइस फिर से प्लग करें और यह फिर से काम करे!


10
क्या होगा अगर आप इसे फिर से प्लग नहीं कर सकते हैं? (उदाहरण के लिए यह एक आंतरिक sdcard रीडर है)
एलेब

0

यदि आप अपने डिवाइस का नाम जानते हैं, तो यह अजगर स्क्रिप्ट काम करेगी:

#!/usr/bin/python
"""
USB Reset

Call as "usbreset.py <device_file_path>"

With device_file_path like "/dev/bus/usb/bus_number/device_number"
"""
import fcntl, sys, os

USBDEVFS_RESET = ord('U') << (4*2) | 20

def main():
    fd = os.open(sys.argv[1], os.O_WRONLY)
    if fd < 0: sys.exit(1)
    fcntl.ioctl(fd, USBDEVFS_RESET, 0)
    os.close(fd)
    sys.exit(0)
# end main

if __name__ == '__main__':
    main()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.