ブログ

接続されたUSBモニタを自動認識して必要な情報のみを表示する

at_takuma.fukuda
2019年9月30日 17時18分

https://users.atmark-techno.com/blog/10899/4138
上記の記事で、Armadillo-IoTシリーズにUSBモニタを接続して画面を表示する方法を案内していますが、 ここではさらに、USBモニタが接続されたことを自動的に認識して画面を表示を行う方法をご案内します。

Armadilloに対してUSBデバイスが挿抜されたときにカーネルが出力するイベント通知(uevent)を利用して、
USBモニタの挿抜を検知します。

デバイス名の確認

USBモニタのデバイス名を確認します。
ArmadilloにUSBモニタを接続した際にコンソールに表示される通知を確認してください。
例えば弊社の確認環境では以下のように表示されました。

sb 1-1: new high-speed USB device number 5 using ci_hdrc
(中略)
udlfb: DisplayLink USB device /dev/fb0 attached. 800x600 resolution. Using 1880K framebuffer memory

この場合、USBモニタのデバイス名はfb0となります。

udevのrulesファイルを作成する

以下のディレクトリに任意の名称のrulesファイルを作成してください
USBモニタが接続された時のものと、USBモニタが取り外された時のものの2つを作成する必要があります。

/etc/udev/rules.d/

*ファイルを作成するときは以下にお気を付けください
 ・rulesファイルの拡張子は.rulesとする
 ・rulesファイルのファイル名は数字-名前.rulesという構成とする

作成するrulesファイルの例は以下の通りです。

接続:

ACTION=="add", \ #デバイスが追加された時
SUBSYSTEMS=="usb", \ #USBデバイス
KERNEL=="fb*", \ #挿抜タイミングによってはfb1やfb2と認識される場合もあるため、fb以降の数値が何であっても機能するよう*としておく
RUN:="/root/display_on.sh" #実行したい処理を記入する。ここでは任意のスクリプトファイル名を記載しておく

取り外し:

ACTION=="remove", \ #デバイスが削除された時
SUBSYSTEMS=="usb", \ #USBデバイス
KERNEL=="fb*", \ #接続と同様にfb以降の数値が何であっても機能するように*としておく
RUN:="/home/atmark/display_off.sh" #接続と同様に任意のスクリプトファイル名を記載しておく


それぞれのファイルを作成したら以下を実行してudevに適用する。

root@armadillo:~# udevadm control --reload<br/>

実行するスクリプト

本事例では、zenityを使用して情報をダイアログへ表示します。
表示する情報はifconfigの結果としていますが、他のコマンドの実行結果やファイル内容なども表示可能です。

zenityとはシェルスクリプトから入力された情報をダイアログとして表示する機能を持ったパッケージです。
ここで表示されるダイアログはGTK+で作成されます。
zenityのインストール
以下を実行してzenitiyをインストールしてください。

root@armadillo:~# apt-get install zenity

以下を実行して画面にifconfigの結果が表示されることを確認してください

root@armadillo:~# Xorg -s 0 &
root@armadillo:~# DISPLAY=:0 ifconfig | tee >(zenity --text-info ) &

動作を確認出来たら、スクリプトファイルを作成しましょう。
以下が作成例です。
/root/display_on.sh

#!/bin/bash
Xorg -s 0 &
export DISPLAY=:0
ifconfig | tee >(zenity --text-info) &

/root/display_off.sh

#!/bin/bash
pkill Xorg

以上のファイルを作成して、USBモニタのケーブル挿抜を行うと、
ケーブル挿入時にUSBモニタを認識してifconfigの結果が表示されます。

実際の動作イメージは以下をご覧ください。