FC2カウンター FPGAの部屋 KR260 の Petalinux 2022.1 上で memread と memwrite を生成した
fc2ブログ

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

FPGAの部屋

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

KR260 の Petalinux 2022.1 上で memread と memwrite を生成した

KR260 の Petalinux 2022.1 上で メモリを読み出す memread 実行ファイルとメモリに書き込む memwrite 実行ファイルをソースコードをコンパイルして生成した。

KR260 の Petalinux 2022.1 上で examples ディレクトリの下に mem ディレクトリを新規作成した。
cd examples
mkdir mem
cd mem


mem ディレクトリに C ソースコードを作成した。
kr260_cam_disp_141_230422.png

memread.c を示す。
kr260_cam_disp_142_230422.png

// memread.c
// 2019/07/21 : by marsee
// I referred to http://independence-sys.net/main/?p=2209
//

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

#define BLOCK_SIZE    4096

volatile uint32_t *reg;

int main(int argc, char **argv){
    int fd;
    void *memp;
    uint32_t phy_addr;
    uint32_t phy_addr_base;
    uint32_t addr, addr2;
    uint32_t write_data;
    
    if (argc != 2){
        fprintf(stderr, "Usage : ./memread <address(hex)>\n");
        exit(-1);
    }
    
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1){
        fprintf(stderr, "/dev/mem open error\n");
        exit(-1);
    }
    
    sscanf(argv[1], "%x", &addr);
    phy_addr = (uint32_t)addr;
    phy_addr_base = phy_addr & 0xfffff000; // 4k byte boundary
    memp = mmap(NULL, BLOCK_SIZE,
                    PROT_READ | PROT_WRITE, MAP_SHARED,
                    fd, phy_addr_base );
    if ((int64_t)memp == -1){
        fprintf(stderr,"/dev/mem map error\n");
        exit(-1);
    }
    close(fd);
    
    reg = (uint32_t *)memp;
    int index = (phy_addr & 0xfff)/sizeof(uint32_t);
    printf("%0.8x\n", reg[index]);
    
    munmap((void *)memp, BLOCK_SIZE);

    return(0);
}


memwrite.c を示す。
kr260_cam_disp_143_230422.png

// memwrite.c
// 2018/01/07 : by marsee
// I referred to http://independence-sys.net/main/?p=2209
//

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

#define BLOCK_SIZE    4096

volatile uint32_t *reg;

int main(int argc, char **argv){
    int fd;
    void *memp;
    uint32_t phy_addr;
    uint32_t phy_addr_base;
    int addr, wd;
    uint32_t write_data;
    
    if (argc != 3){
        fprintf(stderr, "Usage : ./memwrite <address(hex)> <write data(hex)>\n");
        exit(-1);
    }
    
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1){
        fprintf(stderr, "/dev/mem open error\n");
        exit(-1);
    }
    
    sscanf(argv[1], "%x", &addr);
    phy_addr = (uint32_t)addr;
    phy_addr_base = phy_addr & 0xfffff000; // 4k byte boundary
    memp = mmap(NULL, BLOCK_SIZE,
                    PROT_READ | PROT_WRITE, MAP_SHARED,
                    fd, phy_addr_base );
    if ((int64_t)memp == -1){
        fprintf(stderr,"/dev/mem map error\n");
        exit(-1);
    }
    close(fd);
    
    reg = (uint32_t *)memp;
    int index = (phy_addr & 0xfff)/sizeof(uint32_t);
    
    sscanf(argv[2], "%x", &wd);
    write_data = (uint32_t)wd;
    reg[index] = write_data;
    
    munmap((void *)memp, BLOCK_SIZE);
    return(0);
}


memread.c と memwrite.c を gcc でコンパイルした。
成功した。
gcc -o memread memread.c
gcc -o memwrite memwrite.c

memread と memwrite 実行ファイルが生成された。

Zynq UltraScale MPSoC で AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register(アドレス 0xfd4ab070) と V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register(アドレス 0xfd4aa00c) を読み出してみよう。

xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memread fd4ab070
00000057
xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memread fd4aa00c
000001ff



memwrite で書き込んでみた。

xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memwrite fd4ab070 54
xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memwrite fd4aa00c ff
xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memread fd4ab070
00000054
xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memread fd4aa00c
000000ff


kr260_cam_disp_144_230422.png

memread も memwrite も動作に問題はないようだ。
  1. 2023年04月22日 04:51 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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