Bir USB cihazını komut satırından nasıl sıfırlarsınız?


164

PC ile fiziksel olarak bağlantısı kesilmeden / bağlanmadan bir USB cihazının bağlantısını sıfırlamak mümkün müdür?

Özellikle, cihazım dijital bir kamera. Ben kullanıyorum gphoto2, ama son zamanlarda "cihaz hataları oku" olsun, bu yüzden bağlantının yazılım sıfırlama işlemi yapmak için denemek istiyorum.

Söyleyebileceğim kadarıyla, kamera için yüklü çekirdek modülü yok. İlişkili görünen tek şey usbhid.


Hangi Ubuntu sürümünü kullanıyorsunuz?
Kullanıcı

Li Lo ve ssokolow tarafından her iki çözümü de denedim, elde ettiğim tüm izinler reddedildi, usbreset kodunu veya "echo 0> ..." komut satırını kullanırsam nomatter, sudo kullanıyorum, ayrıca usb aygıtlarım da root tarafından sahiplenildi ama Yönetici hakları olmadan bunları kullanabilir (kameralar ..)

1
Okuma hataları alıyorsanız, bazı veri bozulmaları olabilir. Fotoğraf makineniz harici bir hafıza kartı kullanıyorsa (MicroSD gibi), bilgisayara bağlamak ve fsck çalıştırmak akıllıca olabilir.
TSJNachos117

Yanıtlar:


118

Aşağıdakileri farklı kaydet 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;
}

Çalıştır terminalde aşağıdaki komutları:

  1. Programı derleyin:

    $ cc usbreset.c -o usbreset
    
  2. Sıfırlamak istediğiniz USB cihazının Veri Yolu ve Cihaz Kimliğini alın:

    $ lsusb  
    Bus 002 Device 003: ID 0fe9:9010 DVICO  
    
  3. Derlenmiş programımızın çalıştırılabilir olmasını sağlayın:

    $ chmod +x usbreset
    
  4. Programı sudo ayrıcalığı ile yürütün; Gerekli için değişiklik <Bus>ve <Device>çalıştırarak bulduğumuz gibi kimlikleri lsusbkomutunu:

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

Yukarıdaki programın kaynağı: http://marc.info/?l=linux-usb&m=121459435621262&w=2


3
Bu ubuntu 13.10 ile çalışır. Cihaz kimliği değişebilir. Fareyi almak için birkaç kabuk komutunda kodun üstüne 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
sardım

1
harici sürücüm algılanamayacak gibi görünüyor (usb kablosunu yeniden takmam gerekiyor); Bir usb3.0 masaüstü PC portuna bağlı bir usb2.0; Çalıştırdığımda usbreset /dev/bus/usb/011/001, bu 2 usb 3.0 kök hub'larından biri, lsusbhatalar: "ioctl hatası: bir dizin var mı", herhangi bir ideia? Her iki usb 3.0 merkezinde de çalıştım
Kova Gücü

1
Bunu okuyan herkes Ubuntu 16.04'te ("giriş irq durumu -75" ile doldurulmuş dmesg ile) oturum açtıktan sonra (usb) bir fare donmasına sahipse, bunun benim için çalışan tek çözüm olduğunu onaylayabilirim. Teşekkür ederim
Agustin Baez

1
@ Kova, ben de aynı hatayı "ioctl Hata: Bir dizin var" alıyorum. Çözüldü mü?
Ransh

1
Buradaki cevaba bakın , bu yanıtla aynı sıfırlama yöntemini kullanan ancak cihazların basit bir şekilde listelenmesini ve aranmasını sağlayan askubuntu.com/a/988297/558070 .
mcarans

58

Kendimi daha önce sizin kendi şartlarınızda bulamadım, bu yüzden yeterli olup olmayacağından emin değilim, ancak bir USB cihazını sıfırlamak için bulduğum en basit yöntem şudur: (Harici uygulama gerekmez)

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"

Bu benim Kinect'imi sıfırlamak için kullandığım gerçek. Çünkü libfreenect, tekrar uyku moduna geçirecek API yok. Gentoo kutumda, ancak çekirdek, sysfs için aynı yol yapısını kullanacak kadar yeni olmalıdır.

Açıkçası sizinkiler olmazdı, 1-4.6ama bu aygıt yolunu çekirdek günlüğünüzden çekebilirsiniz ( dmesg) ya lsusbda satıcı ve ürün kimliklerini almak gibi bir şey kullanabilirsiniz ve ardından yolların farklı satıcılarla olan ilişkisini listelemek için bu gibi hızlı bir komut kullanın. / ürün kimliği çiftleri:

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:1.0/authorized: oluşturulamıyor: Dizin varolmayan
Nicolas Marchildon

USBfs dosya sisteminin düzenini değiştirmişler gibi görünüyor. Ubuntu'da yeni şeyler yapmanın ne kadar uykulu olmadığımı anlamaya çalışacağım.
ssokolow

9
Teşekkürler harika çalıştı! Belki de echo 1 > /sys/bus/usb/devices/whatever/authorizedcihazı devre dışı bıraktıktan sonra yeniden etkinleştirmek için bir betiğin içinde bir performans göstermekten bahsetmelisiniz . Hem farem hem de usb klavyemde yaptım ve tamamen sağır bir sistemle
bittim

1
Değeri otomatik olarak 1 olarak ayarlamak, 0 olarak ayarlamak, sisteme cihazın "yetkili" olmasını istemediğinizi ve bu nedenle erişilemez demek istediğini söylemek çok garip.
Tim Tisdall

2
| sudo tee ...Ayrıcalıklı /sysyazılara yaklaşmaya çalışan herkes için bir not : Sudo kimlik bilgilerinizi önbelleğe almadıysanız, bu kötü bir şekilde kırılır. sudo sh -c "..."sudo'nun bir şifre sorması gerektiğinde beklendiği gibi çalışır.
ssokolow

51

Bu, USB1 / 2/3 ekli bağlantı noktalarının tümünü [1] sıfırlar:

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

Bunun senin problemini çözeceğine inanıyorum. Tüm USB uç noktalarını sıfırlamak istemiyorsanız, uygun cihaz kimliğini/sys/bus/pci/drivers/ehci_hcd


Notlar: [1]: *hci_hcdçekirdek sürücüleri genellikle USB bağlantı noktalarını kontrol eder. ohci_hcdve uhci_hcdUSB 1.1 bağlantı noktaları için, olan ehci_hcdUSB2 bağlantı noktaları için ve xhci_hcdUSB3 portları içindir. (bkz. https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire) )


Bir usb depolama cihazını uyandırmak için işe yarayacağına inanıyor musunuz?
Kova Gücü

2
Aşağıdaki mesajı almama rağmen: ls: cannot access /sys/bus/pci/drivers/ehci_hcd/: No such file or directorybu sorunu çözdü, fare hemen çalışmaya başladı. +1
Attila Fulop

2
@Otheus OHCI ve UHCI, USB 1.1 ana bilgisayar standartları, EHCI, USB 2.0 ana bilgisayar standardı ve XHCI, USB 3.0 ana bilgisayar standardıdır.
ssokolow

2
Bu güzel bir çözüm. Ancak, daha sonraki çekirdeklerde ve diğer * Nix dağıtımlarında, size yerine gerektiğini bulacaksınız *hci_hcdile *hci-pcihci_hcd sürücüsü zaten çekirdeðinizde gibi.
not2qubit

1
Bir Banana Pi'de, görünüşte PCI veri yolu yok, aşağıdakileri kullanmak zorunda kaldım:for i in /sys/bus/usb/drivers/*/*:*; do
Martin Hansen

10

Bunu bir python betiğinde otomatikleştirmem gerekiyordu, bu yüzden aşağıdakilere LiLo'nun son derece yararlı cevabını uyarladım:

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

Benim durumumda cp210x sürücüsü (ki bundan anlatabilirim lsmod | grep usbserial), bu yüzden yukarıdaki kod parçasını reset_usb.py olarak kaydedebilir ve sonra bunu yapabilirsiniz:

sudo python reset_usb.py cp210x

Sisteminizde zaten bir ac derleyici kurulumu yoksa, ancak pythonunuz varsa, bu yardımcı olabilir.


Ahududu üzerinde benim için çalıştı
webo80

1
Çözümünüzle ilgili birkaç kelime lütfen. Örneğin, sabit hakkında bir şey USBDEVFS_RESET. Tüm sistemler için her zaman aynı mıdır?
not2qubit

@ not2qubit USBDEVFS_RESETtüm sistemler için aynıdır. MIPS için 536892692.
yegorich

Lsusb'nin daha yeni sürümleri, -tbu betiğin beklediğini göstermek için sürücü bilgisine sahip olmak için argümana (ağaç modu) ihtiyaç duyuyor gibi görünüyor , ancak komut dosyasının oluşturduğu farklı çıktı satırlarını ayrıştırmak için bazı güncellemeler gerekiyor
Cheetah

Buradaki cevabın daha da geliştirilmiş bir versiyonu için askubuntu.com/a/988297/558070 adresindeki cevabımı görün .
mcarans

8

Buradaki cevaplara dayanarak tüm süreci basitleştiren bir Python betiği oluşturdum.

Aşağıdaki betiği reset_usb.py olarak kaydedin veya bu repoyu klonlayın .

Kullanımı:

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

Senaryo:

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

bu, bu sorunun en iyi cevabı.
kapad

4

Sorunun özel durumu gphoto2'nin USB üzerindeki bir kamerayla iletişim problemi olması nedeniyle, gphoto2'de USB bağlantısını sıfırlamak için bir seçenek var:

gphoto2 --reset

Belki de soru sorulduğunda 2010'da bu seçenek yoktu.


3

Sıfırlamanın en hızlı yolu, USB denetleyicisinin kendisini sıfırlamak olacaktır. Bunu yapmak, udev'i cihazın bağlantı kesilmesinde kaydını silmeye zorlar ve etkinleştirdikten sonra kayıt işlemi geri döner.

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

Bu, çoğu PC ortamı için çalışmalıdır. Bununla birlikte, bazı özel donanımlar kullanıyorsanız, cihaz adlarını basitçe yineleyebilirsiniz. Bu yöntemle cihazın ismini lsusb ile bulmanız gerekmez. Ayrıca otomatik bir betiğe dahil edebilirsiniz.


1
Bazı, değiştirmek gerekir (Kök / sudo gibi bu komutları çalıştırmak için gereken ve tüm sistemlerde çalışmaz ehci_hcdile ehci-pcigeldiği belki bu çözümün (ilgili daha fazla bilgi'ye):.? Davidjb.com/blog /
2012/06

3

Modülleri yeniden yükleyerek balyoz kullanıyorum. Bu benim usb_reset.sh betiğim:

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

Ve bu, benim sistem yöneticim olan /usr/lib/systemd/system/usbreset.service 'dir. Oyun yöneticim başladıktan sonra usb_reset.sh' ı çalıştırır:

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

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

Buradaki betiğimin listpci seçeneğini kullanmak: askubuntu.com/a/988297/558070 , hangi USB modülünün yeniden yükleneceğini belirlemeye yardımcı olacaktır (örn. Xhci_pci, ehci_pci).
Mcarans

2
Maalesef sistemimde bu çekirdek modülleri çekirdekten ayrı değil, bu yüzden işe yaramayacak:rmmod: ERROR: Module xhci_pci is builtin.
unfa

3

Cihaz numarasına göre belirli bir USB cihazını sıfırlayacak bir python betiği hazırladım. Cihaz numarasını lsusb komutundan öğrenebilirsiniz.

Örneğin:

$ lsusb

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

Bu dizgede 004 cihaz numarasıdır

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()

Bu çözümü sevdim! Ben kendi zevke komut dosyasına birkaç ince ayar yaptık: gist.github.com/willstott101/7a455817ec6f4b8d89571ce72bdfd34a
Will S

2

İşte yalnızca eşleşen bir ürün / satıcı kimliğini sıfırlayacak komut dosyası.

#!/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
Komut dosyanızın yararlı olduğunu gördüm. Ama $DIRkayboluyor ve cihaz görünmüyorsa ne yapmalıyım ?
Eugen Konkov 13:17

1

Biri bir balyoz istedi mi? Bu, burada diğer çeşitli cevaplardan bir araya getirilmiştir.

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

Mark, çözmenin gerçekten gerekli olduğunu mu buldun yoksa burada mı sadece güvenli taraftasın?
saat

Bu bir balyoz, muhtemelen çok fazla gereksiz şey yapıyor
Mark K Cowan

@MarkKCowan, Nasıl kullanıyorsunuz? İhtiyaç duyulan / beklenen komut argümanları nelerdir?
not2qubit

1
@ not2qubit: Komut satırı argümanı gerekli değil. $@Sudo vekaleten daha sonra argümanları ekleyin (ve sudo vekil güncellemeyi unutmayın) karar verirseniz böcekleri engeller sahip sadece habbit bir kuvvettir.
Mark K Cowan,

1
@MarkKCowan Doh! Üzgünüm dostum! Ah lanet evet! Uykulu iken bu siteye yorum yapmamalıyım. Upvoted!
not2qubit 21:17

1

Bazen bu işlemi VID (satıcı kimliği) ve PID (ürün kimliği) ile tanımlanan belirli bir cihazda yapmak istiyorum. Bu, güzel libusb kütüphanesini kullanan, bu amaç için faydalı bulduğum bir betik.

İlk çalıştırma:

sudo apt-get install libusb-dev

Daha sonra, bu c ++ dosyasının resetDeviceConnection cihazı, vid ve pid ile tanımlandığı şekilde bir cihaz bağlantısını sıfırlamak için bu görevi gerçekleştirmelidir.

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

(kişisel TIL kataloğumdan çalındı: https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )


3
Lütfen bu betiğin nasıl çalıştığını gösterebilir misin ?
George Udosen

Tabii ki, güncellememe izin ver.
Marviel

1
@Marviel, hala bir güncelleme bekliyoruz ...
not2qubit

işe yaramaz olarak aşağı oy vermesi gerekiyor
Eugen Konkov

1

Belirli bir USB cihazını sıfırlamak için basit bir bash betiği yaptım.

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

Belki bu da bir kamera için çalışır:

Ardından benim tarafımda (kernel.org) Linux'ta aç kalmış bir USB 3.0HDD canlandı 3.4.42. dmesg360'lardan sonra komutların zaman aşımına uğradığını söyledi (üzgünüm, syslog'u buraya kopyalayamıyorum, ağlara bağlı değil) ve sürücü tamamen askıda kaldı. Aygıta erişen işlemler çekirdek içinde engelleniyordu, okunamıyordu. NFSasılı, ZFSasılı, ddasılı.

Bunu yaptıktan sonra her şey tekrar çalıştı. Bulunan cihaz dmesghakkında sadece tek bir satır anlattı USB.

Aşağıdakilerin ayrıntılı olarak ne yaptığı hakkında hiçbir fikrim yok. Ama işe yaradı.

Aşağıdaki örnek çıktı, 2.6.32-5-686çekirdekli Debian Squeeze'den geliyor , bu nedenle 2.6 ve üzeri sürümlerde çalıştığını düşünüyorum:

$ 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

Bu işe yaramazsa, belki de başka biri cihaza nasıl gerçek bir sıfırlama gönderileceğini bulabilir.


0

Bunu dene, bu bir yazılım fişi.

Bazen bazı aygıtlar için aygıtın bağlantısını kolayca kaldırmaz.

Örnek:

"Genius NetScroll 120" yazılımımı kaldırmak veya çıkarmak istiyorum.

Sonra ilk takılı usb cihazımı kontrol ediyorum

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

Tamam, faremi buldum, bir Bus 002, Cihaz 009, idVendor 0458 ve idProduct 003a'ya sahip, yani bu, fare hakkında bir referans cihazı bilgisidir.

Bu önemlidir, Veriyolu numarası cihaza başlangıç ​​adı yoludur ve çıkarılacak doğru cihazın olduğundan emin olmak için ürün kimliğini ve Satıcısını kontrol edeceğim.

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

Klasörlere dikkat edin, 2 numaralı klasörün başlangıcını kontrol edin, bunu kontrol edeceğim, çünkü veriyolum 002, ve birer birer birer birer fare bilgim hakkında doğru idVendor ve idProduct içeren her klasörü kontrol ettim.

Bu durumda, bu komutu kullanarak bilgiyi alacağım:

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

Tamam, /sys/bus/usb/drivers/usb/2-1.3/ yolu bilgi faremle eşleşiyor! XDDD.

Cihazı çıkarmanın zamanı geldi!

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

USB cihazını tekrar takın ve tekrar çalışın!


10
Ya tekrar takamazsanız? (örneğin, dahili bir sdcard okuyucu)
aleb

0

Cihazınızın adını biliyorsanız, bu python betiği çalışacaktır:

#!/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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.