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

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

FPGAの部屋

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

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる14(led_on.py を C で書いてみる)

@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる12(FPGAのコンフィギュレーション)
@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる13(デバイスツリーの入れ替え)
では、デバイスツリーをロードして、LEDを点灯させるアプリケーションソフトは @ikwzm さんの作成された led_on.py を使用した。Python のコードを使っても良いのだが、いつも書いている C 言語でアプリケーションソフトを書いてみることにした。

関連する @ikzwm さんの記事は”UltraZed 向け Debian GNU/Linux で FPGA をコンフィギュレーション”の”LED を点滅させてみる”だ。

まずは、led_on.c を書いてみた。
UltraZed-EG_StKit_Linux_200_180129.png

// led_on.c
// 2018/01/29 by marsee
//

#include <stdio.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 int *led;
    
    unsigned int pattern[14] = {0x010x020x040x080x100x200x400x800x400x200x100x080x040x02};
    int i, j;
    
    // led(uio1)
    fd1 = open("/dev/uio1", O_RDWR); // USER LEDS
    if(fd1 < 1){
        fprintf(stderr, "/dev/uio1 (led) open error\n");
        exit(-1);
    }
    led = (volatile unsigned *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if(!led){
        fprintf(stderr, "led mmap error\n");
        exit(-1);
    }
    
    for(i=0; i<10; i++){
        for(j=0; j<14; j++){
            led[0] = pattern[j];
            usleep(100000);
        }
    }
    
    munmap((void *) led, 0x1000);
    
    close(fd1);
    
    return(0);
}


led_on.py と比べて点滅する数は少し多いかもしれないが、大体同じ動作をする。

これをUltraZed-EG Starter Kit のDebian Linux の ~/examples/gpio ディレクトリにおいて、コンパイルを行った。
gcc -o led_on led_on.c

led_on を実行するために、”@ikwzmさんのUltraZed 向け Debian GNU/Linux の構築をやってみる12(FPGAのコンフィギュレーション)”と同様に sh スクリプトを作成した。exe_led_on_c.sh だ。その内容を示す。
UltraZed-EG_StKit_Linux_201_180129.png

#!/bin/sh

sudo mkdir /config/device-tree/overlays/fpga
sudo cp fpga-load_uzed.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/uio
sudo cp uio_uzed.dtb /config/device-tree/overlays/uio/dtbo
ls -la /dev/uio*

sudo ./led_on


ただ単に最後の行を入れ替えただけだ。

exe_led_on_c.sh を実行すると、同様にLED が点灯した。これで、従来通りに C で書いても動作するということが分かった。
UltraZed-EG_StKit_Linux_199_180129.png
  1. 2018年01月30日 04:09 |
  2. Linux
  3. | トラックバック:0
  4. | コメント:0