Hogyan állíthatja vissza az USB eszközt a parancssorból?

142

Lehetséges az USB-eszköz kapcsolatának alaphelyzetbe állítása, anélkül, hogy fizikailag leválasztaná a számítógépet?

Speciálisan az én készülékem digitális fényképezőgép. gphoto2 -ot használok, de az utóbbi időben "eszközök olvasási hibáit" kaptam, ezért szeretnék próbálkozni a kapcsolat újraindításával.

Amit tudok, a rendszermag modulok nem töltődnek be a kamerához. Az egyetlen, amely kapcsolatban áll,usbhid.

    
készlet cmcginty 01.08.2010 21:46
forrás

16 válasz

105

A következőket mentseusbreset.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;
}

A következő parancsok futtatása a terminálon:

  1. A program összeállítása:

    $ cc usbreset.c -o usbreset
    
  2. Keresse meg a visszaállítani kívánt USB-eszköz busz- és eszközazonosítóját:

    $ lsusb  
    Bus 002 Device 003: ID 0fe9:9010 DVICO  
    
  3. Végezze el a fordított program futtatható változatát:

    $ chmod +x usbreset
    
  4. Végezze el a programot sudo jogosultsággal; szükség van a<Bus> és<Device> ids helyettesítésére alsusb parancs futtatásával:

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

A fenti program forrásai: link

    
válasz adott Li Lo 02.08.2010 04:27
forrás
48

Nem találtam magam az Ön konkrét körülményei között, tehát nem vagyok biztos benne, hogy elég lesz-e, de a legegyszerűbb módja annak, hogy az USB-eszközt alaphelyzetbe állítsam, ez a parancs: (Nincs szükség külső alkalmazásokra )

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"

Ez az a tényleges, amellyel visszaállítom a Kinect-et, mivel a libfreenect úgy tűnik, nincs API-ja, hogy visszaállítsa. A Gentoo dobozon van, de a rendszermagnak elégnek kell lennie ahhoz, hogy ugyanazt az útvonalstruktúrát használja a sysfs-hez.

Ön nyilvánvalóan nem lenne1-4.6, de az eszköz elérési útvonalát a rendszermagnaplóból (dmesg) vagy azlsusb -ból például az eladó és a termékazonosító, majd gyors paranccsal írja be, hogyan lehet az elérési útvonalak különböző szállító / termékazonosító párhoz kapcsolódni:

for X in /sys/bus/usb/devices/*; do 
    echo "$X"
    cat "$X/idVendor" 2>/dev/null 
    cat "$X/idProduct" 2>/dev/null
    echo
done
    
válasz adott ssokolow 13.09.2011 08:56
forrás
38

Ez visszaállítja az USB1 / 2/3 mellékelt portokat [1]:

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

Úgy gondolom, ez megoldja a problémát. Ha nem akarja visszaállítani az összes USB végpontot, használhatja a megfelelő eszközazonosítót a (z)/sys/bus/pci/drivers/ehci_hcd

Megjegyzés: [1]: a*hci_hcd rendszermag-illesztőprogramok általában az USB-portokat vezérlik. ohci_hcd ésuhci_hcd az USB1.1 portokhoz, aehci_hcd az USB2 portokhoz ésxhci_hcd az USB3 portokhoz. (lásd: link )

    
válasz adott Tamás Tapsonyi 04.05.2013 13:02
forrás
9

Szükségem volt egy Python scriptbe automatizálni ezt, ezért a LiLo rendkívül hasznos válaszát adaptáltam:

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

Az én esetemben a cp210x illesztőprogram volt (amit alsmod | grep usbserial -ról tudtam megmondani), így mentheti a fenti kódrészletet reset_usb.py formátumban, majd ezt:

sudo python reset_usb.py cp210x

Ez akkor is hasznos lehet, ha még nem rendelkezik c-fordítóprogrammal a rendszereden, de van python is.

    
válasz adott Peter 02.03.2015 21:38
forrás
4

A modulok újratöltésével újfajta pengetőt használok. Ez az én usb_reset.sh szkript:

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

És ez az én systemd szolgáltatásfájl /usr/lib/systemd/system/usbreset.service, amely az usb_reset.sh fájlt futtatja a diplay manager kezdése után:

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

[Service]
Type=oneshot
ExecStart=/path/to/usb_reset.sh
    
válasz adott Ulrich-Lorenz Schlüter 09.01.2016 11:18
forrás
4

A kérdés különleges esete a gphoto2 kommunikációs problémája az USB-kamerával, lehetőség van a gphoto2-re az USB-kapcsolat visszaállításához:

gphoto2 --reset

Talán ez a lehetőség 2010-ben nem állt fenn, amikor feltették a kérdést.

    
válasz adott mviereck 31.08.2016 15:19
forrás
3

A leggyorsabb visszaállítás módja az USB vezérlő alaphelyzetbe állítása. Ehhez érvényt fog adni az udev-nek, hogy feloldja a készüléket a kapcsolat lekapcsolásakor, és regisztráljon, ha engedélyezi.

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

Ez a legtöbb PC környezetben működik. Ha azonban egyéni hardvert használsz, egyszerűen átírhatod az eszköz nevét. Ezzel a módszerrel nem kell megkeresnie az eszköz nevét az lsusb segítségével. Automata szkriptbe is beillesztheted.

    
válasz adott chandank 24.11.2014 20:34
forrás
2

Python scriptet készítettem, amely egy adott USB-eszközt alaphelyzetbe állít az eszközszám alapján. Az eszköz számát megtalálhatja az lsusb parancsból.

például:

$ lsusb

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

Ebben a 004 karakterláncban a készülék száma

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()
    
válasz adott Raghu 07.09.2016 13:42
forrás
2

Itt van a szkript, amely csak egy megfelelő termék / szállító azonosítót állít vissza.

#!/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
    
válasz adott cmcginty 30.04.2017 05:50
forrás
2

létrehoztam egy Python scriptet, amely leegyszerűsíti az egész folyamatot a válaszok alapján.

Mentse az alábbi parancsfájlt reset_usb.py fájlként, vagy klónozza ezt a repo-t: link .

Használat:

python reset_usb.py segítség: A súgó megjelenítése

sudo python reset_usb.py lista: Összes USB-eszköz listázása

sudo python reset_usb.py elérési út / dev / bus / usb / XXX / YYY: Az USB-eszköz alaphelyzetbe állítása az / dev / bus / usb / XXX / YYY elérési útvonalon

sudo python reset_usb.py keresés "keresési kifejezések": Keresés az USB-eszközön a keresési kifejezéseken belül a kereséslistán szereplő és a megfelelő eszköz visszaállítása után

sudo python reset_usb.py listpci: Összes PCI USB-eszköz listázása

sudo python reset_usb.py pathpci /sys/bus/pci/drivers/.../XXXX:XX:XX.X: Állítsa vissza a PCI USB eszközt az /sys/bus/pci/drivers/.../XXXX elérési útja segítségével : XX: XX.X

sudo python reset_usb.py searchpci "keresési kifejezések": PCI USB-eszköz keresése a keresési kifejezések használatával a listpci által visszaadott keresőszavakban és a megfelelő eszköz visszaállítása

#!/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)
    
válasz adott mcarans 21.12.2017 11:15
forrás
1

Vajon valaki pénzt rendelt? Ezt másféle válaszokból is összeillesztettük.

#!/bin/bash

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

cd /sys/bus/pci/drivers

function reinit {(
        local d=""
        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
    
válasz adott Mark K Cowan 28.06.2016 16:08
forrás
1

Néha ezt a műveletet egy bizonyos eszközön szeretném végrehajtani, amint azt a VID (szállítóazonosító) és a PID (termékazonosító) jelöli. Ez a forgatókönyv hasznosnak találja ezt a célt, amely a bájos libusb könyvtárat használja.

Első futás:

sudo apt-get install libusb-dev

Ezután a c ++ fájl resetDeviceConnection-jének ezt a feladatot végre kell hajtania, a vid és pid által azonosított eszközkapcsolat visszaállításához.

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

(lopott az én személyes TIL katalógusomból: link )

    
válasz adott Marviel 29.12.2016 14:53
forrás
0

Talán ez egy kamera számára is működik:

Miután aUSB 3.0 (kernel.org) Linux oldalán újra ébredtem az éhes3.4.42 HDD-t. dmesg azt mondta, hogy a parancsok időzítése után 360s (sajnálom, nem tudom másolni a rendszert itt, nem csatlakoztatott hálózatok), és a meghajtó lógott teljesen. Az eszközhöz hozzáférő folyamatok blokkoltak a rendszermagban, kiküszöbölhetetlenek. NFS lógott,ZFS lógott,dd lógott.

Miután ezt megtettük, minden újra működött. dmesg csak egy sorban szólt aUSB eszközről.

Nem tudom, mi következik részletesen. De ez működött.

A következő példa a Debian Squeeze2.6.32-5-686 kernelből származik, úgy gondolom, hogy a 2.6-os és újabb verziókkal működik:

$ 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

Ha ez nem működik, talán valaki más kitalálhatja, hogyan küldhet vissza valódi alaphelyzetet egy eszközre.

    
válasz adott Tino 06.06.2013 02:08
forrás
0

Próbálja ki, ez egy szoftvercsatlakoztatás (Eject).

Néha nem működik egyszerűen megakadályozza az eszközt egyes eszközökön.

Példa:

Szeretném eltávolítani vagy eltávolítani a "Genius NetScroll 120" -t.

Aztán először ellenőrizem a csatolt usb-eszközt

$ 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**

Ok, megtaláltam az egeret, 002-es busz, 009-es eszköz, idVendor 0458 és idProduct 003a, így ez egy referencia eszköz információ az egérrel kapcsolatban.

Ez fontos, a busz szám a készülék kezdési neve, és ellenőrizem a termékazonosítót és a szállítót, hogy biztosítsák a megfelelő eszköz eltávolítását.

$ 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/

Figyelje a mappákat, ellenőrizze a kezdeteket a 2. számú mappával, ellenőrizni fogom ezt, mert a buszom 002, és egyenként megnéztem minden helyes idVendor és idProduct mappát az egér adatairól.

Ebben az esetben a parancsot a következő paranccsal fogom letölteni:

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

Ok, az /sys/bus/usb/drivers/usb/2-1.3/ elérési útja az info-egérrel! XDDD.

Ideje eltávolítani az eszközt!

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

Csatlakoztassa ismét az usb eszközt, és újra működik!

    
válasz adott user242078 31.01.2014 12:15
forrás
0

Ha tudja az eszköz nevét, akkor ez a python script fog működni:

#!/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()
    
válasz adott Clay 04.08.2017 16:35
forrás
-2

Talán ez az útmutató segíthet:

Ha a hiba a Ubuntu Lucid Lynxbe ágyazott USB-eszközöket tiltja, a hibát a floppy modul okozza. Tiltsa le:

sudo modprobe -r floppy

Az újraindítás után a modul valószínűleg újratölti.

    
válasz adott User 01.08.2010 22:16
forrás