কমান্ড লাইন থেকে আপনি কীভাবে একটি ইউএসবি ডিভাইস পুনরায় সেট করবেন?


164

পিসি থেকে শারীরিকভাবে সংযোগ বিচ্ছিন্ন / সংযোগ ছাড়াই কোনও ইউএসবি ডিভাইসের সংযোগটি পুনরায় সেট করা সম্ভব?

বিশেষত, আমার ডিভাইস একটি ডিজিটাল ক্যামেরা। আমি ব্যবহার করছি gphoto2, তবে ইদানীং আমি "ডিভাইস পড়ার ত্রুটিগুলি" পেয়েছি, তাই আমি সংযোগটির একটি সফ্টওয়্যার-রিসেট করার চেষ্টা করতে চাই।

আমি যা বলতে পারি তা থেকে ক্যামেরার জন্য কোনও কার্নেল মডিউল লোড হচ্ছে না। সম্পর্কিত দেখায় যে একমাত্র usbhid


আপনি উবুন্টুর কোন সংস্করণ ব্যবহার করছেন?
ব্যবহারকারী

আমি লি লো এবং এসকোলো দ্বারা উভয় সমাধানের চেষ্টা করেছি, আমার প্রাপ্ত সমস্তই অনুমতি প্রত্যাখ্যান করা হয়েছে, আমি ইউএসব্রেসেট কোড বা কমান্ড লাইন "প্রতিধ্বনি 0> ..." ব্যবহার করি, তবে আমি সুডো ব্যবহার করি, আমার ইউএসবি ডিভাইসগুলিও রুটের মালিকানাধীন তবে আমি এডমিন রাইটস (ক্যামেরা ..) ছাড়াই এগুলি ব্যবহার করতে পারবেন

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&w=2


3
এটি উবুন্টু 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
গুটিয়ে রেখেছি

1
আমার বাহ্যিক ড্রাইভটি অন্বেষণযোগ্য হয়ে উঠেছে বলে মনে হচ্ছে (আমাকে ইউএসবি কেবলটি পুনরায় সংযুক্ত করতে হবে); এটি একটি ইউএসবি ২.০ যা ইউএসবি ৩.০ ডেস্কটপ পিসি পোর্টের সাথে সংযুক্ত; যখন আমি usbreset /dev/bus/usb/011/001এটি 2 ইউএসবি 3.0 রুট হাবগুলির মধ্যে একটিতে চালিত করি তখন lsusbএটি ত্রুটি করে: "আইওসিটিএলে ত্রুটি: একটি ডিরেক্টরি কি", কোনও ধারণা? আমি উভয়ই ইউএসবি 3.0 হাবের চেষ্টা করেছি
কুম্ভ শক্তি

1
এটি পড়ার কেউ যদি উবুন্টু 16.04 এ লগ ইন করার পরে (ইউএসবি) মাউস হিমশীতল করে থাকেন ("ইনপুট আইআরকি অবস্থা -75" দ্বারা ভরাট ডেসমেজ সহ), আমি নিশ্চিত করতে পারি যে এটিই আমার পক্ষে কাজ করেছে solution আপনাকে ধন্যবাদ
আগস্টিন বায়েজ

1
@ অ্যাকোরিয়াস, আমি একই ত্রুটিটি পেয়েছি "আইওসিটিএল এ ত্রুটি: এটি একটি ডিরেক্টরি"। এর সমাধান কি?
র‌্যাঁশ

1
আমার উত্তরটি এখানে জিজ্ঞাসা করুন জিজ্ঞাসুবন্টু.com/a/988297/558070 যা এই উত্তর হিসাবে পুনরায় সেট করার একই পদ্ধতি ব্যবহার করে তবে ডিভাইসগুলির তালিকাভুক্তকরণ এবং অনুসন্ধানের সরলীকৃত তালিকাও মঞ্জুরি দেয়।
ম্যাকারানস

58

আমি আগে আপনার নির্দিষ্ট পরিস্থিতিতে নিজেকে খুঁজে পাইনি, সুতরাং এটি যথেষ্ট পরিমাণে কাজ করবে কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে ইউএসবি ডিভাইসটি পুনরায় সেট করার সহজতম উপায়টি হ'ল এই আদেশটি: (কোনও বাহ্যিক অ্যাপ্লিকেশন প্রয়োজন নেই)

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"

আমি আমার কিনেেক্টটিকে পুনরায় সেট করতে ব্যবহার করতে আসল এটি হ'ল যেহেতু লাইবফ্রেনেক্টের মনে হয় এটিকে আবার ঘুমানোর জন্য কোনও এপিআই নেই। এটি আমার জেন্টু বাক্সে রয়েছে, তবে সিসফের জন্য একই পাথ কাঠামোটি ব্যবহার করার জন্য কার্নেলটি যথেষ্ট নতুন হওয়া উচিত।

আপনার স্পষ্টতই এটি হবে না 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

sh: 1: /sys/bus/usb/devices/1-3.1 ACT.0/authorised তৈরি করতে পারবেন না: ডিরেক্টরি অস্তিত্বহীন
নিকোলাস মার্চিল্ডন

দেখে মনে হচ্ছে তারা ইউএসবিএস ফাইল সিস্টেমের বিন্যাস পরিবর্তন করেছে changed আমি এতটা নিদ্রাহীন না হয়ে একবার উবুন্টুতে জিনিসগুলি করার নতুন উপায়টি কী তা আমি বের করার চেষ্টা করব।
ssokolow

9
আপনাকে দুর্দান্ত কাজ করার জন্য ধন্যবাদ! সম্ভবত আপনার echo 1 > /sys/bus/usb/devices/whatever/authorizedডিভাইসটি অক্ষম হওয়ার সাথে সাথেই এটি পুনরায় সক্ষম করার জন্য কোনও স্ক্রিপ্টের অভ্যন্তরে একটি সম্পাদনা করার কথা উল্লেখ করা উচিত । আমি এটি আমার মাউস এবং ইউএসবি কীবোর্ড উভয় ক্ষেত্রেই করেছি এবং আমি সম্পূর্ণ বধির সিস্টেমের সাথে শেষ করেছি :)
অ্যাভিও

1
এটি অত্যন্ত আশ্চর্যজনক হয় যদি এটি স্বয়ংক্রিয়ভাবে মানটিকে 1 এ পুনরায় সেট করে দেয় কারণ এটি 0 তে সেট করা হয় আপনি যে সিস্টেমে ডিভাইসটি "অনুমোদিত" হতে চান না এবং তাই অ্যাক্সেস অযোগ্য।
টিম টিসডাল

2
যে কেউ সুবিধাযুক্তদের | sudo tee ...কাছে যাওয়ার পদ্ধতির দিকে যেতে চেষ্টা করে তার জন্য একটি নোট /sysলিখেছেন: যদি আপনার ইতিমধ্যে আপনার সুডোর শংসাপত্রগুলি ক্যাশে না করা হয় তবে তা খারাপভাবে ভেঙে যায়। sudo sh -c "..."যখন sudo একটি পাসওয়ার্ডের জন্য প্রম্পট প্রয়োজন হয় প্রত্যাশিত হিসাবে কাজ করে।
ssokolow

51

এটি সমস্ত ইউএসবি 1/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

আমি বিশ্বাস করি এটি আপনার সমস্যার সমাধান করবে। আপনি যদি সমস্ত ইউএসবি শেষ পয়েন্ট রিসেট করতে না চান তবে আপনি উপযুক্ত ডিভাইস আইডি ব্যবহার করতে পারেন/sys/bus/pci/drivers/ehci_hcd


দ্রষ্টব্য: [1]: *hci_hcdকার্নেল ড্রাইভাররা সাধারণত ইউএসবি পোর্টগুলি নিয়ন্ত্রণ করে। ohci_hcdএবং uhci_hcdইউএসবি 1.1 পোর্টগুলির জন্য, ইউএসবি 2 পোর্টগুলির জন্য ehci_hcdএবং xhci_hcdইউএসবি 3 পোর্টগুলির জন্য। ( https://en.wikedia.org/wiki/Host_controller_interface_(USB,_Firewire দেখুন )


আপনি কি বিশ্বাস করেন যে এটি কোনও ইউএসবি স্টোরেজ জাগ্রত করতে কাজ করতে পারে ?
কুম্ভ শক্তি

2
যদিও আমি নিম্নলিখিত বার্তাটি পেয়েছি: ls: cannot access /sys/bus/pci/drivers/ehci_hcd/: No such file or directoryএটি সমস্যার সমাধান করেছে, মাউসটি অবিলম্বে কাজ শুরু করেছে started +1
আটটিলা ফুলপ

2
@ ওথিয়াস ওএইচসিআই এবং ইউএইচসিআই হ'ল ইউএসবি 1.1 হোস্ট মান, EHCI হল ইউএসবি 2.0 হোস্ট মান, এবং এক্সএইচসিআই হল ইউএসবি 3.0 হোস্ট স্ট্যান্ডার্ড।
ssokolow

2
এটি একটি সুন্দর সমাধান। যাইহোক, কিছু পরে কার্নেলের এবং অন্যান্য * স্নো ডিস্ট্রিবিউশন, আপনি যে আপনার প্রতিস্থাপন প্রয়োজন পাবেন *hci_hcdসঙ্গে *hci-pci, যেমন hci_hcd চালক ইতিমধ্যে কার্নেল মধ্যে কম্পাইল করা হয়।
not2quit

1
একটি কলা পাইতে দৃশ্যত কোনও পিসিআই বাস নেই, আমাকে নিম্নলিখিতগুলি ব্যবহার করতে হয়েছিল:for i in /sys/bus/usb/drivers/*/*:*; do
মার্টিন হ্যানসেন

10

আমার এটিকে পাইথন স্ক্রিপ্টে স্বয়ংক্রিয় করার দরকার ছিল, তাই আমি লিওলো এর চূড়ান্ত সহায়ক উত্তরটি নীচের সাথে অভিযোজিত করেছি:

#!/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

আমার ক্ষেত্রে এটি ছিল সিপি 210 এক্স ড্রাইভার (যা থেকে আমি বলতে পারি lsmod | grep usbserial), সুতরাং আপনি উপরের স্নিপেটটিকে রিসেট_উস.পি.পি হিসাবে সংরক্ষণ করতে পারেন এবং তারপরে এটি করতে পারেন:

sudo python reset_usb.py cp210x

আপনার সিস্টেমে ইতিমধ্যে যদি এস সি সংকলক সেটআপ না থাকে তবে এটি অজগর রয়েছে এটিও সহায়ক হতে পারে।


আমার জন্য একটি রাস্পবেরি
webo80

1
আপনার সমাধান আরও কয়েকটি শব্দ দয়া করে। উদাহরণস্বরূপ, ধ্রুবক সম্পর্কে কিছু USBDEVFS_RESET। সবসময় সব সিস্টেমে একই হয়?
not2qubit

@ not2qubit USBDEVFS_RESETসমস্ত সিস্টেমের জন্য সমান। এমআইপিএসের জন্য এটি 536892692
ইয়েগরিচ

-tএই স্ক্রিপ্টটি প্রত্যাশা করে ড্রাইভারের তথ্য দেখানোর জন্য lsusb এর নতুন সংস্করণগুলির জন্য আর্গুমেন্ট (ট্রি মোড) লাগবে বলে মনে হচ্ছে , তবে স্ক্রিপ্টটির পরে এই উত্পন্ন করা বিভিন্ন আউটপুট লাইনগুলি পার্স করার জন্য কিছু আপডেটের দরকার আছে
চিতা

এই স্ক্রিপ্টটির অনেক উন্নত সংস্করণের জন্য জিজ্ঞাসা করুন আমার উত্তরটি এখানে জিজ্ঞাসা করুন
ম্যাকারানস

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)

এটি এই প্রশ্নের সেরা উত্তর।
কাপাড

4

যেহেতু প্রশ্নের বিশেষ বিষয়টি ইউএসবিতে একটি ক্যামেরা সহ জিফোটো 2 এর যোগাযোগের সমস্যা, তাই ইউএসবি সংযোগটি পুনরায় সেট করার জন্য gphoto2 এ একটি বিকল্প রয়েছে:

gphoto2 --reset

প্রশ্ন জিজ্ঞাসা করা হলে এই বিকল্পটির উপস্থিতি ছিল না 2010 সালে।


3

রিসেট করার দ্রুততম উপায় হ'ল ইউএসবি নিয়ামক নিজেই রিসেট করা। এটি করলে সংযোগ বিচ্ছিন্ন হয়ে ডিভাইসটিকে নিবন্ধভুক্ত করার জন্য ওদেবকে বল প্রয়োগ করা হবে এবং একবার সক্ষম হয়ে গেলে আপনি রেজিস্ট্রেশন ফিরে পাবেন।

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-pcithis এই সমাধান সম্পর্কে আরও তথ্য (সম্ভবত এটি কোথা থেকে এসেছে?): 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

এবং এটি আমার সিস্টেমড সার্ভিস ফাইল /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 কোন ইউএসবি মডিউলটি পুনরায় লোড করতে হবে তা সনাক্ত করতে সহায়তা করবে (উদাঃ xhci_pci, ehci_pci)।
mcrans 15

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

কেউ কি স্লেজহ্যামার অর্ডার করেছিলেন? এটি অন্যান্য অন্যান্য উত্তর থেকে এখানে একত্রে পাইক করা হয়।

#!/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

চিহ্নিত করুন, আপনি খুঁজে পেয়েছেন যে আনবাইন্ডিংটি সত্যিই প্রয়োজনীয় বা এটি কেবল নিরাপদ পাশে থাকা এখানে?
এনডেমো

এটি একটি স্লেজহ্যামার, এটি সম্ভবত অনেক অপ্রয়োজনীয় কাজ করে
মার্ক কে কোয়ান

@ মারককোয়ান, আপনি এটি কীভাবে ব্যবহার করবেন? কমান্ড আর্গুমেন্টগুলি কি প্রয়োজন / প্রত্যাশিত?
not2qubit

1
@ not2qubit: কোনও কমান্ড-লাইন আর্গুমেন্টের প্রয়োজন নেই। $@উবুন্টু প্রক্সি মাত্র অভ্যাস একটি বল এটা বাগ বাধা দেয় যদি আমি পরে আর্গুমেন্ট যোগ (এবং উবুন্টু প্রক্সি আপডেট করতে ভুলবেন) করার সিদ্ধান্ত নেন হচ্ছে।
কে কে কোয়ান

1
@ মারককোয়ান দোহ! দুঃখিত সঙ্গী! ওহে হ্যাঁ অভিশাপ! আমার ঘুমের সময় এই সাইটে মন্তব্য করা উচিত নয়। সম্মত!
not2qubit

1

কখনও কখনও আমি একটি বিশেষ ডিভাইসে এই অপারেশনটি সম্পাদন করতে চাই, ভিআইডি (বিক্রেতার আইডি) এবং পিআইডি (পণ্য আইডি) দ্বারা চিহ্নিত। এটি একটি স্ক্রিপ্ট যা আমি এই উদ্দেশ্যে দরকারী পেয়েছি, এটি নিফটি লাইবসব লাইব্রেরি ব্যবহার করে।

প্রথম রান:

sudo apt-get install libusb-dev

তারপরে, এই সি ++ ফাইলের রিসেটডভাইস সংযোগটি এই কাজটি করা উচিত, একটি ডিভাইস সংযোগটি পুনরায় সেট করার জন্য যেমন ভিআইডি এবং পিড দ্বারা চিহ্নিত করা হয়।

#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;
}

(আমার ব্যক্তিগত টিআইএল ক্যাটালগ থেকে চুরি হয়েছে: https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )


3
এই স্ক্রিপ্টটি কীভাবে চালিত হয় দয়া করে আপনি তা দেখাতে পারেন ।
জর্জ উদোসেন

নিশ্চিত জিনিস, আমাকে আপডেট করতে দিন।
মার্ভিয়েল

1
@ মারভিয়েল, আমরা এখনও একটি আপডেটের জন্য অপেক্ষা করছি ...
not2qubit

অকেজো হিসাবে ডাউনভোট দরকার
ইউজেন কনকভ

1

নির্দিষ্ট ইউএসবি ডিভাইসটি রিসেট করার জন্য আমি একটি সাধারণ বাশ স্ক্রিপ্ট তৈরি করেছি।

#!/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(কর্নেল.অর্গ) লিনাক্সে অনাহারযুক্ত এইচডিডি পুনরুদ্ধার করা হয়েছে । dmesgবলেছিলেন, এটি 360s এর পরে কমান্ডের সময় নির্ধারণ করেছিল (দুঃখিত, আমি এখানে সিসলগটি অনুলিপি করতে পারি না, সংযুক্ত নেটওয়ার্কগুলি নেই) এবং ড্রাইভটি সম্পূর্ণ স্তব্ধ হয়ে যায়। ডিভাইসটি অ্যাক্সেস করা প্রসেসগুলি কার্নেলে ব্লক করা হয়েছিল, অদৃশ্যযোগ্য। 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

এটি চেষ্টা করুন, এটি একটি সফ্টওয়্যার আনপ্লাগ (ইজেক্ট)।

কখনও কখনও কিছু ডিভাইসের জন্য কেবল আনবাইন্ড ডিভাইস কাজ করে না।

উদাহরণ:

আমি আমার "জিনিয়াস নেটস্ক্রোল 120" মুছতে বা বের করতে চাই।

তারপরে আমি প্রথমে আমার সংযুক্ত ইউএসবি ডিভাইসটি পরীক্ষা করি

$ 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 এবং আইডি প্রোডাক্ট 003a রয়েছে, সুতরাং এটি মাউস সম্পর্কিত একটি রেফারেন্স ডিভাইস তথ্য।

এটি গুরুত্বপূর্ণ, বাস নম্বরটি ডিভাইসের প্রারম্ভিক নাম পথ এবং সঠিক ডিভাইসটি অপসারণের জন্য আমি আইডি এবং বিক্রেতার পণ্যটি যাচাই করব।

$ 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, এবং একের পর এক আমার ফোল্ডারে আমার মাউসের তথ্য সম্পর্কে সঠিক আইডেন্ডেন্ডার এবং আইডি প্রোডাক্ট রয়েছে তা পরীক্ষা করে নিই।

এই ক্ষেত্রে, আমি এই আদেশটি দিয়ে তথ্যটি পুনরুদ্ধার করব:

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"

আবার ইউএসবি ডিভাইস প্লাগ করুন এবং এটি আবার কাজ করছে!


10
আপনি যদি আবার প্লাগ ইন করতে না পারেন তবে কী করবেন? (উদাহরণস্বরূপ এটি একটি অভ্যন্তরীণ
এসডকার্ড

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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.