#本日の目標
カメラモジュールをV4L2へ置き換えます。
と言っても、やはりよく分からないので
Development Guide「Video for Linux User Guide」の章を上から順に舐めていきます。
#テストパターン
どうやらサンプルで、テストパターン画像を生成する擬似デバイス(カメラの制御は行わない)が入っているようです。
起動の流れをざっくり書くと
- 既存のモジュール(GStreamer?)を停止する
- V4L2ドライバをインストールする
- V4L2制御用ソフト(Yavta ---- Windowsで言うところのamcapみたいなもの?)で画像をキャプチャする。
という流れのようです。
ここだけ見ると、別にV4L2ドライバのためにカーネル再ビルドする必要ないんじゃね?と思えてくるんだけどね……
基本的にはガイド通りに進めれば良いので、書かれてないことだけ捕捉します。
- Yavtaのインストール
-
V4L2デバイスから画像を取得するために必要なソフトのようです。
パッケージで配布されてないようなので (apt-getでインストールできない)
Gitで引っ張ってくる必要があります。
以下のコマンドを打つと、Yavtaが使えるようになります。
$ sudo apt-get update
$ sudo apt-get install git
$ git clone git://git.ideasonboard.org/yavta.git
$ cd yavta
$ make
- ImageMagickのインストール
-
Yavtaでキャプチャした画像を表示するために必要なソフトのようです。
こちらはパッケージで配布されているので、以下のコマンドでインストールできます。
$ sudo apt-get install imagemagick
上手く行くと、彩りタイル画像が表示されます。
modprobe tegra_camera
した時点で、/dev/video0
というデバイスが見えるようになります。
当然なのかどうなのか、Gstreamerで画像取得は出来なくなっています。
引数らしきtpg_mode=2
の数字を1とか3とかに変えても大きな変化なし、つまらん。
#OV5693_V4L2ドライバのインストール
ここからは、Gitの使い方も知らないズブの素人による悪戦苦闘の記録になります。
手順書によると、まずカーネルのソースコードにパッチを当てる必要がありそうです。
ところで、パッチについてはL4TのバージョンR23.1
とR23.2
に限定するような記述ですね。
今日時点、Gitから取得できる最新のバージョンはR24.1
です。
意味は気にせずgit checkout tegra-l4t-r24.1
と打ち込んでいたので、多分バージョンがズレてると怒られます。
というわけで、ひとまずバージョンをR23.2
に戻すことにします。
git checkout .
git checkout tegra-l4t-r23.2
これでバージョンR23.2
の状態に戻り、パッチが当てられるようになったはずです。
##パッチを当てる
git am 0001-ARM64-adding-OV5693-V4L2-on-E3326-jetson_cv.patch
手順書通りに上記コマンドを打ち込むと、gitから「お前ドコ中出身だオラ?」みたいな警告出てきます。
いや別にリポジトリ汚染する気はこれっぽっちもないんですローカル更新したいだけなんです……
多分、使い方を間違えてるんだろうな。あと引数で指定してるっぽい*.patch
ってのも実体がどこにあるのか全くの不明
分からないことはフォーラムで検索します、そして行き当たったのがこちらの記事
要約すると
「パッチはどこからダウンロードすればいいんでうsか?」
「コレがパッチだくれてやるよ(テキストべた貼り)」
って事なんですかね?
まさかそんな……と思いながらも、他にやり方が思いつかないので泣きながらコピペして*.patch
ファイルとして保存。
gitも、git am
だとやっぱり同じように上手く行かないのでgit apply
でぶち込みました。
##configを書き換える
どうにかこうにかパッチを当てたと思ったら次は「設定ファイルを書き換えろよボーイ」と来たもんだ。
この設定値がどこにあるのか全く見当が付かないので、例によってgrepで当たりを付ける。
多分arch/arm64/configs/tegra21_defconfig
ってやつだな……というわけで、こいつを書き換えます。
あとは前回の記事同様に、カーネルを再コンパイルします。
ソースコードは再度修正しないと、またエラーで止まるからね!
#ビルド結果をTX1に転送する
いよいよ最終段階、前回端折った所まで来ました。
(転送しても同じカーネルが上書きされるだけで意味が無いと思い、飛ばしたところ)
よく分からないので、それっぽいファイルは全てコピーします。
Image
とzImage
を、カーネルビルド出力先のarch/arm64/boot/
からkernel/
に上書きコピー
module_install
の出力先のlib
ディレクトリを全てrootfs/lib
に上書きコピー
あとはデバイスツリーなんだけど、ビルド先に出来たのはdts
フォルダで、カーネルに置くべきはdtb
っぽいぞ
これどうやって変換するんだ……と悩むこと数十分
dts
フォルダの中身、拡張子がdtb
やないか!!クソ、時間返せ!!
一応、元のdtb
フォルダの中身は全部消してからdts
フォルダの中身を全コピーします。
これで動くやろ、./flash.sh
を走らせて待機。
#結果
TX1再起動!またgitとYavtaインストール!めんどい!
ガイド通りにコマンドどーん!!rawファイル保存できた!!
raw2bmp
って何だよ、分からないからUSBメモリにどーん!!
Windows上のRawビューワーで、カメラ画像っぽいのが撮れてる事が確認できました。
Gstreamerで画像取得した時との違いは
- 画像サイズが違う(リサイズなのか切り出しなのかは不明)
- ベイヤー配列で出てきてるっぽい(画処理されてない)
- 画像がひっくり返ってる
#まとめ
GstreamerからV4L2ドライバに置き換え、ソースコード弄れそうなところまでこぎ着けました。
バッチファイルの中を見れば、大体どこを弄れば良いか当たりが付けられそうだし
ガイドもまだまだ続きがあるので、画像サイズとか映像フォーマットとか調整できそうな気がします。
今日はここまでということで。