« ACRiルームに登録してみた | トップページ | RasPiカメラV2(iMX219)のMIPI CSIのフレームを解析してみる »

2021.07.16

XILINXのMIPI CSI-2 Rx SubsystemをRasPiカメラV2で使う方法

MIPI CSI-2 Rx Subsystemの使い方が分かりました。このコアを使うとMIPIの信号をデコードしてAXI Streamにして出力してくれるので、RasPiカメラV2の信号をデコードしてみたいと思います。

Mipiartix

 

MIPI CSI-2 RX Subsystemというコアは中にMIPI D-PHYと、MIPI CSI-2 RX ControllerとVideo Frame Bufferが入っています。コアの内部構造を下の図に示します。

Mipi2_20210716083101

Vivado 2019の頃は無償ではMIPI D-PHYしか使えなかったのですが、Vivado 2020からはRX ControllerやVideo Bufferまで入ったMIPI CSI-2 RX Subsystemも無償で使えるようになったというわけです。

 

まず、IP Integratorを使ってBlock DesignにMIPIコアを置いたら、ダブルクリックして以下のようにカスタマイズします。

Mipi3_20210716083901

一番重要なのはPixel Formatで、RAW10にします。このパラメータは必須でカメラの出力フォーマットと一致していないと出力が何も出てこなくなります。RasPiカメラV2の出力フォーマットはRAW10かRAW8で設定で買えられますが、普通はRAW10で使うと思います。とにかくカメラの出力フォーマットと合わせてください。

その右にあるSerial Data Linesは2にします。2レーンということです。

次のLine Rateは555にしましたが、効果があるのかどうかはわかりません。少なくともPLLの発振周波数とかを決めているわけではなさそうなので適当でもいいのかもしれません。

デバッグを便利にするオプションとして、CSI2 Controller Register Interfaceというチェックボックスがあります。

ONにするとAXI Liteでレジスタを操作することでコアを動かしたり止めたり、ステータスを見たりすることができるようになりますが、AXI Liteを使うのも面倒なので、好みの問題ですがOFFにしておきます。なお、デフォルトでコアは動作開始になっているのでAXI Liteのマスタには何もつながなくても動くはずです。

OFFにするとAXI Liteのコントロース・ステータスポートが消えて、個別信号が出てきます。それが、ctrl_core_enや、dl0_stopstate_intrなどのバラバラとした信号です。ロジアナで見ればよいので楽です。ctrl_core_enは適当なタイミングで1にします。

Pixels Per Clockは1のままでよいでしょう。MIPIの速度が速くAXI Streamが追い付かない場合に2や4にすると複数のピクセルを同時に出してくれるようになるのだと思います。

 

このようにして作ったBlock Designを下の図に示します。右上のRTLのブロックはI2Cのシーケンスを出してカメラを設定するためのもので、右下のvideo_bloganaというコアはAXISの信号をキャプチャするためのロジアナです。

Mipi1_20210716082401

MIPI CSI-2 RX Subsystemの入力側のポイントは2つです。

  • CLK,DP0,DP1はHSとLPの両方をすべてつなぐ
  • dphyのCLKは200MHz

 

実際に動かしてみた波形を示します。

AXI Streamで出力されますが、XILINXのVideo AXI Streamはライン0の先頭でtuser(0)が立ちます。したがって下の波形はライン0のものです。

Mipi4_20210716085401

このAXI Streamにはtdest[9:0]というサイドバンド信号があるのですが、Product Guide PG232を読むと、tdest[9:4]はData Typeと書いてあります。

Mipi5_20210716085901

Data Typeとは何ぞやということなのですが、RAW10やRAW8といったデータのタイプのことを示す6bitの値のようです。RAW10の場合は0x2Bとなります。上の表を見るとライン番号などもtuserから出てくるようなのでtuserを広げればデバッグも楽になりそうですね。

tdataの開始部分から拡大してみてみると、tvalidとともに10bitのデータがやって来るのがわかります。

Mipi6_20210716090501

青いLEDをカメラの間近で見せると

Mipi7

小・大・小・大という並びになったので、IMX219のデータシートどおりライン0はGb・B・Gb・Bという並びなのかもしれません。

Mipi8

これがそのままAXI Streamで出ているのではないかと思われます。なお、tvalidの長さは1296でした。

この1296という長さはIMX219にI2C経由で0x016C <= 0x05、0x016D <= 0x10と設定しているので想定どおりです。 

デコードしたデータが綺麗な画像になっているかどうかはDDR3メモリに展開してUSBで吸い上げてみないとわかりませんが、ここまでのところ不安定さは全くなく、制御コード等は必ず同じデータが取れていました。

いろいろ苦労しましたが、一番大事なポイントはカメラの出力フォーマットとコアのフォーマットを合わせないと全く何も動かないというところでした。

早くDDR3メモリとつないで画像をキャプチャしてみたくなります。

|

« ACRiルームに登録してみた | トップページ | RasPiカメラV2(iMX219)のMIPI CSIのフレームを解析してみる »

コメント

コメントを書く



(ウェブ上には掲載しません)




« ACRiルームに登録してみた | トップページ | RasPiカメラV2(iMX219)のMIPI CSIのフレームを解析してみる »