Tweet

LED クラスドライバ

最近の Linux カーネルには LED クラスドライバ(というのかな?)という,LED を抽象化するレイヤのドライバが入っています. もっとも,PC/AT 互換機ではこのドライバで扱えるデバイスは普通は付いていないので,「使ったことがある」という人はあまり多くないでしょう.

参考文献

Linux カーネルソースの linux/Documentation/leds-class.txt に説明があります.

HDL-GXR では

先日の HDL-GXR 対応パッチでは,LED デバイスとして

  • status (STATUS 窓の 緑 LED)
  • error (STATUS 窓の 赤 LED)
  • eSATA1 (eSATA1 接続中)
  • USB1 (USB1 接続中)
  • USB2 (USB2 接続中)

を登録してあります. さらに,

  • fan (ファン制御)
  • buzzer (ブザー制御)

も,ホントは LED ではないのだけど登録してあります. というわけで,これらも LED と同じ手順で制御できます.

いじってみる

ユーザランドからは /sys の下のダミーのファイルから制御します. というわけで,HDL-GXR で実際に見てみます.

# cd /sys/class/leds
# ls -l
合計 0                                                                          
drwxr-xr-x 2 root root 0 2008-12-13 21:44 USB1                                  
drwxr-xr-x 2 root root 0 2008-12-13 21:44 USB2                                  
drwxr-xr-x 2 root root 0 2008-12-13 21:44 buzzer                                
drwxr-xr-x 2 root root 0 2008-12-13 21:44 eSATA1                                
drwxr-xr-x 2 root root 0 2008-12-13 21:44 error                                 
drwxr-xr-x 2 root root 0 2008-12-13 21:44 fan                                   
drwxr-xr-x 2 root root 0 2008-12-13 21:44 status                                
#

確かに登録したデバイスが見えています. 今回は USB1 LED をいじってみましょう.

# cd USB1
# ls -l                                             
合計 0                                                                          
-rw-r--r-- 1 root root 4096 2008-12-13 22:14 brightness                         
lrwxrwxrwx 1 root root    0 2008-12-13 22:14 device -> ../../../devices/platform
/leds-gpio                                                                      
lrwxrwxrwx 1 root root    0 2008-12-13 22:14 subsystem -> ../../leds            
-rw-r--r-- 1 root root 4096 2008-12-13 22:14 trigger                            
-rw-r--r-- 1 root root 4096 2008-12-13 21:44 uevent                             
#

手動制御

ユーザランドから逐次制御するには brightness ファイルに値を書き込んでやります. 値は輝度で 0 〜 255 の値を取ります. が,輝度制御できない LED の場合は 0 で消灯,それ以外は点灯,となります. HDL-GXR の LED は輝度制御の機能は無いので,後者の制御パターンになります.

やってみましょう.

# echo 1 > brightness

USB1 LED が点灯しました.

# echo 0 > brightness

USB1 LED が消灯しました.

ハートビート

LED ドライバには,ユーザランドからの手動制御以外にも,カーネル側で自動で駆動する機能があります.

# cat trigger
[none] timer heartbeat default-on
#

ここはディスクの I/O スケジューラと同じようなインターフェースとなっていて

  • 組み込まれているロジックの名前が表示
  • 現在有効のロジック名が [ ] で囲まれている

となっています. ここでは none (自動制御なし)が有効になっています.

制御ロジックを変更するのも I/O スケジューラと同様に,変更したい名前を書き込んでやります. つまり,heartbeat ロジックに変更する場合は

# echo heartbeat > trigger

でおっけー. LED が点滅しだしましたね.

しかし,この点滅パターン,「ピカッピカッ……ピカッピカッ……」って,まさにハートビートww

timer ロジック

さて,先ほどの trigger の中身に timer というロジックがありました. これに切り替えてみましょう.

# echo timer > trigger

…何も起きませんね.LED は消灯したまま. ところが

# ls -l
合計 0                                                                          
-rw-r--r-- 1 root root 4096 2008-12-13 22:22 brightness                         
-rw-r--r-- 1 root root 4096 2008-12-13 22:34 delay_off                          
-rw-r--r-- 1 root root 4096 2008-12-13 22:34 delay_on                           
lrwxrwxrwx 1 root root    0 2008-12-13 22:14 device -> ../../../devices/platform
/leds-gpio                                                                      
lrwxrwxrwx 1 root root    0 2008-12-13 22:14 subsystem -> ../../leds            
-rw-r--r-- 1 root root 4096 2008-12-13 22:32 trigger                            
-rw-r--r-- 1 root root 4096 2008-12-13 21:44 uevent                             

delay_off と delay_on という 2 つのファイルが突如あらわれました. ドキュメントによると

  • delay_off は消灯時間,delay_on は点灯時間
  • 単位はミリ秒
  • ここで指定されたパターンで点滅を繰り返す

のだそうです. やってみましょう.

# echo 1000 > delay_off
# echo 1000 > delay_on

1秒点灯→1秒消灯→…,のパターンで点滅しました.

その他の制御ロジック

default-on

ドライバの起動時に on になる,というだけのロジックです. ユーザランドからの制御では意味がありません. カーネル側で「ユーザランドからの未制御時は on になって欲しい」という場合に指定します. HDL-GXR では fan の制御で指定しています. 未制御時にファンが止まってたらマズイですね.

ホンモノの LED の場合は power LED なんかに使うのかなぁ?

ide-disk

IDE HDD のアクセスランプになるらしいですが,HDL-GXR では使えなかったので,試してません.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-12-13 (土) 20:54:51 (3536d)