명령 줄에서 USB 장치를 어떻게 재설정합니까?


164

PC에서 물리적으로 연결을 끊거나 연결하지 않고 USB 장치의 연결을 재설정 할 수 있습니까?

특히 내 장치는 디지털 카메라입니다. 을 사용 gphoto2하고 있지만 최근에 "장치 읽기 오류"가 발생하여 연결의 소프트웨어 재설정을 시도하고 싶습니다.

내가 알 수 있듯이 카메라에로드되는 커널 모듈이 없습니다. 관련성이있는 유일한 것은 usbhid입니다.


어떤 버전의 Ubuntu를 사용하고 있습니까?
사용자

나는 Li Lo와 ssokolow에 의해 두 가지 솔루션을 모두 시도했다. 관리자 권한없이 사용할 수 있습니다 (카메라 ..)

1
읽기 오류가 발생하면 일부 데이터가 손상되었을 수 있습니다. 카메라가 외부 메모리 카드 (예 : MicroSD)를 사용하는 경우 컴퓨터에 연결하고 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 장치의 버스 및 장치 ID를 가져옵니다.

    $ lsusb  
    Bus 002 Device 003: ID 0fe9:9010 DVICO  
    
  3. 컴파일 된 프로그램을 실행 가능하게 만드십시오.

    $ chmod +x usbreset
    
  4. sudo 권한으로 프로그램을 실행하십시오. 다음 명령 을 실행하여 찾은대로 필요한 ID <Bus><Device>ID를 대체 하십시오 lsusb.

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

위 프로그램의 출처 : http://marc.info/?l=linux-usb&m=121459435621262&w=2


3
이것은 우분투 13.10에서 작동합니다. 장치 ID는 다를 수 있습니다. 마우스를 사용하려면 몇 가지 쉘 명령으로 코드 위에 래핑했습니다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 케이블을 다시 연결해야합니다). usb3.0 데스크탑 PC 포트에 연결된 usb2.0입니다. usbreset /dev/bus/usb/011/001에서 2 개의 USB 3.0 루트 허브 중 하나를 실행 하면 lsusb"ioctl의 오류 : 디렉토리가 있습니다"라는 오류가 발생합니다. 나는 두 USB 3.0 허브를 모두 시험해 보았다
Aquarius Power

1
이 글을 읽는 사람이 Ubuntu 16.04에 로그인 한 후 (usb) 마우스가 멈 추면 (dmesg가 "input irq status -75"로 채워짐), 이것이 이것이 나에게 유일한 해결책이라는 것을 확인할 수 있습니다. 감사합니다
Agustin Baez

1
@ Aquarius, "ioctl의 오류 : 디렉토리입니다"라는 동일한 오류가 발생합니다. 해결 되었습니까?
ransh

1
이 답변과 동일한 재설정 방법을 사용하지만 장치 목록을 간단하게 검색 할 수있는 askubuntu.com/a/988297/558070에서 내 답변을 참조하십시오 .
mcarans

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"

libfreenect가 다시 절전 모드로 전환하기위한 API가없는 것 같아서 Kinect를 재설정하는 데 실제로 사용합니다. 내 젠투 상자에 있지만 커널은 sysfs에 대해 동일한 경로 구조를 사용할 수있을 정도로 새 것이어야합니다.

분명히 그렇지는 1-4.6않지만 커널 로그에서 해당 장치 경로를 가져 dmesg오거나 ( ) lsusb공급 업체 및 제품 ID를 가져 오기 위해 다음과 같은 빠른 명령을 사용하여 경로가 다른 공급 업체와 관련되는 방법을 나열 할 수 있습니다. / 제품 ID 쌍 :

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 만들 수 없습니다 : 디렉토리 존재하지 않는을
니콜라스 Marchildon에게

그들은 usbfs 파일 시스템의 레이아웃을 변경 한 것 같습니다. 내가 졸지 않으면 우분투에서 새로운 일을하는 방법을 알아 내려고 노력할 것입니다.
ssokolow

9
감사합니다. echo 1 > /sys/bus/usb/devices/whatever/authorized장치가 비활성화 되 자마자 장치를 다시 활성화하기 위해 스크립트 내부 를 수행해야 할 수도 있습니다 . 나는 내 마우스와 USB 키보드에서 그것을했고 나는 완전히 귀머거리 시스템으로 끝났다 :)
Avio

1
값을 0으로 설정하면 시스템에 장치를 "권한"하지 않기 때문에 액세스 할 수 없음을 알리기 때문에 값을 1로 자동 재설정하면 매우 이상합니다.
Tim Tisdall

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


참고 : [1] : *hci_hcd커널 드라이버는 일반적으로 USB 포트를 제어합니다. ohci_hcduhci_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
Attila Fulop

2
@Otheus OHCI 및 UHCI는 USB 1.1 호스트 표준이고, EHCI는 USB 2.0 호스트 표준이며, XHCI는 USB 3.0 호스트 표준입니다.
ssokolow

2
이것은 아름다운 해결책입니다. 그러나 일부 나중에 커널 및 기타 * 괜찬아 배포판에, 당신은 당신이 대체 할 필요가 있음을 발견 할 것이다 *hci_hcd으로 *hci-pcihci_hcd 드라이버가 이미 커널로 컴파일 될 때,.
not2qubit

1
바나나 파이에는 PCI 버스가없는 것 같습니다. 다음을 사용해야했습니다.for i in /sys/bus/usb/drivers/*/*:*; do
Martin Hansen

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

시스템에 ac 컴파일러 설정이 없지만 파이썬이있는 경우에도 도움이 될 수 있습니다.


Raspberry에서 나를 위해 일했습니다
webo80

1
귀하의 솔루션에 대한 몇 가지 단어를 추가하십시오. 예를 들어, constant에 관한 것 USBDEVFS_RESET입니다. 모든 시스템에서 항상 동일합니까?
not2qubit

@ not2qubit USBDEVFS_RESET는 모든 시스템에서 동일합니다. MIPS의 경우 536892692입니다.
yegorich

최신 버전의 lsusb는 -t이 스크립트가 예상하는 드라이버 정보를 표시하기 위해 인수 (트리 모드) 가 필요한 것 같습니다 . 그러나 스크립트는 이것이 생성하는 다른 출력 라인을 구문 분석하기 위해 약간의 업데이트가 필요합니다
Cheetah

이 스크립트의 훨씬 향상된 버전에 대한 내 대답은 여기 askubuntu.com/a/988297/558070 을 참조하십시오 .
mcarans

8

여기에 답변을 기반으로 전체 프로세스를 단순화하는 Python 스크립트를 만들었습니다.

아래 스크립트를 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

문제의 특별한 경우는 gphoto2와 USB가 연결된 카메라의 통신 문제이므로 gphoto2에는 USB 연결을 재설정하는 옵션이 있습니다.

gphoto2 --reset

이 옵션은 질문이있을 때 2010 년에 존재하지 않았을 수 있습니다.


3

재설정하는 가장 빠른 방법은 USB 컨트롤러 자체를 재설정하는 것입니다. 이렇게하면 연결이 끊어지면 udev가 장치 등록을 취소하게되며 활성화하면 등록이 다시 시작됩니다.

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

대부분의 PC 환경에서 작동합니다. 그러나 일부 사용자 지정 하드웨어를 사용하는 경우 간단히 장치 이름을 반복 할 수 있습니다. 이 방법을 사용하면 lsusb로 장치 이름을 찾을 필요가 없습니다. 자동화 된 스크립트에도 통합 할 수 있습니다.


1
일부에, 당신은 교체해야합니다 (당신은 루트 / sudo는 이러한 명령을 실행해야하고, 모든 시스템에서 작동하지 않습니다 ehci_hcd와 함께 ehci-pci이 온 아마이 솔루션 (에 대한 자세한 정보) :.? davidjb.com/blog을 / 2012 / 06 /…
Lambart

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

그리고 이것은 내 diplay 관리자가 시작된 후 usb_reset.sh를 실행하는 시스템 서비스 파일 /usr/lib/systemd/system/usbreset.service입니다.

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

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

여기 내 스크립트의 listpci 옵션을 사용 : askubuntu.com/a/988297/558070가 (. 예를 들어 xhci_pci, ehci_pci) 다시로드 할 수있는 USB 모듈을 식별하는 데 도움이됩니다.
mcarans

2
불행히도 내 시스템에서 이러한 커널 모듈은 커널과 분리되어 있지 않으므로 작동하지 않습니다.rmmod: ERROR: Module xhci_pci is builtin.
unfa

3

장치 번호에 따라 특정 USB 장치를 재설정하는 Python 스크립트를 만들었습니다. 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
Will S

2

다음은 일치하는 제품 / 공급 업체 ID 만 재설정하는 스크립트입니다.

#!/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사라지고 장치가 보이지 않으면 어떻게해야 합니까?
Eugen Konkov

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

마크, 당신은 바인딩 해제가 정말로 필요하다는 것을 알았습니까?
ndemou

이것은 쇠 망치, 그것은 아마 불필요하게 많은 것들을 않습니다
마크 K 코완

@MarkKCowan, 어떻게 사용합니까? 어떤 명령 인수가 필요 / 예상됩니까?
not2qubit

1
@ not2qubit : 명령 줄 인수가 필요하지 않습니다. $@sudo는 프록시에 내가 나중에 인수를 추가 (그리고 sudo는 프록시를 업데이트하는 것을 잊지)하기로 결정한 경우이 버그를 방지 가지고, 단지 habbit의 힘이다.
마크 K 코완

1
@MarkKCowan Doh! 미안 친구! 아, 저주 야! 졸린 상태에서이 사이트에 대해 언급해서는 안됩니다. 공감!
not2qubit

1

때로는 VID (공급 업체 ID) 및 PID (제품 ID)로 식별되는 특정 장치에서이 작업을 수행하려고합니다. 이것은 멋진 libusb 라이브러리를 사용하는이 목적에 유용한 스크립트입니다.

첫 실행 :

sudo apt-get install libusb-dev

그런 다음이 c ++ 파일의 resetDeviceConnection은 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
스크립트 가 어떻게 실행 되는지 보여줄 수 있습니다 .
George Udosen

물론 업데이트하겠습니다.
Marviel

1
@Marviel, 우리는 여전히 업데이트를 기다리고 있습니다 ...
not2qubit

요구는 쓸모 downvote
오이겐 Konkov에게

1

특정 USB 장치를 재설정하기 위해 간단한 bash 스크립트를 만들었습니다.

#!/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.03.4.42(kernel.org) Linux에서 굶주린 HDD를 부활 시켰습니다 . dmesg360 년대 이후 명령이 시간 초과되고 (죄송합니다. 연결 된 네트워크가 아닌 여기에 syslog를 복사 할 수 없습니다) 드라이브가 완전히 중단되었습니다. 장치에 액세스하는 프로세스는 커널에서 차단되어 처리 할 수 ​​없습니다. NFS숙취는 ZFS걸, dd걸.

이렇게 한 후에 모든 것이 다시 작동했습니다. 찾은 장치 dmesg에 대해 단 한 줄만 알려주었습니다 USB.

다음 내용이 무엇인지 자세히 알지 못합니다. 그러나 효과가있었습니다.

다음 예제 출력은 2.6.32-5-686커널이있는 Debian Squeeze의 출력 이므로 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

이것을 시도하십시오, 그것은 소프트웨어 플러그를 뽑습니다 (꺼내기).

때로는 일부 장치의 경우 단순히 바인딩 해제 장치가 작동하지 않습니다.

예:

"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, idVendor 0458 및 idProduct 003a가 있으므로 마우스에 대한 참조 장치 정보입니다.

이것은 버스 번호가 장치의 시작 이름 경로이며 중요한 장치를 제거하기 위해 제품 ID 및 공급 업체를 확인하는 것이 중요합니다.

$ 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 리더기)
aleb

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.