« XILINXのMIPI CSI-2 Rx SubsystemをRasPiカメラV2で使う方法 | トップページ | XILINXのMIPI CSI RX SubSystemコアのEmbedded non-image interface »

2021.07.17

RasPiカメラV2(iMX219)のMIPI CSIのフレームを解析してみる

XILINXのMIPI CSI RXコアで画像のデコードができるようになったので、再び生のパケットを目で見てみることにしました。

MIPIカメラの最初のパケットは次の図のように、最初に超短いパケットが来て、そのあとで2つの水平ラインがすぐに送られてきます。

 

Frame1

FPGAに内蔵したロジアナで見てもこのようになっています。

Frame2

水平ラインは周囲の明るさなどとは関係ない値が送られてくるので、初めはノイズかバグかと思っていたのですが、iMX219のデータシートを読んでみてようやくわかりました。

最初の短いパケットはFrame StartというShort Packetで、次の連続して2回送られてくるものはEmbedded Data Linesというもののようです。

iMX219データシートの図を掲載します。

Frame3

Frame4

どうやらMIPI CSIのパケットにはShort PacketとLong Packetというのがあるようで、Short Packetは4バイト、Long Packetは水平ライン長+6バイトの長さがあります。

どちらも最初はData IDとなっていますが、

・0x00はFrame Start
・0x01はFrame End
・0x12はEmbedded Data
・0x2AはRAW8フレーム
・0x2BはRAW10フレーム

となります。

実際のデータを見てみましょう。

まずはShort Packet。

Frame5_20210725105201

0x00 0xF7 0x00 0x2Cと読めます。

最初の0x00はFrame Startのコードで、続く0xF7 0x00はWord Countのようです。16bitの値ですが上位8bitはいつも0になっています。最後の0x2Cはエラーチェック用のECCであるようです。

次の長いパケットはごちゃごちゃしています。

Frame6

2つのレーンがありますが、レーン0→レーン1→レーン0→レーン1・・という順番で読んでいくのだと思われます。

読んでみると、

12 54 06 31 0A AA 00 A5 55 00 5A 02 5A 55 19 5A 20 55 55 07 5A 7B 5A 55 6E 5A 79 5A 55 04 A5 0D 5A 55 08 5A 16 ・・・

とにかく5とかAとかの多い高周波な波形ですね。

パケットの最初のバイトが0x12なので、Embedded Dataであると思われます。続く0x54 0x06は0x0654と呼んでラインの長さです。0x31はECCなので無視して構いません。なので、0x0Aからがパケットの正味のデータです。

読み方はデータシートに書いてあるのですが、RAW8の場合とRAW10の場合でフォーマットが違うのですが、RAW10の場合では、

Frame7

となっています。

なるほど。最初の0x0Aはヘッダみたいなもので、Tagは次のDataの意味を示すようです。Tagにはいくつかあって、

・0x00 無効なタグ。データの終わりとして扱う
・0x07 データの終わり
・0xAA CCIレジスタのインデックス MSB[15:8]
・0xA5 CCIレジスタのインデックス LSB[7:0]
・0x5A 自動でインクリメントされるCCIのデータ(データがある)
・0x55 自動でインクリメントされるCCIのデータ(データが無効)
・0xFF 無効なタグ。データの終わりとして扱う

となっています。

この内容を見ると、どうやらCCIレジスタ(I2Cで読み書きできるコントロールレジスタ)の内容を最初のラインで出力しているようです。

まず4バイトごとに挿入されるDummy Bytes(0x55)を削除します。

0A AA 00 A5 00 5A 02 5A 19 5A 20 55 07 5A 7B 5A 6E 5A 79 5A 04 A5 0D 5A 08 5A 16・・・

TagとDataの組に分割します。

・AA 00・・・CCIレジスタの上位8bitは00
・A5 00・・・CCIレジスタの下位8bitは00。次はレジスタ0x0000から読み出す
・5A 02・・・レジスタ0x0000の値は0x02
・5A 19・・・レジスタ0x0001の値は0x19
・5A 20・・・レジスタ0x0002の値は0x20
・55 07・・・レジスタ0x0003は存在していない
・5A 7B・・・レジスタ0x0004の値は0x7B
・5A 6E・・・レジスタ0x0005の値は0x6E
・5A 79・・・レジスタ0x0006の値は0x79
・5A 04・・・レジスタ0x0007の値は0x04
・A5 0D・・・CCIレジスタの下位8bitは0D。次はレジスタ0x000Dから読み出す
・5A 16・・・レジスタ0x000dの値は0x16
・・・

と読めます。CCIレジスタの最初の部分はこうなっているので、

Frame8

まさに、CCIレジスタの内容が最初の2でラインで送られてきていることがわかります。

次のラインからは

Frame9

というパケットが送られてきていて、読むと、

  • ヘッダは0x2B・・RAW10
  • 長さは0x654
  • データは0x11 11 11 10 D2 11 11 11 11 72 11 10・・・

という画像データと思われる内容でした。

結論を言うと、

  • MIPI CSIの最初の超短いパケットはFrame Start
  • 次に連続して2回送られてくるラインは、CCIレジスタの内容で、Embedded Data Lineという
  • その次から普通の画像が送られてくる。先頭のバイトは0x2B(RAW10)

でした。ぶっちゃけ、最初の2フレーム(ヘッダが0x12)は無視してもよさそうですね。

このパケットの構造がわかれば、MIPI CSI RX SubSystemコアを使わずにMIPI D-PHYでもCSIの画像デコードができるようになると思います。

 

|

« XILINXのMIPI CSI-2 Rx SubsystemをRasPiカメラV2で使う方法 | トップページ | XILINXのMIPI CSI RX SubSystemコアのEmbedded non-image interface »

コメント

コメントを書く



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




« XILINXのMIPI CSI-2 Rx SubsystemをRasPiカメラV2で使う方法 | トップページ | XILINXのMIPI CSI RX SubSystemコアのEmbedded non-image interface »