mori
2014年11月26日 17時41分
いつもお世話になっております。
Armadillo-840でArmadillo-810カメラモジュールの画像表示開始が遅いため
原因の調査中ですが、手詰まり気味のため何かヒントを頂けませんでしょうか?
下記のサイトを参考にカメラ画像がLCDに表示できるようになりましたが、
GStreamerを実行してから実際にLCD上に映像表示が開始されるまでに20秒弱かかります。
・参考サイト
Howto : Armadillo-840でArmadillo-810 カメラモジュール 01 (B コネクタ用)を使用する
http://armadillo.atmark-techno.com/howto/a840-use-op-a810-cam01-00
・ソースコード等
atmark-dist-20140602.tar.gz
linux-3.4-at10.tar.gz
loader-armadillo840-mmcsd-v3.2.4.bin
・カーネル設定
参考サイトの通り
・ビルド環境
atde5-amd64-20140131.tar.xz
サイトにリンクされているシステムイメージをそのまま使用して、
以下のコマンドを実行した場合は1~2秒程度で映像が表示されました。
gst-launch v4l2src device=/dev/video0 ! ffmpegcolorspace ! fbdevsink device=/dev/fb1
自前でソースコードからビルドした場合にはGStreamerがVer.1.0になっているので、
以下のようなコマンドで確認を行いました。
gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! fbdevsink device=/dev/fb1
デバッグログを表示させてみると以下の関数で時間がかかっているところまでは
わかりましたが、そこから先の調査/修正方法がよく分かりません。
gstv4l2src.c
gst_v4l2src_get_caps()
カーネルコンフィグやGStreamerのコマンド指定等、何か不足しているんでしょうか?
コメント
mori
at_ohsawa
2014年11月27日 12時14分
もし、カメラモジュール01を "拡張ボードのCON12" に接続しているので
あれば、gstreamer-1.0で v4l2src による画像の取得開始までに20秒弱かかる
のは現状のkernelでは正常な動作です。
時間がかかる箇所は、gst_v4l2src_get_caps() から呼ばれる
ioctl(VIDIOC_S_FMT)です。
このioctlを発行すると、カメラモジュールとArmadilloの間で
i2cを使用してカメラの画像フォーマットの設定レジスタを読み書きします。
コンフィグを変える必要がありますが、Armadillo-840本体のCON8に
カメラモジュールを接続することで、2秒以内に画像を取得することができる
ようになります。
CON8に接続すると時間が短縮される理由は、I2Cの信号線の違いです。
- CON12: GPIO (GPIOをi2c-gpioでSW制御)
- CON8: IIC (HW実装 I2Cコア)
i2c-gpioでは、gpioの制御を行う drivers/sh/pfc.c のポートの入出力方向変更の
処理に冗長な箇所があり遅くなっています。
drivers/sh/pfc.c については修正を検討しています。
一方、gstreamer-0.10 と gstreamer-1.0で取得開始までの時間が異なる理由は、
1.0からカメラが出力可能なフォーマットのテストを行う回数が増た事で
上記のioctlが発行されえる回数が増え時間が伸びています。