LN-USBreset
USB のリセットの仕方
#!/bin/bash if [[ $EUID != 0 ]] ; then echo This must be run as root! exit 1 fi for xhci in /sys/bus/pci/drivers/?hci_hcd ; do if ! cd $xhci ; then echo Weird error. Failed to change directory to $xhci exit 1 fi echo Resetting devices from $xhci... for i in ????:??:??.? ; do echo -n "$i" > unbind echo -n "$i" > bind done done
$ gcc -O3 -Wall -g usbreset.c -o usbreset
$ gcc -O3 -Wall -g hubpower.c -o hubpower
$ ./usbreset Usage: usbreset PPPP:VVVV - reset by product and vendor id usbreset BBB/DDD - reset by bus and device number usbreset "Product" - reset by product name Devices: Number 001/004 ID 045e:07b2 Microsoft® Nano Transceiver v1.0 Number 001/002 ID 04f3:0103 $ ./usbreset 001/004 Resetting Microsoft® Nano Transceiver v1.0 ... can't open [Permission denied] $ sudo ./usbreset 001/004 Resetting Microsoft® Nano Transceiver v1.0 ... ok $ sudo ./usbreset 045e:07b2 Resetting Microsoft® Nano Transceiver v1.0 ... ok
unbind && bind する
[ unbind ]
# USB番号 1-2.1 を指定して unbind します。 $ echo -n "1-2.1" > /sys/bus/usb/drivers/usb/unbind # USB 1-2.1 ポートが非表示になったことを確認します。 $ lsusb -treturn ... /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 480M |__ Port 2: Dev 2, If 0, Class=Hub, Driver=hub/3p, 480M
[ bind ]
# USB番号 1-2.1 を指定して bind します。 $ echo -n "1-2.1" > /sys/bus/usb/drivers/usb/bind
usb_modeswitch
# あるいは、USB のベンダー番号 1、プロダクト番号 9 を指定して リセット します。
$ usb_modeswitch -v 0x152d -p 0x2338 --reset-usbreturn
Look for default devices ...
product ID matched
Found devices in default mode (1)
Access device 009 on bus 001
Current configuration number is 1
Use interface number 0
USB description data (for identification)
-------------------------
Manufacturer: JMicron
Product: USB to ATA/ATAPI bridge
Serial No.: 45342D6D2A72
-------------------------
Warning: no switching method given. See documentation
Reset USB device .
Device was reset
-> Run lsusb to note any changes. Bye!
# 同じUSBが 2つ以上挿してある場合、
# さらに、USB のバス番号 1、デバイス番号 9 を指定して リセット します。
$ usb_modeswitch -v 0x152d -p 0x2338 -b 1 -g 9 --reset-usbreturn
...
# USB 1-2.1 ポートが表示になったことを確認します。
$ lsusb -treturn
...
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 480M
|__ Port 2: Dev 2, If 0, Class=Hub, Driver=hub/3p, 480M
|__ Port 1: Dev 9, If 0, Class=Mass Storage, Driver=usb-storage, 480M