FC2カウンター FPGAの部屋 Ultra96のDisplayPortを使用するためのテスト3(実機テスト)
FC2ブログ

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

FPGAの部屋

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

Ultra96のDisplayPortを使用するためのテスト3(実機テスト)

Ultra96のDisplayPortを使用するためのテスト2(デバイス・ツリーの作成)”の続き。

前回は、生成されたビットストリーム・ファイルをUltra96 にFTP し、ビットストリームやクロックをコンフィギュレーションするDTB ファイルを作成した。今回は、memwrite アプリを作成してUltra96 のDisplayPort を使ってみよう。

なお、参考にしているのは、ひでみさんの”FPGAの内容が薄い本”だ。本に書いてあることはなるべくブログに書かないようにするので、是非購入してください。

まずは、Ultra96 のDebian の ~/examples/displayport_test ディレクトリを示す。
DisplayPort_test_22_190108.png

memwrite.c と memwrite があるが、ひでみさんの本にある memwrite を自分で作った。
Raspberry PiでC言語版Lチカを試す(その2)レジスタを操作する”を参考にした。ありがとうございました。
memwrite.c を示す。
DisplayPort_test_23_190108.png

// memwrite.c
// 2018/01/07 : 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;
    int addr, wd;
    uint32_t write_data;
    
    if (argc != 3){
        fprintf(stderr, "Usage : ./memwrite <address(hex)> <write data(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);
    
    sscanf(argv[2], "%x", &wd);
    write_data = (uint32_t)wd;
    reg[index] = write_data;
    
    munmap((void *)memp, BLOCK_SIZE);
    return(0);
}


gcc -o memwrite memwrite.c
でコンパイルして、memwrite を生成した。

さてやってみよう。最初に、デバイスツリーをロードする。
./lddtovray.sh
を実行した。
DisplayPort_test_20_190108.png

ロードされたデバイスツリーのメッセージを示す。
DisplayPort_test_21_190108.png

現在の初期画面を示す。ログイン・プロンプトが表示されている。画像のサイズは 1024 x 768 の XGA だった。
DisplayPort_test_26_190108.jpg

memwrite で 0xfdab070 の AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DP) Register に 0x54 を書いた。
memwrite で 0xfd4aa00c の V_BLEND_SET_GLOBAL_ALPHA_REG (DP) Register に 0xff を書いた。
sudo ./memwrite fd4ab070 54
sudo ./memwrite fd4aa00c ff

DisplayPort_test_24_190108.png
DisplayPort_test_27_190108.jpg

画像は上に流れている。XGA のところにSVGA の画像を入れているので仕方ない。

次にLiveVideo のみにしたかったので、memwrite で 0xfdab070 の AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DP) Register に 0x00 を書いた。
sudo ./memwrite fd4ab070 00
DisplayPort_test_25_190108.png

すると、ログイン・プロンプトは消えた。
DisplayPort_test_28_190108.jpg

だが、同様に画像は上に流れている。
またしばらくすると、Debian が落ちてしまった。まずいのかもしれない?

(追記)
sudo ./memwrite fd4ab070 00 に設定してしばらく置いておいたが、問題なかった。大丈夫そうだ。
  1. 2019年01月08日 05:24 |
  2. Ultra96
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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