コマンドで USB をリセットしてみる
コマンド(CUI)で USB をリセットするのは、一般的に良く知られているのは bind, unbind するだけ?です。
では、早速、やってみましょう。
bind とは、
ここでいう bind は、named サービスのBIND とは異なります。
英語の直訳は、”~と~を結びつける” という意味ですから、ここでは、単純に USBを接続する?ぐらいの意味になります。
逆に、unbind は、USBを解放する?ぐらいの意味になります。
いずれもソフトウェア上での接続・解放ですので、ソースコードを見たわけでもないので想像ですが、
ソフトウェアっぽく話せば、USBポートの監視を停止するか否か?という感じなのではないでしょうか。
コマンドで USB を解放(unbind)してみる
USB を解放(unbind)するには、
当たり前ですが、該当USBポートに正しく認識されている必要があります。
lsusb コマンドで、現在USBに認識されているデバイスリストが出力されます。
$ lsusb
...
Bus 001 Device 009: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
...
|
lsusb コマンドの出力情報
- Bus : バス番号
- Device : デバイス番号
- ID : ベンダーID:プロダクトID
- 最後の文字列 : マニュファクチャ名 プロダクト名
これだの情報で、ある程度、どのUSBポートか判断つくかと思います。
正しく USBポート番号がわからないといけないので、USBのツリーリストを出力します。
先のlsusb コマンドに -t オプションを付加することで出力されます。
$ lsusb -t
...
/: 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
...
...
|
先の デバイスリストの Bus および Device 情報 から、ツリーリストの一致する Bus および Dev 情報 を探せば良いだけです。
見つかったら、その Bus 番号 および Port 番号をツリー情報からたどります。
たどった数値を以下の形式で表現します。(上記の出力例では、 1-2.1 となります。)
Bun Number – Port Number ( . Port Number )
( ()内は、USB Hubが間にある場合 )
この番号を用いて、USB Device 009 を解放(unbind)してみます。
$ echo -n "1-2.1" > /sys/bus/usb/drivers/usb/unbind
$ lsusb -t
...
/: 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
...
...
|
ツリーリスト上、見えなくなりました。
実際のデバイスも動作しなくなりました。
しかし、USBのデバイスリストでは、なぜか見えています。
$ lsusb
...
Bus 001 Device 009: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
...
|
ここで確認したデバイスだけなのかもしれません、詳しくはわかりません。
コマンドで USB を接続(bind)してみる
先に解放(unbind)したUSBを、再度、接続(bind)してみます。
先と同じように USB番号 1-2.1 を指定して 接続(bind)してみます。
$ echo -n "1-2.1" > /sys/bus/usb/drivers/usb/bind
$ lsusb -t
...
/: 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
...
...
|
(おまけ)コマンドで USB をリセットしてみる(usb_modeswitch編)
USBリセットを行うだけなら、usb_modeswitch を使ってもできます。
まずは、接続USBを確認します。
$ lsusb
...
Bus 001 Device 009: ID 152d:2338 JMicron Technology Corp. / JMicron USA Technology Corp. JM20337 Hi-Speed USB to SATA & PATA Combo Bridge
Bus 001 Device 002: ID 05e3:0608 Genesys Logic, Inc. USB-2.0 4-Port HUB
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
...
|
リセットしたい ベンダー番号(ここでは、152d) 、プロダクト番号(ここでは 2338) を使います。
$ usb_modeswitch -v 0x152d -p 0x2338 --reset-usb
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_modeswitch -v 0x152d -p 0x2338 -b 1 -g 9 --reset-usb
...
|
上記の出力結果では、”切り替えメソッドが提供されていない” 旨の警告メッセージが出力されていますので、
正しくリセットされたかは、不明です。
本来、usb_modeswitch は、モデムなどのデバイスをコントロールするためのコマンドではあるので、本当にリセットできるかは、デバイスに依存すると思います。
ここでは、あくまで、こんなコマンドもあるよ・・という紹介だけですので、ご了解いただければと思います。
(おまけ)USBモジュールについて(補足)
USBモジュールには、いくつかります。
ここで予備知識として、少しだけ解説しておきます。
システム起動時にロードされているUSBモジュールは、以下のコマンドで確認することができます。
$ cat /var/log/dmesg|grep hcd
...
[ 1.222396] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 1.222439] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[ 1.222468] uhci_hcd: USB Universal Host Controller Interface driver
[ 1.222673] xhci_hcd 0000:00:14.0: xHCI Host Controller
...
|
- ehci_hcd : USB 2.0 対応ドライバー
- ohci_hcd : OHCI USB 1.x 対応ドライバー
- uhci_hcd : UHCI USB 1.x 対応ドライバー
- xhci_hcd : USB 3.0 対応ドライバー
USB 1.x には、2 タイプのUSBがあります。
Intel社が主導、策定したUSB規格が、UHCI です。
また、Microsoft社、National Semiconductor社などが中心となって策定したUSB規格が、OHCI です。
USB 2.0 は、Intel社が無償公開した EHCI が標準となっています。
USB 3.0 については、Intel社が自社のマザーボードなどに組み込むコントローラLSIの仕様を定めた xHCI が実質的な標準となっています。
ここでのコマンドでのUSBリセットは、ハードリセットとは異なるので、注意が必要かと思います。
単純なソフト制御による監視の有無を制御しているに過ぎない?はず?です。(すみません、詳しくコードまで確認していないので想像です。)
当たり前ですが、そもそもUSBが認識できないので、コマンドでリセットして再認識させようと思っても、ここでのコマンドは使えません。
一時的にUSBを無効にしたい場合には、便利なときがありますので、まずは、お試しあれ。
コメントを投稿 :