FC2カウンター FPGAの部屋 Ultra96
FC2ブログ

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

FPGAの部屋

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

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する8(ブロックデザインの変更)

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する7(現状確認2)”の続き。

前回は、VDMA のフレームバッファのアドレスが分かれば良いのでは? ということで、VDMA のステータスをRead してみた。今回は、VDMA のフレームバッファが正常に読めたので、それを元にアプリケーション・ソフトが書けそうだ。だが、VDMA の現在表示しているフレームバッファの番号を示すs2mm_frame_ptr_out を観察したいので、AXI_GPIO を追加して、もう一度、手順をやり直した。

まずは、axi_gpio_0 をブロックデザインに追加した。
MIPI_DP_39_190723.png

display 階層モジュールも貼っておく。
MIPI_DP_40_190723.png

Address Editor 画面を示す。
MIPI_DP_41_190723.png

論理合成、インプリメンテーション、ビットストリームの生成を行った。結果を示す。
MIPI_DP_42_190723.png

ビットファイル(design_1_wrapper.bit)が生成された。

cd ~/Docker/vivado182ub16/masaaki/ultra96_design/ultra96_design_dp/ultra96_design.runs/impl_1/
bootgen -image fpga.bif -arch zynqmp -w -o fpga.bin

fpga.bin を生成した。
MIPI_DP_43_190723.png

MIPI_DP_44_190723.png

次には、Ultra96 の Debian 上での作業となる。
fpga ユーザーのホーム・ディレクトリの下の examples/Pcam5C_DP/ディレクトリを新規作成して、Pcam5C ディレクトリから必要なファイルをコピーした。

v4l2.dts を編集して、自分で追加したIP とVDMA のUIO エントリを追加した。
MIPI_DP_47_190723.png

/dts-v1/;/plugin/;
/ {
    fragment@0 {
        target-path = "/amba_pl@0";
        #address-celss = <2>;
        #size-cells = <2>;
        __overlay__ {
            v4l2 {
                compatible = "fixstars,zynq-v4l2-1.0";
                #interrupt-cells = <0x3>;
                device-name="v4l2";
                interrupt-parent = <&gic>;
                interrupts = <0x0 0x59 0x4>;
            };
            
            axi_vdma_uio {
                compatible = "generic-uio";
                reg = <0x0 0xA0010000 0x0 0x1000>;
            };
            
            display_dmar_axis_vga_uio {
                compatible = "generic-uio";
                reg = <0x0 0xA0030000 0x0 0x10000>;
            };
                
            disp_gpio_uio {
                compatible = "generic-uio";
                reg = <0x0 0xA0011000 0x0 0x1000>;
            };
            
            gpio_uio {
                compatible = "generic-uio";
                reg = <0x0 0xA0012000 0x0 0x1000>;
            };
            
        };
    };
};



MIPI_DP_46_190723.png

先程の fpga.bin をUltra96 の /home/fpga/examples/Pcam5C_DP/ ディレクトリに SFTP した。
MIPI_DP_48_190723.png
  1. 2019年07月23日 04:52 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する7(現状確認2)

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する6(現状確認)”の続き。

前回は、Pcam5C カメラの画像をDisplayPort に出力するために現状を再確認したのだが、自分で 1 からソフトウェアを作るか、それてもV4L2 を勉強して、それに沿って作るか迷っていた。今回は、とりあえずは、フレームバッファからDMA Read して、DisplayPort に出力するだけなので、VDMA のフレームバッファのアドレスが分かれば良いのでは? ということで、VDMA のステータスをRead してみた。

まずは、Fixstars Tech Blog さんの「Ultra96 Linux で MIPI カメラから画像を取得する (セットアップ編)」のブロックデザインのAddress Editor の画面を示す。
Ultra96_Pcam5C_51_190721.png

これで見るとVDMA のアドレスは、0xA0010000 からの 4K バイトとなっている。
このレジスタをRead してくれば良い。そして、”Ultra96のDisplayPortを使用するためのテスト3(実機テスト)”に memwrite.c が載っているので、それを参考にして memread.c を作成した。
memread.c を示す。
MIPI_DP_31_190722.png

// memread.c
// 2019/07/21 : by marsee
// I referred to http://independence-sys.net/main/?p=2209
//

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>

#define BLOCK_SIZE    4096

volatile uint32_t *reg;

int main(int argc, char **argv){
    int fd;
    void *memp;
    uint32_t phy_addr;
    uint32_t phy_addr_base;
    uint32_t addr, addr2;
    uint32_t write_data;
    
    if (argc != 2){
        fprintf(stderr, "Usage : ./memread <address(hex)>\n");
        exit(-1);
    }
    
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1){
        fprintf(stderr, "/dev/mem open error\n");
        exit(-1);
    }
    
    sscanf(argv[1], "%x", &addr);
    phy_addr = (uint32_t)addr;
    phy_addr_base = phy_addr & 0xfffff000; // 4k byte boundary
    memp = mmap(NULL, BLOCK_SIZE,
                    PROT_READ | PROT_WRITE, MAP_SHARED,
                    fd, phy_addr_base );
    if ((int64_t)memp == -1){
        fprintf(stderr,"/dev/mem map error\n");
        exit(-1);
    }
    close(fd);
    
    reg = (uint32_t *)memp;
    int index = (phy_addr & 0xfff)/sizeof(uint32_t);
    printf("%0.8x\n", reg[index]);
    
    munmap((void *)memp, BLOCK_SIZE);

    return(0);
}


gcc -o memread memread.c
で、Ultra96 上の Debian でコンパイルし、memread ができた。
MIPI_DP_32_190722.png

次に、”Fixstars Tech Blogの「Ultra96 Linux で MIPI カメラから画像を取得する」をやってみる3”を見ながら、コマンドを実行していって、VDMA のレジスタ設定を確認していこう。

Ultra96 上の Debian の ~/examples/Pcam5C/ ディレクトリで、
sudo su
./init_camera.sh

を実行した。
MIPI_DP_33_190722.png

MIPI_DP_34_190722.png

なお、VDMA のマニュアルとして”AXI Video Direct Memory Access v6.3 LogiCORE IP Product Guide Vivado Design Suite PG020 October 4, 2017”を参照している。
AXI Video Direct Memory Access v6.3 LogiCORE IP Product Guide Vivado Design Suite PG020 October 4, 2017”のTable 2‐5: Register Address Map を引用する。
MIPI_DP_35_190722.png
MIPI_DP_36_190722.png

Table 2‐5: Register Address Map によると、AXI4 Stream から DMA Write の設定レジスタ S2MM VDMA Control Register が 0xA0010030 番地で、S2MM Start Address が 0xA00100AC, 0xA00100B0, 0xA00100B4 番地のようだ。

とりあえずは、memread で見てみよう。
0xA0010030 0x00010003
0xA00100AC 0x70900000
0xA00100B0 0x709e1000
0xA00100B4 0x70ac2000
だった。
MIPI_DP_37_190722.png

AXI Video Direct Memory Access v6.3 LogiCORE IP Product Guide Vivado Design Suite PG020 October 4, 2017”のFigure 2‐9: S2MM VDMACR Register を引用する。
MIPI_DP_38_190722.png

S2MM VDMA Control Register (0xA0010030) が 0x00010003 なので、
IRQFrameCount が 1 で、
Circular_Park が 1 なので、”1 = Circular Mode – Engine continuously circles through frame buffers.”
RS が 1 なので、”1 = Run – Start VDMA operations. The halted bit in the VDMA Status Register deasserts to 0 when the VDMA engine begins operations.”
であることが分かる。つまり、VDMA 動いているということだ。

次に、フレームバッファは、
フレームバッファ 0 が 0x70900000 番地、フレームバッファ 1 が 0x709e1000 番地、フレームバッファ 2 が 0x70ac2000 なので、ここからDMA Read すれば良いことが分かる。
  1. 2019年07月22日 04:44 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する6(現状確認)

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する5(再度fpga.bin を生成)”の続き。

前回は、fpga.bin を再度生成した。今回はPcam5C カメラの画像をDisplayPort に出力するために現状を再確認しよう。

Pcam5C カメラ画像をFixstars Tech Blog さんの「Ultra96 Linux で MIPI カメラから画像を取得する (セットアップ編)」を参照して、Pcam5C カメラから PNG 画像を取得できた。それが、”Fixstars Tech Blogの「Ultra96 Linux で MIPI カメラから画像を取得する」をやってみる3”だった。
ただし、Fixstars Tech Blog さんの「7. display port 経由での外部ディスプレイ出力」をやってみたところうまく行かなかった。”Fixstars Tech Blogの「Ultra96 Linux で MIPI カメラから画像を取得する」をやってみる4”参照。

Fixstars Tech Blogの「Ultra96 Linux で MIPI カメラから画像を取得する」をやってみる3”をもう一度やってみた。
cd ~/example/Pcam5C/
sudo su
./init_camera.sh
cd test
./rgbtest

MIPI_DP_27_190718.png
MIPI_DP_28_190718.png

20 枚のカメラ画像が取得できた。
MIPI_DP_29_190718.png

rgbtest.cc を引用する。
MIPI_DP_30_190718.png

これで buf のアドレスを取得できれば良いな?と思ったが、仮想アドレスだし、物理アドレスに直しても連続しているとは限らないかも知れない?V4L2 も良く分からないので、ソフトウェアは自分で1から構築することにしようと思う。

現状で動作しているのが分かっているので、心強い。

VDMA も自分で設定してV4L2 を使わないのも良いかも知れない?
まずは、Ultra96 のPMOD 拡張ボード上のカメラからDisplayPort に出力した時の記事を示す。
カメラ画像をDisplayPortに出力する7(ブロックデザインの変更)
Zynq UltraScale+ MPSoC のDisplayPort のLiveVideo のピクセルデータ
カメラ画像を DisplayPortに出力する8(Ultra96 での準備)
カメラ画像を DisplayPortに出力する9(アプリを作成、完成)

VDMA の設定値は、”AXI VDMAのドライバによるレジスタの設定値(S2MMの設定)”を確認すると良い。

なお、V4L2 を使うの良いかも知れない?
ikwzm さんが教えてくれたV4L2 の資料。
V4L2 API とOpenCV を使ってビデオキャプチャ
Linux Media Infrastructure userspace API
「Linux Media Infrastructure userspace API 」の中で、バッファ関連の説明
  1. 2019年07月19日 05:34 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する5(再度fpga.bin を生成)

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する4(再度ブロックデザインの変更)”の続き。

前回は、ultra96_design_dp ディレクトリのVivado 2018.2 プロジェクトのブロックデザインをdisp_dmar_axis_vga IP に入れ替えて、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、fpga.bin を再度生成しよう。

fppga.bin を生成する。この作業は、”Fixstars Tech Blogの「Ultra96 Linux で MIPI カメラから画像を取得する」をやってみる2”を参照してやっていこう。

~/Docker/vivado182ub16/masaaki/ultra96_design/ultra96_design_dp/ultra96_design.runs/impl_1/ ディレクトリに design_1_wrapper.bit があるのを確認した。
MIPI_DP_15_190710.png

同じディレクトリに fpga.bif を作成した。
MIPI_DP_16_190710.png

all:
{
    [destination_device = pl] design_1_wrapper.bit
}


MIPI_DP_17_190710.png

cd Docker/vivado182ub16/masaaki/ultra96_design/ultra96_design_dp/ultra96_design.runs/impl_1/
同じディレクトリで、
bootgen -image fpga.bif -arch zynqmp -w -o fpga.bin
を実行したところ、fpga.bin が生成された。
MIPI_DP_18_190710.png

MIPI_DP_19_190710.png

なお、ツィッターでAdam Taylor さんが”This week I am showing how to get the Zynq MPSoC DisplayPort controller up and running with live video from the Programmable Logic using Bare Metal SW”とツィートしていて、”MicroZed Chronicles: DisplayPort Controller — Part One”も公開されているので、少し待っていようと思う。
  1. 2019年07月18日 05:03 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する4(再度ブロックデザインの変更)

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する3(fpga.binファイルの生成)”の続き。

”Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する”シリーズも fpga.bin の生成まで行っているが、このままではまずい。なぜならば、VGA画像をXGA 画像やHD 画像に変換する必要がある。ということで、”VGA画像をXGA画像やHD画像に変換するdisp_dmar_axis_vga IP 5(やっと完成2)”でVGA画像をXGA画像やHD画像に変換するdisp_dmar_axis_vga IP を作成した。このDMA を使用するとVGA画像をXGA画像やHD画像に変換することができるので、”Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する2(ブロックデザインの変更)”のブロックデザインをdisp_dmar_axis_vga IP に入れ替えよう。

まずは、ultra96_design_dp ディレクトリのVivado 2018.2 プロジェクトを示す。
MIPI_DP_24_190717.png

ブロックデザインを示す。
MIPI_DP_21_190716.png

ultra96_design_dp ディレクトリにdisp_dmar_axis_vga_IP ディレクトリを作成し、”VGA画像をXGA画像やHD画像に変換するdisp_dmar_axis_vga IP 5(やっと完成2)”で作成したIP のファイルをコピーした。
MIPI_DP_26_190717.png

IP Catalog にdisp_dmar_axis_vga を登録した。これで、disp_dmar_axis_vga を使用する準備が整った。
MIPI_DP_20_190716.png

ブロックデザインの中の display 階層モジュール内の disp_dmar_axis を削除して、disp_dmar_axis_vga に入れ替えた。
MIPI_DP_22_190716.png

Address Editor を示す。
MIPI_DP_23_190716.png

これで、論理合成、インプリメンテーション、ビットストリームの生成を行ったところ成功した。
Project Summary を示す。
MIPI_DP_25_190717.png
  1. 2019年07月17日 05:00 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する3(fpga.binファイルの生成)

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する2(ブロックデザインの変更)”の続き。

前回は、Ultra96 にMIPI 拡張ボードを挿入し、Pcam5C を取り付けて、DisplayPort にPcam5C のカメラ画像を出力するVivado プロジェクトのブロックデザインを作成した。今回は、そのブロックデザインを論理合成、インプリメンテーション、ビットストリームの生成を行って、ビットファイルを生成させる。そして、そのビットファイルをbin ファイルに変換しよう。

論理合成、インプリメンテーション、ビットストリームの生成を行った。結果を示す。
MIPI_DP_13_190710.png

タイミング制約も満足している。
しかし、55 個の critical warnings が出ているがこれは何だろうか?
critical warnings を見てみると、制約ファイルに書いてあるポートがデザインに無いと言うことのようだ。
MIPI_DP_14_190710.png

とりあえず、この 55 個の critical warnings は無視しよう。

次は、 fppga.bin を生成する。この作業は、”Fixstars Tech Blogの「Ultra96 Linux で MIPI カメラから画像を取得する」をやってみる2”を参照してやっていこう。

~/Docker/vivado182ub16/masaaki/ultra96_design/ultra96_design_dp/ultra96_design.runs/impl_1/ ディレクトリに design_1_wrapper.bit があるのを確認した。
MIPI_DP_15_190710.png

同じディレクトリに fpga.bif を作成した。
MIPI_DP_16_190710.png

all:
{
    [destination_device = pl] design_1_wrapper.bit
}


MIPI_DP_17_190710.png

cd Docker/vivado182ub16/masaaki/ultra96_design/ultra96_design_dp/ultra96_design.runs/impl_1/
同じディレクトリで、
bootgen -image fpga.bif -arch zynqmp -w -o fpga.bin
を実行したところ、fpga.bin が生成された。
MIPI_DP_18_190710.png

MIPI_DP_19_190710.png
  1. 2019年07月10日 05:05 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する2(ブロックデザインの変更)

Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する1(準備編)”の続き。

前回は、”Fixstars Tech Blogの「Ultra96 Linux で MIPI カメラから画像を取得する」をやってみる4”でPcam5C のカメラ画像をディスプレイに表示することができなかった。だが、”カメラ画像をDisplayPortに出力する9(アプリを作成、完成)”でMIPI ではないパラレル出力のOV5642 をDisplayPort に表示することができている。そこで、両方を組み合わせてPcam5C の画像をUltra96 のDisplayPort に出力したいということで、PSのLiveVideo を有効にした。今回は、それを元にブロックデザインを完成させよう。

カメラ画像をDisplayPortに出力する7(ブロックデザインの変更)”を参考にして、ブロックデザインを変更しよう。

~/HDL/Ultra96/cam_dp_183/ ディレクトリから、axi2video_out_IP と disp_dmar_axis_IP ディレクトリをコピーした。
MIPI_DP_5_190709.png

それをVivado のプロジェクトのIP Catalog にリポジトリを登録した。
MIPI_DP_6_190709.png

ブロックデザイン上で、axi2video_out と disp_dmar_axis と axi_gpio を Add IP した。
MIPI_DP_7_190709.png

gpio の設定を示す。1 ビットの出力に設定した。
MIPI_DP_8_190709.png

Slice をAdd IP した。これは、axi_vdma の s2mm_frame_ptr_out の 6 ビットを 2 ビットに変換するに使用する。
MIPI_DP_9_190709.png

完成したブロックデザイン全体を示す。
MIPI_DP_10_190709.png

階層化した display 階層モジュールを示す。
MIPI_DP_11_190709.png

Address Editor 画面を示す。
MIPI_DP_12_190709.png
  1. 2019年07月09日 05:14 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0
»