FC2カウンター FPGAの部屋 ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する6(UIOの設定4)
fc2ブログ

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

FPGAの部屋

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

ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する6(UIOの設定4)

ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する5(UIOの設定3)”の続き。

前回はLEDのテスト処理をUIOを使用してCのソフトウェアとして書いた。
今回は、UIOに実装した、ビットマップ・ディスプレイ・コントローラの設定レジスタ、キャラクタ・ジェネレータROM、ビットマップ・ディスプレイ・コントローラのフレーム・バッファ・メモリ全部をテストするCソフトウェアを作製した。

Cソフトウェアのファイル名は、disp_test.c で、オプションは-d, -a -i -o がある。-o は表示で省力可能だ。省略した時は、Read した値を返す。 ( -d 1 )
-d は、UIOの番号を示す。

0 : ビットマップ・ディスプレイ・コントローラのアドレス設定用AXI4 Lite Slave(これを設定すると画面が表示される)
1 : キャラクタ・ジェネレータ ROM AXI4 Lite Slave (キャラクタのラスタ・データがアドレスを与えると出力される)
2 : LEDの表示する値を設定する
3 : ビットマップ・ディスプレイ・コントローラのフレーム・バッファ(アドレスを与えて、Read/Write


-a には、アドレスを与える。 (-a 0x400 )

-i は入力値で、Write する値を書く。 (-i 0xffffff )

実際に disp_test コマンドを使ってみた例を示す。
ZYBO_BMDCwASL_59_141001.png

./disp_test -d 2 -i 0xf で、led_gpio に 0xf を書いた。LEDが全部点灯した。

./disp_test -d 0 -i 0x17800000 で、ビットマップ・ディスプレイ・コントローラのアドレス設定用AXI4 Lite Slave に 0x17800000 をWrite して、フレーム・バッファのスタート・アドレスを指定した。これにより、ビットマップ・ディスプレイの表示が開始された。

./disp_test -d 1 -a 0x800 で、キャラクタ・ジェネレータ ROM AXI4 Lite Slave を Read して、0x1e が読めた。

./disp_test -d 3 -a 0 -i 0xffffff
 ./disp_test -d 3 -a 4 -i 0xffffff
 ./disp_test -d 3 -a 8 -i 0xffffff
 ./disp_test -d 3 -a 0xc -i 0xffffff
で4ビット分、白いドットをWrite した。ディスプレイに白い線が書かれたの見えた。
ZYBO_BMDCwASL_60_141001.jpg

私がカスタムIPを作って、追加したすべてのデバイスがUIOでアクセスできているようだ。

最後に、disp_test.c を貼っていおく。(サブルーチン化してなくて、ちょっと恥ずかしいけど。。。)

/* * dips_test.c * *  Created on: 2014/09/28 *      Author: Masaaki */

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

int main(int argc, char *argv[]) {
    int c;
    int in_val=0;
    int index=0;
    int inout=1;
    int fd0, fd1, fd2, fd3;
    int device;
    volatile unsigned *bmdc_axis_lite;
    volatile unsigned *char_rom_axi_lite;
    volatile unsigned *led_gpio;
    volatile unsigned *bmdc_axim;

    while ((c = getopt(argc, argv, "d:a:i:o")) != -1){
        switch(c){
            case 'd' :
                device = (int)strtol(optarg, 00);
                break;
            case 'a' :
                index = ((int)strtol(optarg, 00))/sizeof(int);
                break;
            case 'i' :
                in_val = (int)strtol(optarg, 00);
                inout = 0;
                break;
            case 'o' :
            default :
                inout = 1;
        }
    }

    switch(device){
        case 0 :
            fd0 = open("/dev/uio0", O_RDWR); // bitmap_display_controller axi4 lite
            if (fd0 < 1){
                fprintf(stderr, "/dev/uio0 open error\n");
                exit(-1);
            }
            bmdc_axis_lite = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd0, 0);
            if (!bmdc_axis_lite){
                fprintf(stderr, "mmap error\n");
                exit(-1);
            }
            break;
        case 1 :
            fd1 = open("/dev/uio1", O_RDWR); // char_rom_axi4 lite
            if (fd1 < 1){
                fprintf(stderr, "/dev/uio1 open error\n");
                exit(-1);
            }
            char_rom_axi_lite = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
            if (!char_rom_axi_lite){
                fprintf(stderr, "mmap error\n");
                exit(-1);
            }
            break;
        case 2 :
            fd2 = open("/dev/uio2", O_RDWR);
            if (fd2 < 1){
                fprintf(stderr, "/dev/uio2 open error\n");
                exit(-1);
            }
            led_gpio = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
            if (!led_gpio){
                fprintf(stderr, "mmap error\n");
                exit(-1);
            }
            break;
        default :
            fd3 = open("/dev/uio3", O_RDWR); // bitmap_display_controller FB
            if (fd3 < 1){
                fprintf(stderr, "/dev/uio3 open error\n");
                exit(-1);
            }
            bmdc_axim = (volatile unsigned *)mmap(NULL, 0x10000000, PROT_READ|PROT_WRITE, MAP_SHARED, fd3, 0);
            if (!bmdc_axim){
                fprintf(stderr, "mmap error\n");
                exit(-1);
            }
    }

    if (inout == 0){
        switch(device){
            case 0 :
                bmdc_axis_lite[0] = in_val;
                break;
            case 2 :
                led_gpio[1] = 0xf// Channel1 AXI GPIO 3-state Control Register (output mode)
                led_gpio[0] = in_val;
                break;
            default :
                bmdc_axim[index] = in_val;
        }
    } else {
        switch(device){
            case 0 :
                printf("bmdc_axis_lite = %x\n", bmdc_axis_lite[0]);
                break;
            case 1 :
                printf("char_rom_axi_lite[%x] = %x\n", index, char_rom_axi_lite[index]);
                break;
            case 2 :
                printf("led_gpio = %x\n", led_gpio[0]);
                printf("led_gpio_tri = %x\n", led_gpio[1]);
                break;
            default :
                printf("bmdc_axim[%x] = %x\n", index, bmdc_axim[index]);
        }
    }

    switch(device){
        case 0 :
            munmap((void *)bmdc_axis_lite, 0x10000);
            break;
        case 1 :
            munmap((void *)char_rom_axi_lite, 0x10000);
            break;
        case 2 :
            munmap((void *)led_gpio, 0x10000);
            break;
        default :
            munmap((void *)bmdc_axim, 0x10000000);
    }
    return 0;
}


  1. 2014年10月01日 06:34 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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