FC2カウンター FPGAの部屋 ”Docker 上のUbuntu 16.04 のPetaLinux 2018.2でuioとudmabufの動作をテストする(DMA_pow2_testを使用)”で2乗IPを動作させることができた
FC2ブログ

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

FPGAの部屋

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

”Docker 上のUbuntu 16.04 のPetaLinux 2018.2でuioとudmabufの動作をテストする(DMA_pow2_testを使用)”で2乗IPを動作させることができた

”Docker 上のUbuntu 16.04 のPetaLinux 2018.2でuioとudmabufの動作をテストする(DMA_pow2_testを使用)”にudmabufを追加する”の続き。

PetaLinux 2018.2 のプロジェクトを作成して、ビルドを行い、BOOT.BIN の作成したものに、PL のIP(DMA_pow2)のUIO を追加し、さらに udmabuf.ko をビルドした。今回は、DMApow2Test2.c を作成し、ビルドして、Ultra96 のPetaLinux 上でテストする。

DMA_pow2_test2.c は”Ultra96 ボードでデバイスツリー・オーバーレイをテストする5”に記述されている。それをほとんどまるごと使用するのだが、PetaLinux のアプリケーションでは、アンダーバーを使用することができないためDMApow2Test2.c とした。それに、udmabuf4 を udmabuf0 に変更した。別に udmabuf4 でも問題ないが、前のブログ記事で udmabuf0 を使用したので、変更を行った。

Ultra96 のPetaLinux2018.2 でhelloworld アプリケーションを作る(ただし、rootfs を使用)”を参考にした。

DMApow2Test2 カスタム・アプリケーションを追加する。
petalinux-create -t apps --template c --name DMApow2Test2 --enable
PetaLinux_181_190428.png

DMA_pow2_test/project-spec/meta-user/recipes-apps/DMApow2Test2 ディレクトリが作成されて、その下の files ディレクトリの下に DMApow2Test2.c ができた。
PetaLinux_182_190428.png

DMApow2Test2.c をダブルクリックして起動し、”Ultra96 ボードでデバイスツリー・オーバーレイをテストする5”に記述されているDMA_pow2_test2.c を DMApow2Test2.c に変更して、記述をコピー・アンド・ペーストした。
PetaLinux_183_190428.png

DMApow2Test2.c を示す。

// DMApow2Test2.c
// 2019/04/28 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(){
    volatile unsigned int *udmabuf0_buf;
    int udmabuf0_fd, fd_phys_addr;
    char  attr[1024];
    unsigned long  phys_addr;
    int fd1;
    volatile unsigned int *dma_pow2;
    int i;
    
    // udmabuf0
    udmabuf0_fd = open("/dev/udmabuf0", O_RDWR); // frame_buffer, The chache is enabled. 
    if (udmabuf0_fd == -1){
        fprintf(stderr, "/dev/udmabuf0 open error\n");
        exit(-1);
    }
    udmabuf0_buf = (volatile unsigned int *)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, udmabuf0_fd, 0);
    if (!udmabuf0_buf){
        fprintf(stderr, "udmabuf0_buf mmap error\n");
        exit(-1);
    }

    // phys_addr of udmabuf0
    fd_phys_addr = open("/sys/class/udmabuf/udmabuf0/phys_addr", O_RDONLY);
    if (fd_phys_addr == -1){
        fprintf(stderr, "/sys/class/udmabuf/udmabuf0/phys_addr open error\n");
        exit(-1);
    }
    read(fd_phys_addr, attr, 1024);
    sscanf(attr, "%lx", &phys_addr);  
    close(fd_phys_addr);
    printf("phys_addr = %x\n", (int)phys_addr);

    // data set
    for(i=0; i<20; i++){
        udmabuf0_buf[i] = i;
    }

    // uio initialize (uio1)
    fd1 = open("/dev/uio1", O_RDWR|O_SYNC); // dma_pow2 IP
    if (fd1 < 1){
        fprintf(stderr, "/dev/uio1 (dma_pow2) open error\n");
        exit(1);
    }
    dma_pow2 = (volatile unsigned *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if (!dma_pow2){
        fprintf(stderr, "dma_pow2 mmap error\n");
        exit(1);
    }
    printf("Address of int size is %d\n", sizeof(int *));
    
    dma_pow2[6] = phys_addr; // Data signal of in_r
    dma_pow2[8] = phys_addr+10*sizeof(int); // Data signal of out_r
    
    dma_pow2[0] = 1; // ap_start
    
    while (!(dma_pow2[0] & 0x2)) ; // ap_done ?
    
    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, udmabuf0_buf[i], i, udmabuf0_buf[10+i]);
    }
    
    munmap((void *)dma_pow2, 0x10000);
    close(fd1);
    munmap((void *)udmabuf0_buf, 0x1000);
    close(udmabuf0_fd);
    
    return(0);
}


rootfs をビルドする。
LANG=en_US.UTF-8 petalinux-build -c rootfs
PetaLinux_184_190428.png

ビルドが成功した。
rootfs.tar.gz が更新されている。
PetaLinux_185_190428.png

rootfs.tar.gz を表すると、/usr/bin/ ディレクトリの下に DMApow2Test2 が生成されていた。
PetaLinux_186_190428.png

DMApow2Test2 をホストパソコンのホーム上にコピーした。
PetaLinux_187_190428.png

MicroSD カードをホストパソコンにマウントして、rootfs の /home/root/ ディレクトリにDMApow2Test2 を書き込む。
sudo mv DMApow2Test2 /media/masaaki/rootfs/home/root/
sudo ls /media/masaaki/rootfs/home/root/

PetaLinux_188_190428.png

MicroSD カードをUltra96 に入れて電源ON。
ログインしてから、まずは udmabuf をロードしてから、DMApow2Test2 を起動した。
PetaLinux_189_190428.png

入力値が 2 乗倍されて出力されていたので正しい。成功だ。

次に、rootfs を構築するに時間がかかるため、それをしなくてもビルドできるように探ってみよう。
LANG=en_US.UTF-8 petalinux-build
したがエラーになってしまった。
PetaLinux_190_190428.png

ERROR: DMApow2Test2-1.0-r0 do_package_qa: QA Issue: /usr/bin/DMApow2Test2 contained in package DMApow2Test2 requires libc.so.6()(64bit), but no providers found in RDEPENDS_DMApow2Test2? [file-rdeps]
ERROR: DMApow2Test2-1.0-r0 do_package_qa: QA Issue: /usr/bin/DMApow2Test2 contained in package DMApow2Test2 requires libc.so.6(GLIBC_2.17)(64bit), but no providers found in RDEPENDS_DMApow2Test2? [file-rdeps]
ERROR: DMApow2Test2-1.0-r0 do_package_qa: QA run found fatal errors. Please consider fixing them.
ERROR: DMApow2Test2-1.0-r0 do_package_qa: Function failed: do_package_qa
ERROR: Logfile of failure stored in: /home/masaaki/PetaLProj/DMA_pow2_test/build/tmp/work/aarch64-xilinx-linux/DMApow2Test2/1.0-r0/temp/log.do_package_qa.31858
ERROR: Task (/home/masaaki/PetaLProj/DMA_pow2_test/project-spec/meta-user/recipes-apps/DMApow2Test2/DMApow2Test2.bb:do_package_qa) failed with exit code '1'


ZYBO (Zynq) 初心者ガイド (11) LinuxユーザアプリケーションでLチカ”によると2回めにビルドするとエラーが発生するとあるが、私のところでも同様にエラーになった。

ZYBO (Zynq) 初心者ガイド (11) LinuxユーザアプリケーションでLチカ”に従って、
LANG=en_US.UTF-8 petalinux-build -c DMApow2Test2 -x do_clean
PetaLinux_191_190428.png

してから
LANG=en_US.UTF-8 petalinux-build -c DMApow2Test2 -x do_install
PetaLinux_192_190428.png

するとビルドに成功した。
DMA_pow2_test/build/tmp/work/aarch64-xilinx-linux/ ディレクトリに DMApow2Test2 が生成されていた。
PetaLinux_193_190428.png
  1. 2019年04月28日 07:33 |
  2. PetaLinux
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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