Armadilloフォーラム

840のHDMI出力について

tsuchiya

2014年3月3日 10時07分

土屋です。

前回のGstreamer では色々とありがとうございました。まだ完全に解決出来ておりませんが、それなりに纏まりつつあります。

また教えていただきたいのですが

1. HDMI ( fb0 ) のビデオ出力を停止する方法
2. 同 出力を90度・180度回転させて表示したい

/sys/class/graphics/fb0/ に blank とrotate があったので echo 1 > 等してみたのですが、うまくいきませんでした。

ご面倒をおかけいたしますが、よろしくお願いいたします。

コメント

> 1. HDMI ( fb0 ) のビデオ出力を停止する方法

もし、HDMIを使う予定がないのであれば、カーネルの menuconfig で、
FB_SH_MOBILE_HDMI を外すことで、停止できます。

> 2. 同 出力を90度・180度回転させて表示したい

こちらは実装されていません。DRAMにある画をLCDCに渡している DMAに、
rotate の機能があるので、実装の検討をしてみたいと思います。

土屋です

下記有難うございます。

> > 1. HDMI ( fb0 ) のビデオ出力を停止する方法
>
> もし、HDMIを使う予定がないのであれば、カーネルの menuconfig で、
> FB_SH_MOBILE_HDMI を外すことで、停止できます。

出来れば任意に出力を制御したいです。

> > 2. 同 出力を90度・180度回転させて表示したい
>
> こちらは実装されていません。DRAMにある画をLCDCに渡している DMAに、
> rotate の機能があるので、実装の検討をしてみたいと思います。

了解しました。バージョンアップに期待します。

>1. HDMI ( fb0 ) のビデオ出力を停止する方法
HDMIへの出力を停止する方法ですが、

/sys/devices/platform/sh_mobile_lcdc_fb.1/graphics/fb0/stateに0以外の値を書き込むと
hdmiコントローラーがサスペンド状態になり、HDMIへの出力を止める事ができます。

下記のようにして試す事ができます。

[Armadillo ~]# gst-launch videotestsrc ! fbdevsink device=/dev/fb0 &
(動作確認用にHDMI出力にテストパターンを表示)
 
[Armadillo ~]# echo 1 > /sys/devices/platform/sh_mobile_lcdc_fb.1/graphics/fb0/state
(画面出力停止)
 
[Armadillo ~]# echo 0 > /sys/devices/platform/sh_mobile_lcdc_fb.1/graphics/fb0/state
(画面出力再開)

出力停止状態はHDMIの信号が停止します。
HDMIに接続されたモニター側からは、ケーブルが
外れている事と同様の状態になります。

土屋です。
下記有難うございます。

> [Armadillo ~]# echo 1 > /sys/devices/platform/sh_mobile_lcdc_fb.1/graphics/fb0/state
> (画面出力停止)

を実験してみたのですが、30秒程度で元に戻ってしまいました。

プロセスとして何かまずいものがあるのかと思ったのですが特別見当たりませんでした。
[root@armadillo840-0 (ttySC2) /mnt]# ps
PID USER TIME COMMAND
1 root 0:05 init
2 root 0:00 [kthreadd]
3 root 0:01 [ksoftirqd/0]
6 root 0:00 [cpuset]
7 root 0:00 [khelper]
8 root 0:00 [netns]
9 root 0:00 [kworker/u:1]
14 root 0:00 [kworker/0:1]
284 root 0:00 [sync_supers]
286 root 0:00 [bdi-default]
287 root 0:00 [kintegrityd]
289 root 0:00 [kblockd]
304 root 0:00 [khubd]
405 root 0:00 [rpciod]
415 root 0:00 [kswapd0]
416 root 0:00 [fsnotify_mark]
417 root 0:00 [nfsiod]
968 root 0:00 [pvr_timer]
1036 root 0:00 [mtdblock0]
1041 root 0:00 [mtdblock1]
1046 root 0:00 [mtdblock2]
1051 root 0:00 [mtdblock3]
1056 root 0:00 [mtdblock4]
1061 root 0:00 [mtdblock5]
1102 root 0:00 [irq/11-rtc-s353]
1118 root 0:00 [wdt_thread]
1122 root 0:00 [tmio_mmc]
1148 root 0:00 [deferwq]
1150 root 0:00 [kworker/u:2]
1152 root 0:00 [mmcqd/0]
1332 root 0:01 udevd --daemon
1504 root 0:00 syslogd -L
1642 root 0:00 klogd
3162 root 0:00 [pvr_workqueue]
3306 root 0:00 udhcpc -R -n -p /var/run/udhcpc.eth0.pid -i eth0
3315 root 0:00 inetd
3341 avahi 0:00 avahi-daemon: running [armadillo840-0.local]
3342 avahi 0:00 avahi-daemon: chroot helper process
3352 www-data 0:06 lighttpd -f /etc/lighttpd.conf
3602 root 0:00 -ash
3793 root 0:00 [flush-1:0]
4163 root 0:00 [kworker/0:2]
4510 root 0:00 ps

何かお気づきの点などがございましたら、ご教授ください。

> を実験してみたのですが、30秒程度で元に戻ってしまいました。
ディスプレイによっては、未接続の入力端子に対して常にHDMIの
Hot Plug Detect信号を入り切りするものがあるのかもしれません。

Armadillo-840のHDMIドライバの実装では、Hot Plug Detect信号からの
割り込みで、コネクタが挿入されたと見做して、サスペンドを解除します。

もし、ディスプレイ側の設定でそういった機能を無効にできるのであれば、
試してみてください。

こちらの手元にある液晶ディスプレイ(三菱電機製 RDT233RW)では、
時間経過でサスペンドが解除される事は無いようですが、電源の入り切り、
あるいはHDMIコネクタの挿抜でサスペンドが解除されます。

一度ディスプレイを接続してから、Armadillo-840が起動している間に
他のディスプレイに差し換える事が無いのであれば、
HDMIドライバで一度ディスプレイの接続を検知した後は、ホットプラグを
無効にするように実装すれば対応できそうです。

土屋です

下記有難うございます。
贅沢言えば、意図的に出力をカットしている間だけホットプラグが無効になれば嬉しいですが、
ディスプレイ側で回避できそうですので、何とか頑張ってみます。
rotateも期待しております。

ありがとうございました。

> > を実験してみたのですが、30秒程度で元に戻ってしまいました。
> ディスプレイによっては、未接続の入力端子に対して常にHDMIの
> Hot Plug Detect信号を入り切りするものがあるのかもしれません。
>
> Armadillo-840のHDMIドライバの実装では、Hot Plug Detect信号からの
> 割り込みで、コネクタが挿入されたと見做して、サスペンドを解除します。
>
> もし、ディスプレイ側の設定でそういった機能を無効にできるのであれば、
> 試してみてください。
>
> こちらの手元にある液晶ディスプレイ(三菱電機製 RDT233RW)では、
> 時間経過でサスペンドが解除される事は無いようですが、電源の入り切り、
> あるいはHDMIコネクタの挿抜でサスペンドが解除されます。
>
> 一度ディスプレイを接続してから、Armadillo-840が起動している間に
> 他のディスプレイに差し換える事が無いのであれば、
> HDMIドライバで一度ディスプレイの接続を検知した後は、ホットプラグを
> 無効にするように実装すれば対応できそうです。

土屋です

その後、ぼちぼちと継続しておりますが、ディスプレイをブランクにする場合に下記エラーが出ます。

gst-launch で H264を再生。画面は 1920x1080 です。

gst-launch-1.0 filesrc location=???.mp4 ! qtdemux name=demux0 { demux0.audio_0 ! queue ! acmaacdec ! audioresample ! audioamplify amplification=1.000000 ! audio/x-raw,rate=48000,channels=2 ! alsasink } { demux0.video_0 ! queue ! acmh264dec x-offset=0 y-offset=0 ! video/x-raw,width=1920,height=1080 ! acmfbdevsink device=/dev/fb0 }

再生中に
echo 1 > /sys/devices/platform/sh_mobile_lcdc_fb.1/graphics/fb0/state

とすると
[root@armadillo840-0 (ttySC2) ~]# echo 1 > /sys/devices/platform/sh_mobile_lcdc_fb.1/graphics/fb0/state
[root@armadillo840-0 (ttySC2) ~]# ERROR: from element /GstPipeline:pipeline0/GstAcmFBDevSink:acmfbdevsink0: Could not get/set settings from/on resource.
Additional debug info:
gstacmfbdevsink.c(1283): gst_acm_fbdevsink_render (): /GstPipeline:pipeline0/GstAcmFBDevSink:acmfbdevsink0:
error with ioctl(FBIO_WAITFORVSYNC) 110 (Connection timed out)
Execution ended after 6720181667 ns.
Setting pipeline to PAUSED ...
Setting pipeline to READY ...
Setting pipeline to NULL ...
Freeing pipeline ...
Unimplemented SVD code 17
Unimplemented SVD code 22
Unimplemented SVD code 21
Unimplemented SVD code 17
Unimplemented SVD code 22
Unimplemented SVD code 21

となります。

気が付いたのは一回H264の動画を再生した後( 再生は終了後 )に echo1 > を実行し、しばらくしてから echo 0 > で画面を戻して
gst-launch-1.0 で H264 の動画再生を実行すると、途中途中で数秒間フレーム落ちが発生したためでした。
この時も dmesg を見ると
Unimplemented SVD code 17
Unimplemented SVD code 22
Unimplemented SVD code 21
がありました。また、たまに起動時にもこのログが出ていることがありました。

取り急ぎ、ご報告まで。

ソースは fbmon.c と分かったのですが、とても手を出せない感じでしたので・・・
次回のリリース時に直っていると嬉しいです。

> error with ioctl(FBIO_WAITFORVSYNC) 110 (Connection timed out)
suspendするとHDMIのコアを完全に止めてしまうので、レジスタの読み書きができず
ioctlが完了しなかったのだと思います。次のアップデート迄に対応を検討してみます。

最初に戻ってしまうのですが、1つめのご質問の
>1. HDMI ( fb0 ) のビデオ出力を停止する方法
を私はHDMIの信号を電気的に停止したいと受け取ったのですが、

もし、「HDMIは接続状態でもOK、動画の再生を任意に停止したい」
という意味であれば、gst-launchを使わずにgstreamerライブラリを
使ってのアプリケーションを作成すれば、再生の停止、一時停止は
実現可能です。

土屋です。

下記有難うございます。

> > error with ioctl(FBIO_WAITFORVSYNC) 110 (Connection timed out)
> suspendするとHDMIのコアを完全に止めてしまうので、レジスタの読み書きができず
> ioctlが完了しなかったのだと思います。次のアップデート迄に対応を検討してみます。
>
> 最初に戻ってしまうのですが、1つめのご質問の
> >1. HDMI ( fb0 ) のビデオ出力を停止する方法
> を私はHDMIの信号を電気的に停止したいと受け取ったのですが、

仰る通りのつもりです。実際使用する時はGstreamerは停止してからHDMIを停止するつもりです。
ただHDMIを停止->再開した後で GStreamerの出力した場合に、コマ落ちしてしまうのは回避したいと考えておりました。

よろしくお願いいたします。