FC2カウンター FPGAの部屋 IP を追加した KR260 の kr260_custom アクセラレーション・プラットホームで DMA_pow2 IP を動作させた
fc2ブログ

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

FPGAの部屋

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

IP を追加した KR260 の kr260_custom アクセラレーション・プラットホームで DMA_pow2 IP を動作させた

KR260 の kr260_custom アクセラレーション・プラットホームにいろいろな IP を追加する7”でハードウェア・プラットホームに実装した IP を UIO にマップすることができた。”u-dma-buf を KR260 用の Petalinux 2022.1 でビルドする”で u-dma-buf.ko を作成して、Petalinux 2022.1 に実装し、DMA_pow2 IP を動作させたところ、成功した。

なお、この時点から”KV260 の Petalinux の ls コマンド出力に色を付ける”で ls 時に色分けをしている。

u-dma-buf の解説については、”u-dma-buf(User space mappable DMA Buffer)”参照。

u-dma-buf を KR260 用の Petalinux 2022.1 でビルドする”で作成した u-dma-buf.ko を KR260 の Petalinux 2022.1 に SFTP した。

なお、DMA_pow2 IP は AXI4 Master の IP で in_r レジスタに登録されたアドレスから 10 個のデータを AXI4 Master で取得して、それぞれの 2 乗を計算して out_r レジスタに登録されたアドレスに 10 バーストで書く動作を行う。

u-dma-buf.ko を insmod した。udmabuf0 インスタンスを作成する。
sudo insmod u-dma-buf.ko udmabuf0=0x10000

/dev ディレクトリに udmabuf0 ができた。
ls -l /dev/udmabuf0

udambuf0 のモードを 666 に変更した。
sudo chmod 666 /dev/udmabuf0
ls -l /dev/udmabuf0

KR260_353_230313.png

~/kr260_ip/DMA_pow2 ディレクトリに行って、KR260 の Petalinux 2022.1 上で動かすためのアプリケーション・ソフトウェア DMA_pow2_test.c を作成した。

// DMP_pow2_test.c
// 2023/03/13 by marsee

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

void main(){
    int uio4_fd;
    volatile int32_t *dma_pow2;
    volatile int32_t *data;
    int fd_udmabuf0;
    u_int32_t fd_paddr;
    unsigned char  attr[1024];
    unsigned long  phys_addr;
    
    // uio4, DMP_pow2
    if((uio4_fd = open("/dev/uio4", O_RDWR)) == -1) {
        printf("Can not open /dev/uio4\n");
        exit(1);
    }
    dma_pow2 = (volatile int32_t*)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, uio4_fd, 0);
    
    // udmabuf0
    fd_udmabuf0 = open("/dev/udmabuf0", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd_udmabuf0 == -1){
        fprintf(stderr, "/dev/udmabuf0 open errorn");
        exit(-1);
    }

    // phys_addr of udmabuf0
    fd_paddr = open("/sys/class/u-dma-buf/udmabuf0/phys_addr", O_RDONLY);
    if (fd_paddr == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf0/phys_addr open errorn");
        exit(-1);
    }
    read(fd_paddr, (void *)attr, 1024);
    sscanf((const char *)attr, "%lx", &phys_addr);  
    close(fd_paddr);
    printf("phys_addr = %x\n", (unsigned int)phys_addr);
    
    data = (volatile int32_t *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd_udmabuf0, 0);
    if (data == MAP_FAILED){
        fprintf(stderr, "data mmap error\n");
        exit(-1);
    }
    
    // data Initialization
    for(int i=0; i<10; i++){
        data[i] = i;
    }
    
    // DMP_pow2 start
    while((dma_pow2[0] & 4) == 0) ; // wait ap_idle
    dma_pow2[6] = phys_addr; // in_r
    dma_pow2[8] = phys_addr + 10 * sizeof(int32_t); // out_r
    dma_pow2[0] = 1; // ap_start
    while((dma_pow2[0] & 2) == 0) ; // wait ap_done
    
    
    for(int i=0; i<10; i++){
        printf("in = %d, out = %d\n", data[i], data[i+10]);
    }
}


KR260_357_230313.png

gcc で DMA_pow2_test.c をコンパイルして、DMA_pow2_test 実行形式ファイルを生成した。
gcc -o DMA_pow2_test DMA_pow2_test.c
KR260_354_230313.png

デフォルトのアプリケーションをアンロードし、kr260_ip をロードする。
/dev/uio* のモードを 666 に変更した。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_ip
sudo chmod 666 /dev/uio*
ls -l /dev/uio*

KR260_355_230313.png

DMA_pow2_test アプリケーション・ソフトウェアを起動したところ、2 乗された out が出力された。成功だ。
./DMA_pow2_test
KR260_356_230313.png
  1. 2023年03月14日 04:17 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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