Если вы отредактируете файл / etc / default / grub и измените строку:
GRUB_CMDLINE_LINUX=""
на
GRUB_CMDLINE_LINUX="acpi_backlight=vendor"
, а затем запустите
sudo update-grub
и перезагрузка, вы должны иметь возможность понижать подсветку экрана до полностью черного.
Самый быстрый способ сброса - сброс самого 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
Это должно работать для большинства компьютеров. Однако, если вы используете какое-то специальное оборудование, вы можете просто перебирать имена устройств. С помощью этого метода вам не нужно определять имя устройства lsusb. Вы можете включить также в автоматический сценарий.
Мне нужно было автоматизировать это в сценарии python, поэтому я применил чрезвычайно полезный ответ 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
Это также может быть полезно, если у вас еще нет настройки компилятора в вашей системе, но вы имеют python.
Если вы знаете имя своего устройства, этот скрипт python будет работать:
#!/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()
Сброс всех подключенных портов 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, вы можете использовать соответствующий идентификатор устройства из /sys/bus/pci/drivers/ehci_hcd
Примечания: [1]: драйверы ядра *hci_hcd обычно управляйте портами USB. ohci_hcd и uhci_hcd предназначены для портов USB1.1, ehci_hcd для портов USB2, а xhci_hcd - для портов USB3. (см. https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire))
Я создал скрипт python, который сбросит конкретное USB-устройство на основе номера устройства. Вы можете узнать номер устройства из команды 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()
Возможно, это руководство поможет вам:
Если вас задевает ошибка, которая не позволяет монтировать USB-устройства в Ubuntu Lucid Lynx, проблема вызвана гибким модулем. Отключите его:
sudo modprobe -r floppy
После перезагрузки модуль, вероятно, перезагрузится.
Я создал сценарий Python, который упрощает весь процесс на основе ответов здесь.
Сохраните сценарий ниже как reset_usb.py или клонируйте это репо: https://github.com/mcarans/ resetusb /.
Использование:
python reset_usb.py help: Показать эту справку
sudo python reset_usb.py list: Список всех USB-устройств
sudo python reset_usb.py path / dev / bus / usb / XXX / YYY: Сброс устройства USB с использованием пути / dev / bus / usb / XXX / YYY
sudo python reset_usb.py search "search термины ": поиск устройства USB с использованием условий поиска в строке поиска, возвращаемых списком, и сбойное сопоставление устройства
sudo python reset_usb.py listpci: список всех USB-устройств PCI
sudo python reset_usb.py pathpci /sys/bus/pci/drivers/.../XXXX:XX:XX.X: Сброс устройства PCI USB с использованием пути /sys/bus/pci/drivers/.../XXXX:XX:XX. X
sudo python reset_usb.py searchpci «условия поиска»: поиск устройства PCI USB с использованием условий поиска в строке поиска, возвращаемых listpci, и сброс соответствия ng 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)
Раньше я не находил себя в ваших конкретных обстоятельствах, поэтому я не уверен, что это будет сделано достаточно, но самым простым способом, который я нашел для сброса USB-устройства, является эта команда: (Никаких внешних приложений не требуется )
sudo sh -c "echo 0 > /sys/bus/usb/devices/1-4.6/authorized"
sudo sh -c "echo 1 > /sys/bus/usb/devices/1-4.6/authorized"
Это фактический, который я использую для сброса моего Kinect, поскольку libfreenect, похоже, не имеет API для повторного сна. Он находится в моем ящике Gentoo, но ядро должно быть достаточно новым, чтобы использовать ту же структуру пути для sysfs.
Очевидно, что это не будет 1-4.6, но вы можете либо вытащить этот путь устройства из своего журнала ядра (dmesg), или вы можете использовать что-то вроде lsusb, чтобы получить идентификаторы поставщика и продукта, а затем использовать быструю команду, подобную этой, чтобы указать, как пути связаны с разными парами идентификаторов поставщиков / продуктов:
for X in /sys/bus/usb/devices/*; do
echo "$X"
cat "$X/idVendor" 2>/dev/null
cat "$X/idProduct" 2>/dev/null
echo
done
Поскольку особый случай вопроса - проблема связи gphoto2 с камерой на USB, в gphoto2 есть опция для сброса его USB-соединения:
gphoto2 --reset
Возможно, этот параметр не был существует в 2010 году, когда был задан вопрос.
Возможно, это работает и для камеры:
После оживления голодного USB 3.0 жесткого диска на 3.4.42 (kernel.org) Linux на моей стороне. dmesg сказал, что он отключил команды после 360-х (извините, я не могу скопировать syslog здесь, не подключенные сети), и диск полностью висел. Процессы, обращающиеся к устройству, были заблокированы в ядре, что было неудобно. NFS висела, ZFS висела, dd висела.
После этого все снова работало. dmesg рассказал только одну строку о найденном устройстве USB.
Я действительно не знаю, что следует делать в деталях. Но это сработало.
Следующий пример выводится из Debian Squeeze с ядром 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
Если это не работает , возможно, кто-то еще может понять, как отправить реальный сброс на устройство.
Я использую кувалду, перезаряжая модули. Это мой скрипт usb_reset.sh:
#!/bin/bash
# USB drivers
rmmod xhci_pci
rmmod ehci_pci
# uncomment if you have firewire
#rmmod ohci_pci
modprobe xhci_pci
modprobe ehci_pci
# uncomment if you have firewire
#modprobe ohci_pci
И это мой служебный файл systemd /usr/lib/systemd/system/usbreset.service, который запускает usb_reset.sh после запуска моего диспетчера diplay: [ ! d1] [Unit]
Description=usbreset Service
After=gdm.service
Wants=gdm.service
[Service]
Type=oneshot
ExecStart=/path/to/usb_reset.sh
Попробуйте это, это программное обеспечение отключается (Eject).
Иногда не работает, просто отключайте устройство для некоторых устройств.
Пример:
I хочу удалить или выбросить мой «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**
Хорошо, я нашел свою мышь, у нее есть Bus 002, устройство 009, idVendor 0458 и idProduct 003A, так это информация Опорное устройство о мыши.
Это важно, число автобусов является начать путь имя для устройства и я буду проверять продукт Id и Vendor для обеспечения правильного удаления устройства.
$ 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-устройство снова и снова!
Самый быстрый способ сброса - сброс самого 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
Это должно работать для большинства компьютеров. Однако, если вы используете какое-то специальное оборудование, вы можете просто перебирать имена устройств. С помощью этого метода вам не нужно определять имя устройства lsusb. Вы можете включить также в автоматический сценарий.
Мне нужно было автоматизировать это в сценарии python, поэтому я применил чрезвычайно полезный ответ 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
Это также может быть полезно, если у вас еще нет настройки компилятора в вашей системе, но вы имеют python.
Если вы знаете имя своего устройства, этот скрипт python будет работать:
#!/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()
Сброс всех подключенных портов 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, вы можете использовать соответствующий идентификатор устройства из /sys/bus/pci/drivers/ehci_hcd
Примечания: [1]: драйверы ядра *hci_hcd обычно управляйте портами USB. ohci_hcd и uhci_hcd предназначены для портов USB1.1, ehci_hcd для портов USB2, а xhci_hcd - для портов USB3. (см. https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire))
Я создал скрипт python, который сбросит конкретное USB-устройство на основе номера устройства. Вы можете узнать номер устройства из команды 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()
Возможно, это руководство поможет вам:
Если вас задевает ошибка, которая не позволяет монтировать USB-устройства в Ubuntu Lucid Lynx, проблема вызвана гибким модулем. Отключите его:
sudo modprobe -r floppy
После перезагрузки модуль, вероятно, перезагрузится.
Я создал сценарий Python, который упрощает весь процесс на основе ответов здесь.
Сохраните сценарий ниже как reset_usb.py или клонируйте это репо: https://github.com/mcarans/ resetusb /.
Использование:
python reset_usb.py help: Показать эту справку
sudo python reset_usb.py list: Список всех USB-устройств
sudo python reset_usb.py path / dev / bus / usb / XXX / YYY: Сброс устройства USB с использованием пути / dev / bus / usb / XXX / YYY
sudo python reset_usb.py search "search термины ": поиск устройства USB с использованием условий поиска в строке поиска, возвращаемых списком, и сбойное сопоставление устройства
sudo python reset_usb.py listpci: список всех USB-устройств PCI
sudo python reset_usb.py pathpci /sys/bus/pci/drivers/.../XXXX:XX:XX.X: Сброс устройства PCI USB с использованием пути /sys/bus/pci/drivers/.../XXXX:XX:XX. X
sudo python reset_usb.py searchpci «условия поиска»: поиск устройства PCI USB с использованием условий поиска в строке поиска, возвращаемых listpci, и сброс соответствия ng 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)
Раньше я не находил себя в ваших конкретных обстоятельствах, поэтому я не уверен, что это будет сделано достаточно, но самым простым способом, который я нашел для сброса USB-устройства, является эта команда: (Никаких внешних приложений не требуется )
sudo sh -c "echo 0 > /sys/bus/usb/devices/1-4.6/authorized"
sudo sh -c "echo 1 > /sys/bus/usb/devices/1-4.6/authorized"
Это фактический, который я использую для сброса моего Kinect, поскольку libfreenect, похоже, не имеет API для повторного сна. Он находится в моем ящике Gentoo, но ядро должно быть достаточно новым, чтобы использовать ту же структуру пути для sysfs.
Очевидно, что это не будет 1-4.6, но вы можете либо вытащить этот путь устройства из своего журнала ядра (dmesg), или вы можете использовать что-то вроде lsusb, чтобы получить идентификаторы поставщика и продукта, а затем использовать быструю команду, подобную этой, чтобы указать, как пути связаны с разными парами идентификаторов поставщиков / продуктов:
for X in /sys/bus/usb/devices/*; do
echo "$X"
cat "$X/idVendor" 2>/dev/null
cat "$X/idProduct" 2>/dev/null
echo
done
Поскольку особый случай вопроса - проблема связи gphoto2 с камерой на USB, в gphoto2 есть опция для сброса его USB-соединения:
gphoto2 --reset
Возможно, этот параметр не был существует в 2010 году, когда был задан вопрос.
Возможно, это работает и для камеры:
После оживления голодного USB 3.0 жесткого диска на 3.4.42 (kernel.org) Linux на моей стороне. dmesg сказал, что он отключил команды после 360-х (извините, я не могу скопировать syslog здесь, не подключенные сети), и диск полностью висел. Процессы, обращающиеся к устройству, были заблокированы в ядре, что было неудобно. NFS висела, ZFS висела, dd висела.
После этого все снова работало. dmesg рассказал только одну строку о найденном устройстве USB.
Я действительно не знаю, что следует делать в деталях. Но это сработало.
Следующий пример выводится из Debian Squeeze с ядром 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
Если это не работает , возможно, кто-то еще может понять, как отправить реальный сброс на устройство.
Я использую кувалду, перезаряжая модули. Это мой скрипт usb_reset.sh:
#!/bin/bash
# USB drivers
rmmod xhci_pci
rmmod ehci_pci
# uncomment if you have firewire
#rmmod ohci_pci
modprobe xhci_pci
modprobe ehci_pci
# uncomment if you have firewire
#modprobe ohci_pci
И это мой служебный файл systemd /usr/lib/systemd/system/usbreset.service, который запускает usb_reset.sh после запуска моего диспетчера diplay: [ ! d1] [Unit]
Description=usbreset Service
After=gdm.service
Wants=gdm.service
[Service]
Type=oneshot
ExecStart=/path/to/usb_reset.sh
Попробуйте это, это программное обеспечение отключается (Eject).
Иногда не работает, просто отключайте устройство для некоторых устройств.
Пример:
I хочу удалить или выбросить мой «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**
Хорошо, я нашел свою мышь, у нее есть Bus 002, устройство 009, idVendor 0458 и idProduct 003A, так это информация Опорное устройство о мыши.
Это важно, число автобусов является начать путь имя для устройства и я буду проверять продукт Id и Vendor для обеспечения правильного удаления устройства.
$ 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-устройство снова и снова!
Самый быстрый способ сброса - сброс самого 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
Это должно работать для большинства компьютеров. Однако, если вы используете какое-то специальное оборудование, вы можете просто перебирать имена устройств. С помощью этого метода вам не нужно определять имя устройства lsusb. Вы можете включить также в автоматический сценарий.
Мне нужно было автоматизировать это в сценарии python, поэтому я применил чрезвычайно полезный ответ 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
Это также может быть полезно, если у вас еще нет настройки компилятора в вашей системе, но вы имеют python.
Если вы знаете имя своего устройства, этот скрипт python будет работать:
#!/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()
Сброс всех подключенных портов 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, вы можете использовать соответствующий идентификатор устройства из /sys/bus/pci/drivers/ehci_hcd
Примечания: [1]: драйверы ядра *hci_hcd обычно управляйте портами USB. ohci_hcd и uhci_hcd предназначены для портов USB1.1, ehci_hcd для портов USB2, а xhci_hcd - для портов USB3. (см. https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire))
Я создал скрипт python, который сбросит конкретное USB-устройство на основе номера устройства. Вы можете узнать номер устройства из команды 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()
Возможно, это руководство поможет вам:
Если вас задевает ошибка, которая не позволяет монтировать USB-устройства в Ubuntu Lucid Lynx, проблема вызвана гибким модулем. Отключите его:
sudo modprobe -r floppy
После перезагрузки модуль, вероятно, перезагрузится.