Linux(組み込み)でLCDのバックライトをGPIOで点灯する
目的
液晶表示付きの組み込み機器(OSはPetalinux)での話
電源投入時にバックライトを点灯させた状態でLCDの表示を初期化すると、一瞬白い画面になったりして表示が乱れるので、LCDの表示の準備がでたあとにバックライトを点灯して起動時に表示の乱れなく起動したい
(LCDのバックライトは接点でOn,Offする)
概要
Petalinux上でLinuxで用意されているLCDのバックライト制御(led-triggerのbacklight)の仕組みを使って、LCDの表示の準備ができたあとでLCDのバックライトをOnにする方向で試行錯誤しました
困ったこと
最初,バックライトを制御する接点をdevicetreeで定義(led-triggerをbacklight)にすれば、Linux側でLCDの表示の準備ができたあとでバックライトをOnにしてくれると期待していましたが、そうはなりませんでした
該当の接点を初期化時にOn(default-state="on")にすれば起動時にバックライトはOnするのですが一瞬画面全体が白になります
初期化時にOff(default-state="off")にするとバックライトは点灯しないままとなりました
(led-triggerのbacklightが効いてないようにみえる)
調べたこと
とりあえずledのドライバledtrig-backlight.cの動作を確認しました
すると,led-triggerのbacklightは
- 表示なし(BLANK)の場合はバックライトを消灯
- 表示あり(UNBLANK)の場合は接点の状態をbrightness(/sys/class/leds/led-backlight/brightness)の値にする
ことが分かりました
つまり表示ありになった場合でもbrightnessの値がoffであれば、バックライトは消灯状態のままとなります
起動中のbrightnessの値はdevicetreeの下記の設定に従っていると思います
- default-state="on"にした場合はbrightnessの値がonなので点灯
- default-state="off"にした場合はbrightnessの値がoffなので消灯のまま
ですので、現状のledtrig-backlight.cでは起動中にバックライトをOnにするためにbrightnessをonにセットする手段として
- devicetreeのdefault-state="on"にするか
- uboot側でbacklightの接点をonにし、devicetreeのdefault-state="keep"にする
等をする必要があります
(これだとuboot起動中にバックライトを点灯するという形になりLCDの表示準備による画面の乱れが見えてしまうので、uboot側でLCDの表示をさせる必要が出てきます)
あと、default-state="on"が参照されるタイミングは、LCDの表示の準備の前のようで、それでバックライトがOnしてからLCDの表示が正常になるまでの間、画面が白くなっているようでした
(gpio-ledsの共通部分は早い段階で動作するがledtrig-backlight.cは遅れて実行)
また、ledtrig-backlight.cのコードが実行されるのはLCDの表示準備ができたあと(backlightのコールバックを登録(activate)するあたり)
led-triggerのbacklightの制御はログインプロンプトがでたあとっぽいうこともわかりました
(起動処理中はLCDの表示状態によりbacklightをOn,Offすることはない)
どうしたか
led-triggerのbacklightは、起動の処理が終わった後に動き出すっぽいので
起動中の表示の準備ができたあとにバックライトをOnにするという目的には合わないと思います
とりあえずバックライトはLCDの表示準備ができた後に遅れて点灯するという挙動をさせたいので、
LCDの表示のあとで実行されるledtrig-backlight.cのactivateの部分でバックライトを点灯する様にパッチを当てることにしました
雑感
- LCDパネル用のドライバでバックライトを点灯する処理をするのが本来の流れなのかな?
- gpio-backlight.cというのもあるのですがこれはdefault-state="on"と同じで使えなかった
- 単純にドライバ初期化後何秒後にoff->onするみたいな機能があれば
- callbackが起動動作中でも動作してくれたら(設定ミスをしているのかも)
以上です
Discussion