トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

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