RaspberryPi[41] USBポートのリセット

GPSをつないでソフトを書いていると、CTL-Cでプロセスを止めることがよくあります。そんなとき、再度プログラムを動かすとUSBを認識しなくなります。ポート自体は開いているようで、特にOPENでエラーは帰ってこずにNMEAが受信されなくなります。こんな時は、USBを抜き差ししてあげればよいのですが、回数を重ねると面倒なので、USBポートリセットをしてみました。ネット上では、unbind bind を使うものが多く上がっていましたが、どうしてもうまくいきません。しかし、調べてみると、usb_modeswitchコマンドでリセットできるようです。こちらのほうが簡単でうまくいきました。使い方は、man usb_modeswitch を見てもらえばわかると思います。私はVenderIDとProductID で使用しました。リセットしたいUSBを刺した状態で以下のコマンドを打ちます。


$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 012: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 011: ID 04fe:0007 PFU, Ltd PFU-68 USB Keyboard
Bus 001 Device 010: ID 04fe:0008 PFU, Ltd Generic USB Hub
Bus 001 Device 009: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 004: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 013: ID 067b:23c3 Prolific Technology, Inc. USB-Serial Controller 
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

つながっているUSBのリストが出ます。ここでリセットしたいUSBを抜いた状態でもう一度やります。

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 012: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 001 Device 011: ID 04fe:0007 PFU, Ltd PFU-68 USB Keyboard
Bus 001 Device 010: ID 04fe:0008 PFU, Ltd Generic USB Hub
Bus 001 Device 009: ID 05e3:0610 Genesys Logic, Inc. Hub
Bus 001 Device 004: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

そうすると、リセットしたいUSBが表示されなくなるので、対象のUSBは

Bus 001 Device 013: ID 067b:23c3 Prolific Technology, Inc. USB-Serial Controller

であることがわかります。この場合、VenderIDが067b ProductIDが23c3になります。

実際のリセット方法は以下になります。root 権限の実行なので、sudo をつけておきます。

これをシェルスクリプトに書いておけば一発でリセットできます。man によると、–reset-usb は -R でもよいみたいです。

$sudo usb_modeswitch -v 0x67b -p 0x23c3 --reset-usb

Look for default devices ...
 Found devices in default mode (1)
Access device 013 on bus 001
Get the current device configuration ...
Current configuration number is 1
Use interface number 0
 with class 255
Warning: no switching method given. See documentation
Reset USB device .
 Device was reset
-> Run lsusb to note any changes. Bye!