FC2カウンター FPGAの部屋 Ultra96-V2 のDisplayPort にテストパターンを表示する4(テストパターンを表示できた)
fc2ブログ

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

FPGAの部屋

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

Ultra96-V2 のDisplayPort にテストパターンを表示する4(テストパターンを表示できた)

Ultra96-V2 のDisplayPort にテストパターンを表示する3(各種スクリプト・ファイルやDTS ファイルの用意)”の続き。

前回は、各種スクリプト・ファイルやDTS ファイルを用意し、DTS ファイルをコンパイルしてDTB ファイルに変換した。今回は、つまずきはあったが、テストパターンをDisplayPort に出力することができた。

最初に、pattarn_gen_axis.c を gcc でコンパイルした。
gcc -o pattern_gen_axis pattern_gen_axis.c
次に、displayport_test_xga1_sync.bin を /lib/firmware/ ディレクトリにコピーした。
sudo cp displayport_test_xga1_sync.bin /lib/firmware/
DisplayPort_test_V2_35_190815.png

./lddtovray.sh
を実行したところエラーが発生した。
lddtovray.sh のコマンドを1個ずつ実行していったところ、fclkcfg でエラーが出ているのが分かった。
fclkcfg の DTS ファイルを下に示す。
DisplayPort_test_V2_27_190814.png

だが、ikwzm さんの”ZynqMP 向け Debian/Linux(v2019.1版) でFPGA クロックの周波数の変更に失敗する件”を見ると、fclkcfg の DTS ファイルの書き方が違っている。ikwzm さんがツィッターで教えていただいたのだが、

大元のデバイスツリーのクロックコントローラーのラベル(シンボル)が v2018.2 では &clk だったのが v2019.1 から &zynqmp_clk に変更されちゃいました。

だそうだ。
という訳で、fclk0-zynqmp.dts を書き換えた。

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


DisplayPort_test_V2_37_190815.png

./dtc_script.sh
コンパイルしてから、fclkcfg のデバイスツリーをロードしたところ、問題なくロードできた。
下の図に示す。ピンクで囲ったところが、fclkcfg のエラー部分だ。
DisplayPort_test_V2_36_190815.png

DisplayPort_test_V2_38_190815.png

/sys/class/fclk0/ ディレクトリが生成されている。
DisplayPort_test_V2_39_190815.png

uio のデバイスツリーのロードを行った。
sudo mkdir /config/device-tree/overlays/pattern_gen_axis
sudo cp pattern_gen_axis.dtb /config/device-tree/overlays/pattern_gen_axis/dtbo


同様に、/sys/classe/ を見ると、uio0 〜 uio4 があったが、その内の uio4 の name が pattern_gen_axis-uio だった。
DisplayPort_test_V2_40_190815.png

ということは、pattern_gen_axis の uio 番号が違っているので、pattern_gen_axis.c を変更した。
DisplayPort_test_V2_41_190815.png

// pattern_gen_axis.c
// 2019/01/18 by marsee
// 2019/08/15 : Changed to /dev/uio4 for Ultra96-V2. 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 fd4;
    volatile unsigned *pga;
    int i;

    // uio initialize (uio1)
    fd4 = open("/dev/uio4", O_RDWR|O_SYNC); // pattern_gen_axis IP
    if (fd4 < 1){
        fprintf(stderr, "/dev/uio4 (pattern_gen_axis) open error\n");
        exit(1);
    }
    pga = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd4, 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(fd4);
    
    return(0);
}


もう一度、gcc でコンパイルした。
gcc -o pattern_gen_axis pattern_gen_axis.c
pattern_gen_axis を sudo で実行した。
sudo ./pattern_gen_axis
DisplayPort の設定を行った。
./disp_pattern.sh
DisplayPort_test_V2_42_190815.png

しかし、memwrite が無かった。
Ultra96のDisplayPortを使用するためのテスト3(実機テスト)”から memwrite.c にコードを持ってきた。
DisplayPort_test_V2_43_190815.png

gcc -o memwrite memwrite.c
でコンパイルし、実行したところ、DisplayPort にテストパターンが表示された。良かった。。。
DisplayPort_test_V2_44_190815.png

DisplayPort_test_V2_45_190816.jpg
  1. 2019年08月16日 04:29 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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