FC2カウンター FPGAの部屋 2019年01月23日
FC2ブログ

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

FPGAの部屋

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

Ultra96のDisplayPortを使用するためのプロジェクトを作成する2(表示失敗)

Ultra96のDisplayPortを使用するためのプロジェクトを作成する1(DisplayPort_test_XGA1_sync)”の続き。

前回は、これまで作ってきたIP を接続してUltra96のDisplayPortを使用するためのプロジェクトを作成した。プロジェクト名はDisplayPort_test なのだが、DisplayPort_test_XGA1_sync ディレクトリに作ってある。このプロジェクトを論理合成、インプリメンテーション、ビットストリームの生成を行った。ハードウェアをエクスポートして、SDKを立ち上げ、ビットストリームを加工して、bin ファイルを生成した。今回は、Ultra96 のDebian を起動し、デバイス・ツリーをロードし、アプリケーション・ソフトを起動して、Displayport への表示を行う。

まずは、前回作成したdisplayport_test_xga1_sync.bin をUltra96 のDebian にSFTP した。
displayport_test_xga1_sync.bin を /lib/firmware/ にコピーする。
sudo cp displayport_test_xga1_sync.bin /lib/firmware/
DisplayPort_test_100_19022.png

./lddtovray.sh を起動して、デバイスツリーをロードする。
./pattern_gen_axis を起動して表示領域のピクセル値の設定とinit_done のアサートを行う。
./disp_pattern.sh でDisplayPort をLiveVideoを表示するように、設定変更を行う。
DisplayPort_test_101_19022.png

実行結果の現在の表示を示す。少し下に流れている。
DisplayPort_test_102_19023.jpg

うまく表示できない。

lddtovray.sh を示す。

#!/bin/bash

sudo mkdir /config/device-tree/overlays/fpga
sudo cp fpga-load.dtb /config/device-tree/overlays/fpga/dtbo
sudo mkdir /config/device-tree/overlays/fclk0
sudo cp fclk0-zynqmp.dtb /config/device-tree/overlays/fclk0/dtbo
sudo mkdir /config/device-tree/overlays/pattern_gen_axis
sudo cp pattern_gen_axis.dtb /config/device-tree/overlays/pattern_gen_axis/dtbo

sleep 0.5
sudo chmod 666 /dev/uio*


rmdtovray.sh を示す。

#!/bin/bash

sudo rmdir /config/device-tree/overlays/pattern_gen_axis/
sudo rmdir /config/device-tree/overlays/fclk0
sudo rmdir /config/device-tree/overlays/fpga/


fpga-load.dts を示す。

/dts-v1/;
/ {
    fragment@0 {
        target-path = "/fpga-full";
        __overlay__ {
            firmware-name = "displayport_test_xga1_sync.bin";
        };
    };
};


fclk0-zynqmp.dts を示す。

/dts-v1/;/plugin/;
/ {
    fragment@0 {
        target-path = "/amba";
        __overlay__ {
            fclk0 {
                compatible    = "ikwzm,fclkcfg-0.10.a";
                clocks        = <&clk 0x47>;
                insert-rate   = "100000000";
                insert-enable = <1>;
                remove-rate   = "1000000";
                remove-enable = <0>;
            };
        };
    };
};


pattern_gen_axis.dts を示す。

/dts-v1/;/plugin/;
/ {
    fragment@0 {
        target-path = "/amba_pl@0";
        #address-cells = <2>;
        #size-cells = <2>;

        __overlay__ {
            #address-cells = <2>;
            #size-cells = <2>;

            pattern_gen_axis-uio {
                compatible = "generic-uio";
                reg = <0x0 0xA0000000 0x0 0x10000>;
            };
        };
    };
};


pattern_gen_axis.c を示す。

// pattern_gen_axis.c
// 2019/01/18 by marsee
//

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

int main(){
    int fd1;
    volatile unsigned *pga;
    int i;

    // uio initialize (uio1)
    fd1 = open("/dev/uio1", O_RDWR|O_SYNC); // pattern_gen_axis IP
    if (fd1 < 1){
        fprintf(stderr, "/dev/uio1 (pattern_gen_axis) open error\n");
        exit(1);
    }
    pga = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if (!pga){
        fprintf(stderr, "pattern_gen_axis mmap error\n");
        exit(1);
    }

    pga[4] = 768; // v_size
    pga[6] = 1024; // h_size
    pga[8] = 0x1; // init_done = 1
    
    printf("sizeof volatile unsigned = %d\n", sizeof(volatile unsigned));
    
    printf("v_size = %d, h_size = %d, init_done = %d\n", pga[4], pga[6], pga[8]);
    
    munmap((void *)pga, 0x10000);
    close(fd1);
    
    return(0);
}


disp_pattern.sh を示す。

#!/bin/bash

sudo ./memwrite fd4ab070 54
sudo ./memwrite fd4aa00c ff

  1. 2019年01月23日 06:14 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0