FC2カウンター FPGAの部屋 Ultra96 MIPI拡張ボードに接続したPcam5C の画像をDisplayPort に表示する7(現状確認2)
FC2ブログ

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

FPGAの部屋

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

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

コメント

コメントの投稿


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

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