😺

kv260のpeatalinux上にvexriscvを適用させるまでの手順について

2023/02/05に公開

記事内容

vivado 側の対応

参考元コードのリンク先

適用済みコードのリンク先

変更内容について

  • 対応としては, riscv のドライバ定義を generic-uio を使用するように変更。
  • wrapper のコードを差し替え
  • 操作用アプリの追加(test5.elf)

VexRiscv の設定

(https://github.com/SpinalHDL/VexRiscv)

(設定ファイルは VexRiscv/src/main/scala/vexriscv/demo フォルダに置いて対応)

VexRiscv コードは

  • AXI Wrapper 込みでの対応に変更
    (lp6m さんのコード の設定をベースに対応しています)

  • resetVector の設定を null に変更(アプリからのアドレス変更設定に対応できるように)

以下のコードで verilog コードを生成する。

$ sbt "runMain vexriscv.demo.GenSignate"
  • VexRiscvSignate.v ファイルが生成される。

wrapper コードについて

  • m_axi の省略された信号について初期値を設定
  • reset 信号の対応を S_AXI バスの対応信号を使用するように変更

riscv ドライバ用のソースコードの場所

./vitis/riscv_ex/imports/hls/prj/sol/impl/misc/drivers/riscv_v1_0/src
フォルダに生成されています。

  • 必要なファイルは xriscv.c/xriscv_linux.c/xriscv.h/xriscv_hw.h
    (アプリ側で riscv のレジスタ操作するために使用)

M_AXI 側からアクセス可能な範囲は DDR_LOW の箇所(0x00000000 - 0x80000000)

S_AXI 側からアクセス可能は範囲は /riscv_1/s_axi_control(0xA0001000 - 0xA0002000)

petalinux 側の設定

設定内容変更

  • cma の設定値を変更
    (900M の場合 SystemRAM の領域をフルで使用するためメモリ予約に失敗する)

  • generic-uio の使用をできるようにする。

(cma について)

  • DPU と一緒に動かす場合には 512Mbyte に設定する。
    (今回は確認のために 128Mbyte にしています。)

メモリ配置確認

$ sudo cat /proc/iomem

コマンド実行結果

$ vim project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi

変更内容を適用したファイルの中身

/include/ "system-conf.dtsi"
/ {
        chosen {
                bootargs = "earlycon console=ttyPS1,115200 uio_pdrv_genirq.of_id=generic-uio clk_ignore_unused init_fatal_sh=1 cma=128M ";
                stdout-path = "serial1:115200n8";
        };

        reserved-memory {
            #address-cells = <2>;
            #size-cells = <2>;
            ranges;

            image_buf0: image_buf@0 {
                compatible = "shared-dma-pool";
                reusable;
                reg = <0x0 0x40000000 0x0 0x01000000>;
                label = "image_buf0";
            };
        };
        udmabuf@0 {
            compatible = "ikwzm,u-dma-buf";
            device-name = "udmabuf0";
            size = <0x01000000>;
            memory-region = <&image_buf0>;
        };
};

u-dma-buf の設定

module として登録することで起動時にドライバを読み込むようになります。

$ petalinux-build -c device-tree
$ vim project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi

$ petalinux-create -t modules --name u-dma-buf --enable

$ git clone https://github.com/ikwzm/udmabuf
$ cp -r udmabuf/* ./project-spec/meta-user/recipes-modules/u-dma-buf/files
$ rm -rf udmabuf

#不要
#$ vim project-spec/meta-user/recipes-modules/u-dma-buf/u-dma-buf.bb
#* 書き直しが必要 -> 不要
#  以下を追加
#           file://u-dma-buf-mgr.c \ 

#確認用コマンド
$ ls ./project-spec/meta-user/recipes-modules/u-dma-buf/files

$ petalinux-config -c rootfs 

実コード

Host 側でビルドしておく。
ビルド後, scp コマンドで実機側に送る。

  • resetvector の開始アドレスを 0x40000000 になるように対応しています。
# アプリのビルド
$ xsct app5.tcl
#バイナリ転送
$ scp -r sd_aiedge petalinux@192.168.0.6:~/
$ scp -rp ./build/ws/app5/Debug/app5.elf petalinux@192.168.0.6:~/
  • (192.168.0.6 は実機側の設定を確認して変更してください)

実際に動かす

# sd_aiedge -> aiedge
$ sudo cp -r sd_aiedge /lib/firmware/xilinx/aiedge
# FPGA Manager による登録
$	sudo xmutil listapps
$	sudo xmutil unloadapp
$	sudo xmutil loadapp aiedge
#アプリ実行
$ sudo ./app5.elf

(アプリ実行する際に /dev へのアクセスで root 権限が必要になるため sudo をつけて実行している)

実行結果

参考リンク

petalinux への u-dma-buf の登録方法について

(https://www.bposhaughnessy.com/making-a-petalinux-microsd-card-with-u-dma-buf-detailed/)

自作IPの操作

(https://qiita.com/iwatake2222/items/da91ce4dc2a8a8df3c0a)

riscv 操作

(https://lp6m.hatenablog.com/entry/2022/10/01/011526)

u-dma-buf 操作クラス

(https://github.com/ryuz/jelly)

Discussion