Ultra96-V2 で Raspberry Pi Camera Module V2 (Sony IMX219) をDisplayPortから表示するサンプルです。
このような環境で実施しております。
- Ultra96V2
- Raspberry Pi Camera Module V2
- Vivado 2021.2.1
- Debianイメージへの OpenCV など各種開発環境のインストール
- X-Window server となるPC (作者は Windows10 + Xming で実施)
- 自作のUltra96V2用マルチI/O拡張カード
基本的な環境構築はこちらのブログでも紹介しておりますので参考にしてください。
Debian GNU/Linux (v2021.1版) ブートイメージ 環境にて試しております。
image : https://github.com/ikwzm/ZynqMP-FPGA-Linux/tree/v2021.1.1
Description : Debian GNU/Linux 11
kernel : 5.10.0-xlnx-v2021.1-zynqmp-fpga
PC側の合成環境には Vivado 2021.2 を利用しております。
git clone https://github.com/ryuz/jelly.git
で一式取得してください。
projects/ultra96v2/ultra96v2_imx219_display_port/syn/vivado2021.2
に移動して Vivado から ultra96v2_imx219_display_port.xpr を開いてください。
最初に BlockDesign を tcl から再構成する必要がります。
Vivado メニューの「Tools」→「Run Tcl Script」で、プロジェクトと同じディレクトリにある update_design.tcl を実行すると再構築を行うようにしています。
うまくいかない場合は、既に登録されている i_design_1 を手動で削除してから、design_1.tcl を実行しても同じことができるはずです。
design_1 が生成されたら「Flow」→「Run Implementation」で合成を行います。正常に合成できれば
ultra96v2_imx219_display_port.runs/impl_1
に ultra96v2_imx219_display_port.bit が出来上がります。
今回の動作では、IMX219イメージセンサーからPL経由で画像を取り込みますが、その際に ikwzm氏の udmabuf を用いて、CMA(DMA Contiguous Memory Allocator)領域から領域を割り当てます。
projects/ultra96v2/ultra96v2_imx219_display_port/app の内容一式と先ほど合成した ultra96v2_imx219_display_port.bit を、Ultra96V2 の Debian で作業できる適当なディレクトリにコピーします。bitファイルも同じappディレクトリに入れてください。
Ultra96V2 側では Debian が起動済みで ssh などで接続ができている前提ですので scp や samba などでコピーすると良いでしょう。app に関しては Ultra96V2 から git で clone することも可能です。
この時、
- OpenCV や bootgen など必要なツールがインストールできていること
- ssh ポートフォワーディングなどで、PCに X-Window が開く状態にしておくこと
- /dev/uio や /dev/i2c-4 などのデバイスのアクセス権が得られること
- sudo 権限のあるユーザーで実行すること
などの下準備がありますので、ブログなど参考に設定ください。
問題なければ、app をコピーしたディレクトリでb
make all
と実行すれば ultra96v2_imx219_display_port.out という実行ファイルが生成されます。
ここで
make run
とすると、Device Tree overlay によって、bit ファイルの書き込みなどを行った後にプログラムが起動し、ホストPCの方の X-Window に、カメラ画像が表示されるはずです。
なお、Device Tree overlay のロード/アンロードは
make load
make unload
といったコマンドで実施可能です。
なお、デフォルトで 1280x720サイズでの撮影モードで起動しますが、
make load
./ultra96v2_imx219_display_port.out 1000fps
のようにすれば、640x132での 1000fps モードにも切り替わります(カメラが1000fpsで動くだけで、表示は間引かれて60fpsです)。
その他の細かいコマンドは main.cpp の中を確認ください。
-
作者ブログ記事
-
https://github.com/lvsoft/Sony-IMX219-Raspberry-Pi-V2-CMOS
- Raspberry Pi Camera Module V2 の各種情報(IMX219のデータシートあり)
-
https://www.raspberrypi.org/forums/viewtopic.php?t=160611&start=25
- 各種情報。回路図の情報あり