FC2カウンター FPGAの部屋 ZedBoard Linux上でカメラの画像を処理する1(準備編)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ZedBoard Linux上でカメラの画像を処理する1(準備編)

ZedBoard Linux上でカメラ画像を処理しようと思う。まずは現状確認と手段の検討をしようと思う。

現在の状態は、というと。
1.GitHubのDigilent/linux-digilentから、linux-digilent のZipファイルをダウンロードしてビルドした。”ZedBoardのLinuxカーネルコンパイルのテスト

2.フレーム・バッファの領域を確保する部分に、printk を入れて、フレーム・バッファの開始番地をオープニング・メッセージに表示するようにした。”ZedBoard用Digilent Linuxの解析1(フレームバッファの領域確保)

3.xilinx.dts をDTCでコンパイルすることができたが、それをdevicetree_ramdisk.dtb をとしてSDカードに入れて使用するとエラーになった。axi_iic_mt9d111 の .dts 上の記述を、デフォルトのdevice_ramdisk.dts に付け加えた。これを、DTCでコンパイルすると無事にコンパイルすることができた。出来上がった devicetree_ramdisk.dtb をSDカードにコピーして、ZedBoardを立ち上げたところ、フレームバッファの領域を確保することができた。”DTCでDevice Tree をコンパイルする2

4.ls /sys/devices/axi.0 コマンドを実行すると、自分で作ったchar-rom-axi-lite がどのアドレスにマップされているかが分かった。”XPSプロジェクトにカスタムAX Slave Lite IPを追加してSysfsを見る

5.自作のカメラ・コントローラIPとビットマップ・ディスプレイ・コントローラIPに、フレーム・バッファのアドレスを設定する設定レジスタを新設して、それをAXI4 Lite Slave 経由でRead/Write できるようにした。その AXI4 Lite Slave のアドレスを xilinx.dts で設定し、DTCでコンパイルして、DTBとして使用し、Sysfsに登録できた。”AXI4 Master IP にAXI4 Lite Slave を追加5(Linuxを起動)

6.Linux起動時にLinuxのペンギンが写っている既存のフレームバッファをアドレスを取得して、カメラ・インターフェイスIPとビットマップ・ディスプレイ・コントローラIPのフレームバッファ・スタート・アドレス・レジスタにWrite するようなCソフトウェアを作製した。そのソフトウェアをLinux起動時に動作するようにrcSの記述に追加した。”ZedBoard Linux のフレームバッファにカメラ画像を表示15(Linux既存のFBを使用)

1.~6.の手順で、Linuxが起動している時に、MT9D111カメラ画像をVGAディスプレイに出力できるようになった。

次の目標は、自作のラプラシアン・フィルタとチェビシェフ(ソーベル or ゾーベル(Sobel))・フィルタをCプログラムとして記述して、VGAの画面に写すことを目標とする。

この時に注意すべきことは、カメラの画像はDDR3 SDRAM上に書いてあるが、ARMプロセッサは、それを認識しているとは限らないことだ。ARM(Cortex-A9)プロセッサは1次、2次キャッシュを持ち、DDR3 SDRAMもWrite Backキャッシングされているようだ。その場合、カメラが画像をDDR3 SDRAMに書いたからと言って、ARMに伝わっているとは限らない。DDR3 SDRAMのフレーム・バッファに相当するキャッシュ・ラインをインバリデートして、DDR3 SDRAMから画像データをキャッシュに読み込む必要がある。

ZedBoardにビットマップ・ディスプレイ・コントローラを追加した時には、ARMプロセッサからキャラクタのピクセルデータを書き込んでから、Xil_DCacheFlushLine() を行うと、キャラクタが表示できた。”ZedBoardにビットマップ・ディスプレイ・コントローラを追加する17(ARMのソフトからキャラクタを書けた2)

今回は、ARMプロセッサのWrite ではなく、Read なので、Xil_DCacheInvalidateLine() を使用することになると思われる。(OS and Libraries Document Collection UG643 March 20, 2013 のページ番号 49を参照のこと)

それを踏まえて、カメラから読んできた(この時にキャッシュをインバリデートしてからReadする)ピクセルデータをARMプロセッサのソフトウェアでフィルタを作り、フレーム・バッファの空いているスペースに書き込む。フィルタした画像データの先頭アドレスをディスプレイ・コントローラIPの設定レジスタに書き込んで、フィルタ画像を表示させるという手順だ。
  1. 2013年09月14日 17:10 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/2588-df3e9b5e
この記事にトラックバックする(FC2ブログユーザー)