デバイスツリー.dtbの作成


ここでは、デバイスツリーの生成手順について説明する。

目次

前提条件

  • 使用するvivadoのバージョンは、2018.2であること。
  • ザイリンクスSDK(v2018.2)がインストールされていること。
  • 使用するOSがUbuntu16.04 LTS であること。
  • vivadoでhdfファイルとbitファイルを生成していること。

手順

この手順は、Xilinxリポジトリからデバイスツリーをダウンロードするところから、デバイスツリーの生成までを説明する。

Xilinxリポジトリからデバイスツリーのダウンロード

次コマンドを入力し、Xilinxリポジトリからデバイスツリーをダウンロードする。
git clone https://github.com/Xilinx/device-tree-xlnx

ダウンロードが完了すると、device-tree-xlnxというディレクトリが生成されるので、そのディレクトに移動する。
cd ./device-tree-xlnx/

使用するvivadoのバージョンでブランチを切る。今回は2018.2なので、xilinx-v2018.2でチェックアウトし、xilinx-v2018.2_zyboというブランチを作成する。
git checkout -b xilinx-v2018.2_zybo refs/tags/xilinx-v2018.2


XSDKの起動

device-tree-xlnxと同じ階層にdtsという新しいディレクトリを作成する。
mkdir dts
そのディレクトリにhdfファイルをコピーする。 次のコマンドを入力し、XSDKの環境変数を設定する。
source /opt/Xilinx/SDK/2018.2/settings64.sh
hsiと入力し、XSDKをCUIモードで起動する。

  • 起動すると、次のログが表示される。
****** hsi v2018.2 (64-bit)
  **** SW Build 2258646 on Thu Jun 14 20:02:38 MDT 2018
    ** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.
hsi%


hdfファイルのセット

hdfファイルをセットする。
set hwdsgn [open_hw_design TopZybo.hdf]

バイスツリー(dts、dtsi)の生成

次のコマンドを入力し、デバイスリーファイルを生成する。
リポジトリのパスやリポジトリ自体を間違えていると、エラーが発生する。

set_repo_path ../../device-tree-xlnx/
create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0
generate_target -dir dts


  • dtsフォルダには、デバイスツリーを含む次のファイルが生成されている。
device-tree.mss  pl.dtsi        system-top.dts  zynq-7000.dtsi
pcw.dtsi         skeleton.dtsi  system.dts



  • 生成されてファイルのうち、使用するのは次である。その他は使用しない。
    • pl.dtsi
      ・IPコアの名前やアドレスなどの情報が格納されているファイル
    • pcw.dtsi
      ・ZYNQ IPで設定したMIOやペリフェラルなどの情報が格納されているファイル
    • system-top.dts
      ・メモリ情報やUARTの設定などが格納されているファイル
      ・pl.dtsi、pcw.dtsi、zynq-7000.dtsiを集約する役割もある
    • zynq-7000.dtsi ・CPUや全PSペリフェラルの情報が格納されているファイル


バイスツリー(dts、dtsi)の編集

生成されたデバイスツリーでは、MIDOのデバイスツリーが記載されていない。 そのため、MIDOのデバイスツリーを追加し、イーサを動くようにする。

system-user.dtsiファイルの作成

バイスツリーを記載するためにsystem-user.dtsiファイルを作成する。
touch system-user.dtsi
system-user.dtsiファイルを開き、デバイスツリーを書き込む。
system-user.dtsi
書き込む内容は、参考サイトNo.5-6を参考にしている。

gem0 {
  phy-handle = <&ethernet_phy>;
/*  phy-reset-gpio = <&axi_gpio_eth 0 0>;
  phy-reset-active-low;
  phy-reset-duration = <10>; */
  ethernet_phy: ethernet-phy@1 { /* rtl8211e-vl */
    reg = <1>;
    device_type = "ethernet-phy";
    mdio {
        #address-cells = <1>;
        #size-cells = <0>;
        phy0: phy@1 {
            compatible = "realtek,RTL8211E";
            device_type = "ethernet-phy";
            reg = <1>;
        } ;
    } ;

  };
};


次に、編集したデバイススリーsystem-user.dtsiと自動生成のデバイスツリーをマージする。
system-top.dtsファイルを開き、デバイスツリーを編集する。
gedit system-top.dts

編集内容は次に示す。

/dts-v1/;
/include/ "zynq-7000.dtsi"
/include/ "pl.dtsi"
/include/ "pcw.dtsi"
+/include/ "system-user.dtsi"

以上で、デバイスツリーの編集は完了である。

バイスツリー(dtb)の生成

  • 次のコマンドを入力し、デバイスツリーの変換を行う。
    dtc -I dts -O dtb -o zynq-zybo.dtb system-top.dts

おわりに

エラー

リポジトリのパスやリポジトリ自体を間違えていると、エラーが発生する。

エラー内容

バイスツリーを生成するときに、リポジトリの場所やリポジトリが間違えていると次のエラーが発生する。

hsi% create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0
ERROR: [Hsi 55-1597] SwCore device_tree is not found in Repositories
ERROR: [Hsi 55-1597] SwCore device_tree is not found in Repositories
ERROR: [Hsi 55-1594] Core device_tree of version  not found in repositories
ERROR: [Hsi 55-1447] Error: running create_sw_design.
ERROR: [Common 17-39] 'create_sw_design' failed due to earlier errors.



対策


  • バイスツリーのフォルダが格納されている正しい場所を指定する。
    set_repo_path ../../device-tree-xlnx/

  • バイスツリーリポジトリが次からダウンロードすること。
    git clone https://github.com/Xilinx/device-tree-xlnx
    ※私は、間違えて違うリポジトリをダウンロードしていた。
    git clone https://github.com/Xilinx/linux-xlnx.git

参考サイト

  1. Build Device Tree Blob
    https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842279/Build+Device+Tree+Blob

  2. Petalinux 2017.2 - questions about the dts & dtsi files
    https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-2017-2-questions-about-the-dts-amp-dtsi-files/m-p/801134

  3. [Linux][kernel] Device Tree についてのまとめ
    https://qiita.com/koara-local/items/ed99a7b96a0ca252fc4e

  4. 組み込みLinuxデバイスドライバの作り方 (11)
    https://qiita.com/take-iwiw/items/0d13142863d9ed064e41

  5. Digilent/Petalinux-Zybo:system-user.dtsi
    https://github.com/Digilent/Petalinux-Zybo/tree/master/Zybo/project-spec/meta-user/recipes-bsp/device-tree/files

  6. zynq / zybo > ZyboにてPetalinuxでEthernetを使うまでの手順
    https://qiita.com/7of9/items/43e650f2e7d9c55da175