Raspberry Pi:USB抜き差しをコマンドで行う

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

参考にさせていただきました。ありがとうございます。

# cd /sys/bus/usb/drivers/usb # echo -n '2-1.6' > unbind; echo -n '2-1.6' > bind 上記の2-1.6はバス番号。環境により適宜変更する。以下のようにバス番号に対応するデバイスを知ることができる。 ...

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメント

  1. yamada より:

    echo -n “1-1.4.2” > /sys/bus/usb/drivers/usb/unbindreturn

    echo -n “1-1.4.2” > /sys/bus/usb/drivers/usb/unbind