Raspberry PiにてUSBデバイスがフリーズした時に、現場対応しなくてもコマンド入力により「USBデバイスを論理的に抜き差しする方法」を調べてみました。
リンク
方法1.USB をリセットしてみる
USBデバイスの「ベンダーID:プロダクトID」確認
・「Realtek Semiconductor Corp. RTL2838 DVB-T」を再起動する場合
lsusb
Bus 001 Device 008: ID 0d8c:000c C-Media Electronics, Inc. Audio Adapter
Bus 001 Device 007: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T
Bus 001 Device 006: ID 1a40:0101 Terminus Technology Inc. Hub
Bus 001 Device 005: ID 3275:0080 VidzMedia Pte Ltd
lsusb コマンドの出力情報
Bus : バス番号
Device : デバイス番号
ID : ベンダーID:プロダクトID
最後の文字列 : マニュファクチャ名 プロダクト名
リセットしたい ベンダー番号(ここでは、0bda) 、プロダクト番号(ここでは 2838) を使います。
sudo usb_modeswitch -v 0x0bda -p 0x2838 --reset-usb
方法2.USBのunbind / bind
# Device番号の取得
dmesg | grep Product:
[ 2.606891] usb usb1: Product: DWC OTG Controller
[ 5.269462] usb 1-1.2: Product: SCR3310-NTTCom USB SmartCard Reader
[ 5.547797] usb 1-1.3: Product: PX-S1UD Digital TV Tuner
[ 5.846541] usb 1-1.4: Product: USB 2.0 Hub
[ 6.570478] usb 1-1.4.2: Product: RTL2838UHIDIR
[ 7.068219] usb 1-1.4.4: Product: C-Media USB Headphone Set
「1-1.4.2」がデバイスID
「1-1.4.2」を”unbind / bind”
# USB番号 1-4.2 を指定して unbind します。
echo -n "1-1.4.2" > /sys/bus/usb/drivers/usb/unbind
lsusb
echo -n "1-1.4.2" > /sys/bus/usb/drivers/usb/bind
lsusb
参考:デバイス情報等
# USBデバイスの情報は「/sys/bus/usb/drivers/usb」配下にある
# Realtekを検索してみる。
cd /sys/bus/usb/drivers/usb
ls
1-1 1-1.1 1-1.2 1-1.3 1-1.4 1-1.4.2 1-1.4.4 bind uevent unbind usb1
cat 1-1.4.2/manufacturer
Realtek
目的のデバイス名は"1-1.4.2"
参考:
cat 1-1.2/manufacturer
NTT Communications Corp.
cat 1-1.3/manufacturer
PLEX Digital TV Tuner
ls -l
total 0
lrwxrwxrwx 1 root root 0 Feb 23 16:53 1-1 -> ../../../../devices/platform/soc/3f980000.usb/usb1/1-1
lrwxrwxrwx 1 root root 0 Feb 23 16:53 1-1.1 -> ../../../../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1
lrwxrwxrwx 1 root root 0 Feb 23 16:53 1-1.2 -> ../../../../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2
lrwxrwxrwx 1 root root 0 Feb 23 16:53 1-1.3 -> ../../../../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3
lrwxrwxrwx 1 root root 0 Feb 23 16:53 1-1.4 -> ../../../../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4
lrwxrwxrwx 1 root root 0 Feb 23 16:53 1-1.4.2 -> ../../../../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4.2
lrwxrwxrwx 1 root root 0 Feb 23 16:53 1-1.4.4 -> ../../../../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4.4
--w------- 1 root root 4096 Feb 23 16:53 bind
--w------- 1 root root 4096 Feb 23 16:53 uevent
--w------- 1 root root 4096 Feb 23 16:53 unbind
lrwxrwxrwx 1 root root 0 Feb 23 16:53 usb1 -> ../../../../devices/platform/soc/3f980000.usb/usb1
lsusb -t
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/5p, 480M
|__ Port 1: Dev 3, If 0, Class=Vendor Specific Class, Driver=smsc95xx, 480M
|__ Port 2: Dev 4, If 0, Class=Vendor Specific Class, Driver=, 12M
|__ Port 3: Dev 5, If 0, Class=Vendor Specific Class, Driver=smsusb, 480M
|__ Port 4: Dev 6, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 4: Dev 8, If 2, Class=Audio, Driver=snd-usb-audio, 12M
|__ Port 4: Dev 8, If 0, Class=Audio, Driver=snd-usb-audio, 12M
|__ Port 4: Dev 8, If 3, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 4: Dev 8, If 1, Class=Audio, Driver=snd-usb-audio, 12M
|__ Port 2: Dev 7, If 1, Class=Vendor Specific Class, Driver=, 480M
|__ Port 2: Dev 7, If 0, Class=Vendor Specific Class, Driver=usbfs, 480M
参考にさせていただきました。ありがとうございます。
コメント
echo -n “1-1.4.2” > /sys/bus/usb/drivers/usb/unbindreturn
↓
echo -n “1-1.4.2” > /sys/bus/usb/drivers/usb/unbind
yamada様。
ご指摘ありがとうございます。
記事を修正しました!