Можно ли сбросить подключение USB-устройства без физического отключения / подключения от ПК?
В частности, мое устройство представляет собой цифровую камеру. Я использую gphoto2
, но в последнее время я получаю "ошибки чтения устройства", поэтому я хотел бы попытаться выполнить программный сброс соединения.
Из того, что я могу сказать, нет никаких модулей ядра, загружаемых для камеры. Единственный, который выглядит связанным, это usbhid
.
command-line
usb
cmcginty
источник
источник
Ответы:
Сохранить следующее как
usbreset.c
Выполните следующие команды в терминале:
Скомпилируйте программу:
Получите идентификатор шины и устройства USB-устройства, которое вы хотите сбросить:
Сделайте нашу скомпилированную программу исполняемой:
Запустите программу с привилегией sudo; сделать необходимые замены
<Bus>
и<Device>
идентификаторы, найденные с помощьюlsusb
команды:Источник вышеуказанной программы: http://marc.info/?l=linux-usb&m=121459435621262&w=2.
источник
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
usbreset /dev/bus/usb/011/001
это один из корневых хабов 2 usb 3.0lsusb
, он выдает ошибку: «Ошибка в ioctl: каталог», любая идея? Я пробовал на обоих USB 3.0 хабахЯ раньше не сталкивался с вашими конкретными обстоятельствами, поэтому я не уверен, что этого будет достаточно, но я нашел самый простой способ перезагрузить USB-устройство с помощью этой команды: (Внешние приложения не нужны)
Это именно то, что я использую для сброса моего Kinect, поскольку у libfreenect, похоже, нет API для возврата его в спящий режим. Он у меня на Gentoo box, но ядро должно быть достаточно новым, чтобы использовать ту же структуру пути для sysfs.
Ваш, очевидно, не будет,
1-4.6
но вы можете либо извлечь этот путь устройства из журнала ядра (dmesg
), либо использовать что-то вродеlsusb
получения идентификатора производителя и продукта, а затем использовать быструю команду, подобную этой, чтобы увидеть, как эти пути связаны с другим поставщиком. / пары идентификаторов продукта:источник
echo 1 > /sys/bus/usb/devices/whatever/authorized
внутреннего скрипта для повторного включения устройства, как только оно было отключено. Я сделал это как на своей мыши, так и на USB-клавиатуре, и у меня оказалась совершенно глухая система :)| sudo tee ...
подход к привилегированным/sys
записям: это плохо, если у вас еще нет кэшированных учетных данных sudo.sudo sh -c "..."
работает, как и ожидалось, когда sudo нужно запросить пароль.Это сбросит все подключенные порты USB1 / 2/3 [1]:
Я верю, что это решит вашу проблему. Если вы не хотите сбрасывать все конечные точки 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) )источник
ls: cannot access /sys/bus/pci/drivers/ehci_hcd/: No such file or directory
это решило проблему, мышь сразу же заработала. +1*hci_hcd
с*hci-pci
, как водитель hci_hcd уже скомпилирован в ядро.for i in /sys/bus/usb/drivers/*/*:*; do
Мне нужно было автоматизировать это в скрипте Python, поэтому я адаптировал чрезвычайно полезный ответ LiLo к следующему:
В моем случае это был драйвер cp210x (о котором я мог сказать
lsmod | grep usbserial
), так что вы можете сохранить приведенный фрагмент как reset_usb.py, а затем сделать это:Это также может быть полезно, если у вас еще нет настройки компилятора переменного тока в вашей системе, но у вас есть Python.
источник
USBDEVFS_RESET
. Это всегда одинаково для всех систем?USBDEVFS_RESET
одинаков для всех систем. Для MIPS это 536892692.-t
аргументе (древовидном режиме) для отображения информации о драйвере, которую ожидает этот скрипт, но затем сценарию требуются некоторые обновления для анализа различных строк вывода, которые он генерируетЯ создал скрипт Python, который упрощает весь процесс на основе ответов здесь.
Сохраните приведенный ниже скрипт как reset_usb.py или клонируйте этот репозиторий .
Использование:
Автор сценария:
источник
Поскольку частный случай вопроса - это проблема связи gphoto2 с камерой по USB, в gphoto2 есть возможность сбросить USB-соединение:
Возможно, этот вариант не существовал в 2010 году, когда был задан вопрос.
источник
Самым быстрым способом сброса будет сброс самого контроллера USB. Это заставит udev отменить регистрацию устройства при отключении, и регистрация вернется после того, как вы его включите.
Это должно работать для большинства компьютерных сред. Однако, если вы используете какое-то нестандартное оборудование, вы можете просто перебирать имена устройств. С помощью этого метода вам не нужно узнавать имя устройства по lsusb. Вы также можете включить в автоматизированный скрипт.
источник
ehci_hcd
наehci-pci
. Подробнее об этом решении (возможно, откуда оно?): Davidjb.com/blog /Я использую кувалду, перезагружая модули. Это мой скрипт usb_reset.sh:
И это мой файл службы systemd /usr/lib/systemd/system/usbreset.service, который запускает usb_reset.sh после запуска моего менеджера diplay:
источник
rmmod: ERROR: Module xhci_pci is builtin.
Я сделал скрипт Python, который будет сбрасывать определенное устройство USB на основе номера устройства. Вы можете узнать номер устройства из команды lsusb.
например:
В этой строке 004 номер устройства
источник
Вот скрипт, который будет сбрасывать только соответствующий идентификатор продукта / поставщика.
источник
$DIR
пропадает и устройство не видно?Кто-нибудь заказывал кувалду? Это воедино из различных других ответов здесь.
источник
$@
прокси-сервера sudo - это просто сила хаббита, которая предотвращает ошибки, если позже я решу добавить аргументы (и забуду обновить прокси-сервер sudo).Иногда я хочу выполнить эту операцию на определенном устройстве, как указано VID (идентификатор поставщика) и PID (идентификатор продукта). Это скрипт, который я нашел полезным для этой цели, который использует изящную библиотеку libusb.
Первый забег:
Затем этот c ++ файл resetDeviceConnection должен выполнить эту задачу сброса подключения устройства, как указано в vid и pid.
(украдено из моего личного каталога TIL: https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )
источник
Я сделал простой скрипт для перезагрузки определенного USB-устройства.
источник
Возможно, это работает и для камеры:
После я восстановил голодный
USB 3.0
HDD на3.4.42
(kernel.org) Linux на моей стороне.dmesg
сказал, что это было время ожидания команд после 360 секунд (извините, я не могу скопировать системный журнал здесь, не подключенные сети), и диск завис полностью. Процессы доступа к устройству были заблокированы в ядре и не могут быть уничтожены.NFS
висел,ZFS
висел,dd
висел.После этого все снова заработало.
dmesg
рассказал только одну строчку оUSB
найденном устройстве.Я действительно понятия не имею, что делает следующее подробно. Но это сработало.
Следующий пример выводится из Debian Squeeze с
2.6.32-5-686
ядром, поэтому я думаю, что он работает для 2.6 и выше:Если это не работает, возможно, кто-то еще может выяснить, как отправить реальный сброс на устройство.
источник
Попробуйте, это отключение программного обеспечения (Eject).
Иногда не работает просто отсоединить устройство для некоторых устройств.
Пример:
Я хочу удалить или извлечь мой «Genius NetScroll 120».
Тогда я сначала проверь мое подключенное USB-устройство
Хорошо, я нашел свою мышь, она имеет шину 002, устройство 009, idVendor 0458 и idProduct 003a, так что это справочная информация об устройстве мыши.
Это важно, номер шины - это начальный путь к устройству, и я проверю идентификатор продукта и поставщика, чтобы убедиться, что устройство удаляется.
Обратите внимание на папки, проверьте начало с папкой номер 2, я проверю эту, потому что мой Bus - 002, и одну за другой я проверяю каждую папку, содержащую правильные idVendor и idProduct, о моей информации о мыши.
В этом случае я получу информацию с помощью этой команды:
Хорошо, путь /sys/bus/usb/drivers/usb/2-1.3/ совпадает с моей информационной мышью! XDDD.
Пришло время удалить устройство!
Подключите снова USB-устройство, и оно снова работает!
источник
Если вы знаете имя вашего устройства, этот скрипт Python будет работать:
источник