📚

Vitisに入門してみる。(3)PetaLinuxにパッケージを追加+Lチカ成功

2023/04/10に公開

環境

Vitis 2022.2
Vivado 2022.2
Windows 11
Ubuntu20.04 on WSL2
Arty Z7-20


System.bit

無事Petalinuxを起動することができたが、コマンドが初期のままなのでほぼ何もできない。
また、前回の最後で
DTG Settings --->[*] Remove PL from devicetree
しているため、PL側の機能を全く使えないという問題がある。
調べてみると、images下にあるsystem.bitが(PL側の?)ビットストリームということであり、これをBOOT.BINに含まればいいっぽい。
パッケージするときに

petalinux-package --boot --fpga ./images/linux/system.bit --u-boot --force

とすることで、無事PL側の機能を使うことができた。

パッケージ追加

続いて

petalinux-config -c rootfs

でrootfsにパッケージを追加する。

Filesystem Packages --> misc --> packagegroup-core-buildessential --> packagegroup-core-buildessential-dev
User Packages --> gpio-demo

gccとgpio-demoを追加して、ビルドし、SDに書き込む。

動作確認

$ ls /sys/class/gpio/
export  gpiochip1020  gpiochip902  unexport
$ cat /sys/class/gpio/gpiochip1020/label
41200000.gpio

のようにして、/sys/class/gpio/以下にGPIOが存在するか確認する。
labelを表示させるとgpiochip1020がアドレス41200000のGPIOに対応していることがわかる。

devmemでLチカ

$ sudo devmem 0x41200000 32 0x1


Lチカ記念

gpio-demoでLチカ

$ sudo gpio-demo -g 1020 -i
0x00000001
$ sudo gpio-demo -g 1020 -o 3
$ sudo gpio-demo -g 1020 -i
0x00000003

PetaLinux上で作成したプログラムからLチカ

https://qiita.com/iwatake2222/items/5e4ab9a106acfda2c866
を参考にして

test.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <errno.h>

int main(int argc, char **argv)
{
    printf("Hello World!\n");

    int fd;

    fd = open("/sys/class/gpio/export", O_WRONLY);
    write(fd, "1020", 4);
    close(fd);

    fd = open("/sys/class/gpio/gpio1020/direction", O_WRONLY);
    write(fd, "out", 3);
    close(fd);

    fd = open("/sys/class/gpio/gpio1020/value", O_WRONLY);
    write(fd, "1", 1);

    while(1) {
        write(fd, "0", 1);
        usleep(1*1000*1000);
        write(fd, "1", 1);
        usleep(1*1000*1000);
    }

    close(fd);

    return 0;
}

を書く。viは入っている。

gcc test.c
sudo su
./a.out

で実行するとLEDが1秒間隔で点滅する!

Discussion