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

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

FPGAの部屋

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

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

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

前回は、DTSでUIOの設定をしてから、DTCでDTSをコンパイルした。その出力であるDTBを使用して、Linuxをブートして、UIOが/dev ディレクトリに生成されるのを確認した。更に、一般ユーザーでログインするためにSSHをインストールし、/sys/devices ディレクトリを確認した。
今回は、UIOをCプログラムを書いて実際に使用する。具体的に何をやるかというと、ZYBOの4つのLEDを点灯させる。
なお、今回も”How to Design and Access a Memory-Mapped Device in Programmable Logic from Linaro Ubuntu Linux on Xilinx Zynq on the ZedBoard, Without Writing a Device Driver — Part Two”を参照している。

・最初に、USB-Serial で接続された root のTrea Term 画面で、ifconfig をして、DHCP の結果、IPアドレスがどうなっているかを確認する。このIPアドレスが一定ではなく、毎回違っている。これはなぜだろう?
ZYBO_BMDCwASL_48_140929.png

・IPアドレスが分かったら、もう1つTera Termを立ちあげて、SSHログインする。

mkdir Apps コマンドで、Apps フォルダを作製した。(もうすでに作ってあるが。。。)
ZYBO_BMDCwASL_49_140929.png

・Apps ディレクトリの下に、4つのLEDを点灯させる。led_test.c を vim で作製した。 vim led_test.c

LEDは、3番目にデバイス・ツリーにUIOとして定義されているので、uio2 として生成されている。uio の何番目として生成されているかは、前回の /sys ディレクトリを見ても確認できる。
ZYBO_BMDCwASL_50_140929.png

・LED_test.c が出来たので、cc -o led_test led_test.c コマンドでコンパイルを行った。

・led_test 実行ファイルができたので、./led_test コマンドを実行した。因みに、引数がない状態で実行すると led_gpio のレジスタをRead してくる。

・/dev/uio2 open error となってしまったが、sudo ./led_test を使用すると実行することができた。
ここで、led_gpio のメモリ領域は64KBなので、最後の1ワードを読みで見ることにした。それが、test[(65536-sizeof(int))/sizeof(int)] だ。これも一応、読めているようだ。
ZYBO_BMDCwASL_51_140929.png

さて次に、管理者権限では無く、ユーザー権限で実行することを考える。

ls -l /dev/uio* コマンドを実行すると、一般ユーザーに w パーミッションが与えられていない。
ZYBO_BMDCwASL_52_140929.png

sudo chmod 666 /dev/uio2 コマンドで、uio2 にだけ、一般ユーザーの w パーミッションを与えた。
ZYBO_BMDCwASL_53_140929.png

・今度は、./led_test コマンドが実行できた。
ZYBO_BMDCwASL_54_140929.png

次に、LEDに値を書いて点灯させてみる。0xf を書くと4つのLEDがすべて点灯する。

./led_test -i 0xf コマンドを実行した。
ZYBO_BMDCwASL_55_140929.png

ZYBOの4つのLEDがすべて点灯した。
ZYBO_BMDCwASL_57_140929.jpg

/dev/uio2 に設定した一般ユーザーの Write パーミッションは、再起動するとデフォルト値に戻ってしまい、無くなってしまう。これを設定しておくには、ブート時に自動的に chmod 666 /dev/uio2 を行う必要があるようだ。

最後に、led_test.c を貼っておく。これを書くにあたっては、、”How to Design and Access a Memory-Mapped Device in Programmable Logic from Linaro Ubuntu Linux on Xilinx Zynq on the ZedBoard, Without Writing a Device Driver — Part Two”の counters.c を参考にさせて頂いている。

/* * led_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;
    int inout=1;
    int fd;
    volatile unsigned *led_gpio;

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

    fd = open("/dev/uio2", O_RDWR);
    if (fd < 1){
        fprintf(stderr, "/dev/uio2 open error\n");
        exit(-1);
    }

    led_gpio = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    if (!led_gpio){
        fprintf(stderr, "mmap error\n");
        exit(-1);
    }

    if (inout == 0){
        led_gpio[1] = 0xf// Channel1 AXI GPIO 3-state Control Register (output mode)
        led_gpio[0] = in_val;
    } else {
        printf("led_gpio = %x\n", led_gpio[0]);
        printf("led_gpio_tri = %x\n", led_gpio[1]);
        printf("test[(65536-sizeof(int))/sizeof(int)] = %x\n", led_gpio[(65536-sizeof(int))/sizeof(int)]);
    }

    munmap((void *)led_gpio, 0x10000);
    return 0;
}


(追記)
/etc/rc.local の exit 0 の前に chmod を書いておくと、起動時に /dev/uio* に w パーミッションが入りました。

chmod 666 /dev/uio0
chmod 666 /dev/uio1
chmod 666 /dev/uio2
chmod 666 /dev/uio3

ZYBO_BMDCwASL_58_140929.png

ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する6(UIOの設定4)”に続く。
  1. 2014年09月29日 04:33 |
  2. ZYBO
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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