FC2カウンター FPGAの部屋 Docker 上のUbuntu 16.04 のPetaLinux 2018.2で、Vivado 2018.3のSDKのディレクトリを使用してRootFSを使用するUltra96のPetaLinuxをビルドする(Ultra96 BSPを使用)にPLのUIOを追加した
FC2ブログ

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

FPGAの部屋

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

Docker 上のUbuntu 16.04 のPetaLinux 2018.2で、Vivado 2018.3のSDKのディレクトリを使用してRootFSを使用するUltra96のPetaLinuxをビルドする(Ultra96 BSPを使用)にPLのUIOを追加した

Docker 上のUbuntu 16.04 のPetaLinux 2018.2で、Vivado 2018.3のSDKのディレクトリを使用してRootFSを使用するUltra96のPetaLinuxをビルドする(Ultra96 BSPを使用)にUIOを追加した””の続き。

前回は、Linux のブートオプションに uio_pdrv_genirq.of_id=generic-uio cpuidle.off=1 を追加して、UIOを活かした。今回は、PL のIP をUIO として設定してみよう。

参考にさせて頂くのは、”ZYBO (Zynq) 初心者ガイド (16) Linuxから自作IPをUIOで制御する”だ。とっても助かったというか、真似させていただいた。

Docker 上のUbuntu 16.04 のPetaLinux 2018.2で、Vivado 2018.3のSDKのディレクトリを使用してRootFSを使用するUltra96のPetaLinuxをビルドする(Ultra96 BSPを使用)にUIOを追加した”のPetaLinux 2018.2 のプロジェクトを使用して、PL のIP のUIO を作成する。

最初にPL のDTS を見てみよう。PetaLProj/cam_dp_183/componets/plnx_workspace/device-tree/device-tree/pl.dtsi がそれだ。
PetaLinux_72_190413.png

PetaLinux_73_190413.png

/*
 * CAUTION: This file is automatically generated by Xilinx.
 * Version:  
 * Today is: Fri Apr 12 20:17:06 2019
 */


/ {
    amba_pl: amba_pl@0 {
        #address-cells = <2>;
        #size-cells = <2>;
        compatible = "simple-bus";
        ranges ;
        axi_gpio_1: gpio@a0013000 {
            #gpio-cells = <3>;
            clock-names = "s_axi_aclk";
            clocks = <&clk 71>;
            compatible = "xlnx,xps-gpio-1.00.a";
            gpio-controller ;
            reg = <0x0 0xa0013000 0x0 0x1000>;
            xlnx,all-inputs = <0x1>;
            xlnx,all-inputs-2 = <0x0>;
            xlnx,all-outputs = <0x0>;
            xlnx,all-outputs-2 = <0x0>;
            xlnx,dout-default = <0x00000000>;
            xlnx,dout-default-2 = <0x00000000>;
            xlnx,gpio-width = <0x2>;
            xlnx,gpio2-width = <0x20>;
            xlnx,interrupt-present = <0x0>;
            xlnx,is-dual = <0x0>;
            xlnx,tri-default = <0xFFFFFFFF>;
            xlnx,tri-default-2 = <0xFFFFFFFF>;
        };
        camera_axi_iic_0: i2c@a0011000 {
            #address-cells = <1>;
            #size-cells = <0>;
            clock-names = "s_axi_aclk";
            clocks = <&clk 71>;
            compatible = "xlnx,xps-iic-2.00.a";
            reg = <0x0 0xa0011000 0x0 0x1000>;
        };
        camera_mt9d111_inf_axis_0: mt9d111_inf_axis@a0010000 {
            compatible = "xlnx,mt9d111-inf-axis-1.0";
            reg = <0x0 0xa0010000 0x0 0x1000>;
        };
        camera_vflip_dma_write2_0: vflip_dma_write2@a0020000 {
            compatible = "xlnx,vflip-dma-write2-1.0";
            reg = <0x0 0xa0020000 0x0 0x10000>;
            xlnx,s-axi-axilites-addr-width = <0x6>;
            xlnx,s-axi-axilites-data-width = <0x20>;
        };
        display_axi_gpio_0: gpio@a0012000 {
            #gpio-cells = <3>;
            clock-names = "s_axi_aclk";
            clocks = <&clk 71>;
            compatible = "xlnx,xps-gpio-1.00.a";
            gpio-controller ;
            reg = <0x0 0xa0012000 0x0 0x1000>;
            xlnx,all-inputs = <0x0>;
            xlnx,all-inputs-2 = <0x0>;
            xlnx,all-outputs = <0x1>;
            xlnx,all-outputs-2 = <0x0>;
            xlnx,dout-default = <0x00000000>;
            xlnx,dout-default-2 = <0x00000000>;
            xlnx,gpio-width = <0x1>;
            xlnx,gpio2-width = <0x20>;
            xlnx,interrupt-present = <0x0>;
            xlnx,is-dual = <0x0>;
            xlnx,tri-default = <0xFFFFFFFF>;
            xlnx,tri-default-2 = <0xFFFFFFFF>;
        };
        display_disp_dmar_axis_0: disp_dmar_axis@a0000000 {
            compatible = "xlnx,disp-dmar-axis-1.0";
            reg = <0x0 0xa0000000 0x0 0x10000>;
            xlnx,s-axi-axilites-addr-width = <0x6>;
            xlnx,s-axi-axilites-data-width = <0x20>;
        };
        psu_ctrl_ipi: PERIPHERAL@ff380000 {
            compatible = "xlnx,PERIPHERAL-1.0";
            reg = <0x0 0xff380000 0x0 0x80000>;
        };
        psu_message_buffers: PERIPHERAL@ff990000 {
            compatible = "xlnx,PERIPHERAL-1.0";
            reg = <0x0 0xff990000 0x0 0x10000>;
        };
    };
};


Docker 上のUbuntu 16.04 のPetaLinux 2018.2で、Vivado 2018.3のSDKのディレクトリを使用してRootFSを使用するUltra96のPetaLinuxをビルドする(Ultra96 BSPを使用)にUIOを追加した”で作成したMicroSD カードを起動すると、 /proc/device-tree/amba_pl@0/ に pl.dtsi のデバイスが表示されるのが見える。

、”ZYBO (Zynq) 初心者ガイド (16) Linuxから自作IPをUIOで制御する”によると、(多少、PetaLinux のバージョン違いによりディレクトリ名が違っているところはあるのだが) PetaLProj/cam_dp_183/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi が編集可能なDTS のファイルとのことだ。
cam_dp_183 のDevice-Tree の設定は、”カメラ画像をDisplayPortに出力する8(Ultra96 での準備)”に書いてあるので、それを参照しながら system-user.dtsi を書き換えた。
PetaLinux_72_190413.png

system-user.dtsi を示す。
PetaLinux_73_190413.png

/include/ "system-conf.dtsi"
/include/ "openamp-overlay.dtsi"
/ {
    chosen {
        bootargs = "console=ttyPS0,115200 earlyprintk earlycon clk_ignore_unused root=/dev/mmcblk0p2 rw rootwait uio_pdrv_genirq.of_id=generic-uio cpuidle.off=1";
    };
};

&camera_mt9d111_inf_axis_0 {
    compatible = "generic-uio";
};

&camera_axi_iic_0 {
    compatible = "generic-uio";
};

&display_disp_dmar_axis_0 {
    compatible = "generic-uio";
};

&camera_vflip_dma_write2_0 {
    compatible = "generic-uio";
};

&display_axi_gpio_0 {
    compatible = "generic-uio";
};

&axi_gpio_1 {
    compatible = "generic-uio";
};


これで、petalinux-build を行った。
LANG=en_US.UTF-8 petalinux-build
PetaLinux_75_190413.png

petalinux-build で書き換えられた image.ub を MicroSD カードのそれと入れ替えた。
そしてUltra96 でブートした。

/sys/class/uio を見ると、今度は、uio0 だけでなく、uio6 までの uio があった。
uio0 は前と変わらずに axi-pmon で、 uio1 はgpio, uio2 は i2c, uio3 は mt9d111_inf_axis, uio4 は vflip_dma_write2, uio5 は gpio, uio6 は disp_dmar_axis だった。これは、pl.dtsi の順番で間違いないようだ。
PetaLinux_76_190413.png
PetaLinux_77_190413.png
PetaLinux_78_190413.png

ログを示す。

root@xilinx-ultra96-reva-2018_2:~# cd /sys/class
root@xilinx-ultra96-reva-2018_2:/sys/class# ls
ata_device  bsg       fpga_region  input     mtd           rc       scsi_host   video4linux
ata_link    devcoredump   gpio         iommu     net           regulator    sound   vtconsole
ata_port    dma       graphics     leds  pci_bus       remoteproc   spi_master  watchdog
backlight   drm       hwmon        mdio_bus  phy           rfkill       tty     xilinx_sdfec
bdi     extcon    i2c-adapter  mem   power_supply  rtc      udc     zynqmp_ipi_mbox
block       fpga_bridge   i2c-dev      misc  pps           scsi_device  uio
bluetooth   fpga_manager  ieee80211    mmc_host  ptp           scsi_disk    vc
root@xilinx-ultra96-reva-2018_2:/sys/class# cd uio
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# ls
uio0  uio1  uio2  uio3  uio4  uio5  uio6
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# cd uio1
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1# ls
dev  device  event  maps  name  power  subsystem  uevent  version
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1# less name
gpio
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1# cd ..
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio0/name
axi-pmon
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio1/name
gpio
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio2/name
i2c
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio3/name
mt9d111_inf_axis
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio4/name
vflip_dma_write2
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio5/name
gpio
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio6/name
disp_dmar_axis
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# [  616.576476] PLL: shutdown
ls
uio0  uio1  uio2  uio3  uio4  uio5  uio6
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# cd uio1
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1# ls
dev  device  event  maps  name  power  subsystem  uevent  version
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1# cd maps
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1/maps# ls
map0
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1/maps# cd map0
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1/maps/map0# ls
addr  name  offset  size
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1/maps/map0# more addr 
0x00000000a0013000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1/maps/map0# more name 
/amba_pl@0/gpio@a0013000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1/maps/map0# more offset 
0x0
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1/maps/map0# more size 
0x0000000000001000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1/maps/map0# cd ../..
root@xilinx-ultra96-reva-2018_2:/sys/class/uio/uio1# cd .. 
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio2/maps/map0/addr 
0x00000000a0011000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio2/maps/map0/name 
/amba_pl@0/i2c@a0011000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio2/maps/map0/offset 
0x0
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio2/maps/map0/size   
0x0000000000001000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio3/maps/map0/addr 
0x00000000a0010000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio3/maps/map0/name 
/amba_pl@0/mt9d111_inf_axis@a0010000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio3/maps/map0/offset 
0x0
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio3/maps/map0/size   
0x0000000000001000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio4/maps/map0/addr 
0x00000000a0020000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio4/maps/map0/name 
/amba_pl@0/vflip_dma_write2@a0020000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio4/maps/map0/offset 
0x0
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio4/maps/map0/size   
0x0000000000010000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio5/maps/map0/addr 
0x00000000a0012000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio5/maps/map0/name 
/amba_pl@0/gpio@a0012000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio5/maps/map0/offset 
0x0
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio5/maps/map0/size   
0x0000000000001000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio6/maps/map0/addr 
0x00000000a0000000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio6/maps/map0/name 
/amba_pl@0/disp_dmar_axis@a0000000
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio6/maps/map0/offset 
0x0
root@xilinx-ultra96-reva-2018_2:/sys/class/uio# more uio6/maps/map0/size   
0x0000000000010000

  1. 2019年04月13日 13:53 |
  2. PetaLinux
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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