uENv.txtファイルの作成

zImageファイルの生成手順について記載する。これも、参考サイト:No.1と同じことを行っている。というか、これはひとつの記事にするほどの内容ではなかった。

目次


uENv.txtファイルの作成

次のコマンドにて、uENv.txtファイルを作成する。
touch uENv.txt
uENv.txtファイルを開き、環境変数を書き込む。
gedit uENv.txt
書き込む内容を次に示す。

bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1
uenvcmd=fatload mmc 0 0x03000000 TopZybo.bit && fpga loadb 0 0x03000000 $filesize && fatload mmc 0 0x03000000 zImage && fatload mmc 0 0x02A00000 zynq-zybo.dtb && bootz 0x03000000 - 0x02A00000

以上で、uENv.txtファイルの作成は完了である。

補足:各コマンドについて

  • uenvcmd
     ・fatload mmcをまとめた変数
  • fatload mmc ^参考サイト:No.1^
     ・SDカード内にあるデータのアドレス範囲とファイル名を指定する変数
  • fpga loadb
     ・u-bootからFPGAをコンフィグレーションするための変数
     ・fatload mmc変数と組みあわせて使用する。
     ・例) fatload mmc 0 0x03000000 TopZybo.bit && fpga loadb 0 0x03000000 $filesize
  • bootz
     ・Linux カーネルを起動するためのアドレスを指定する変数
     ・例) bootz 0x03000000 - 0x02A00000

参考サイト

  1. zyboでXilinxリポジトリのu-bootとLinuxを動かす
    https://qiita.com/yoshiyasu1111/items/3cd78790c5e9df6beec1
  2. uenv.txt file for building Linux Kernel
    https://forums.xilinx.com/t5/Embedded-Linux/uenv-txt-file-for-building-Linux-Kernel/td-p/727214
  3. 5.9.4.2. bootm - boot application image from memory
    https://www.denx.de/wiki/view/DULG/UBootCmdGroupExec#Section_5.9.4.2.
  4. Zynqをu-bootだけでブートする
    https://sweetcafe.jp/?*20150710-2

boot.binファイル、u-boot.imgファイルの生成

boot.binファイル、u-boot.imgファイルの生成手順について記載する。というか、参考サイト:No.1と同じことを行っている。

目次


前提条件

  • 使用するOSがUbuntu16.04 LTS であること。
  • 使用するvivadoのバージョンは、2018.2であること。

手順

この手順は、Xilinxリポジトリからu-bootソースファイルをダウンロードすることろから、boot.binファイル、u-boot.imgファイルの生成まで説明する。なお、uEnv.txtを使用するためにzynq-common.hを修正する。


Xilinxリポジトリからu-bootソースファイルのダウンロード

次コマンドを入力し、Xilinxリポジトリからu-bootのソースファイルをダウンロードする。
git clone https://github.com/Xilinx/u-boot-xlnx.git

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

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

zynq-common.hファイルの修正

次のコマンドを入力し、zynq-common.hファイルが格納されているディレクトリまで移動する。
cd ./include/configs

次のコマンドを入力し、zynq-common.hファイルを編集する。
gedit zynq-common.h
編集内容を次に示す。

  • 環境変数コマンドCONFIG_EXTRA_ENV_SETTINGSを変更し、uEnv.txtを使用できるようにする。
  • 起動方法コマンドCONFIG_BOOTCOMMANDを追加し、SDカードからLinuxを起動するようにする。
  • zImage でのブートができるようにするため、CONFIG_CMD_BOOTZコマンドを追加する。

編集箇所を次に示す。

- /* Default environment */
- #ifndef CONFIG_EXTRA_ENV_SETTINGS
- #define CONFIG_EXTRA_ENV_SETTINGS    \
-  "ethaddr=00:0a:35:00:01:22\0" \
-  "kernel_image=uImage\0"   \
-  "kernel_load_address=0x2080000\0" \
-  "ramdisk_image=uramdisk.image.gz\0"   \
-  "ramdisk_load_address=0x4000000\0"    \
-  "devicetree_image=devicetree.dtb\0"   \
-  "devicetree_load_address=0x2000000\0" \
-  "bitstream_image=system.bit.bin\0"    \
-  "boot_image=BOOT.bin\0"   \
-  "loadbit_addr=0x100000\0" \
-  "loadbootenv_addr=0x2000000\0" \
-  "kernel_size=0x500000\0"  \
-  "devicetree_size=0x20000\0"   \
-  "ramdisk_size=0x5E0000\0" \
-  "boot_size=0xF00000\0"    \
-  "fdt_high=0x20000000\0"   \
-  "initrd_high=0x20000000\0"    \
-  "bootenv=uEnv.txt\0" \
-  "loadbootenv=load mmc 0 ${loadbootenv_addr} ${bootenv}\0" \
-  "importbootenv=echo Importing environment from SD ...; " \
-      "env import -t ${loadbootenv_addr} $filesize\0" \
-  "sd_uEnvtxt_existence_test=test -e mmc 0 /uEnv.txt\0" \
-  "preboot=if test $modeboot = sdboot && env run sd_uEnvtxt_existence_test; " \
-          "then if env run loadbootenv; " \
-              "then env run importbootenv; " \
-          "fi; " \
-      "fi; \0" \
-  "mmc_loadbit=echo Loading bitstream from SD/MMC/eMMC to RAM.. && " \
-      "mmcinfo && " \
-      "load mmc 0 ${loadbit_addr} ${bitstream_image} && " \
-      "fpga load 0 ${loadbit_addr} ${filesize}\0" \
-  "norboot=echo Copying Linux from NOR flash to RAM... && " \
-      "cp.b 0xE2100000 ${kernel_load_address} ${kernel_size} && " \
-      "cp.b 0xE2600000 ${devicetree_load_address} ${devicetree_size} && " \
-      "echo Copying ramdisk... && " \
-      "cp.b 0xE2620000 ${ramdisk_load_address} ${ramdisk_size} && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "qspiboot=echo Copying Linux from QSPI flash to RAM... && " \
-      "sf probe 0 0 0 && " \
-      "sf read ${kernel_load_address} 0x100000 ${kernel_size} && " \
-      "sf read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \
-      "echo Copying ramdisk... && " \
-      "sf read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "uenvboot=" \
-      "if run loadbootenv; then " \
-          "echo Loaded environment from ${bootenv}; " \
-          "run importbootenv; " \
-      "fi; " \
-      "if test -n $uenvcmd; then " \
-          "echo Running uenvcmd ...; " \
-          "run uenvcmd; " \
-      "fi\0" \
-  "sdboot=if mmcinfo; then " \
-          "run uenvboot; " \
-          "echo Copying Linux from SD to RAM... && " \
-          "load mmc 0 ${kernel_load_address} ${kernel_image} && " \
-          "load mmc 0 ${devicetree_load_address} ${devicetree_image} && " \
-          "load mmc 0 ${ramdisk_load_address} ${ramdisk_image} && " \
-          "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \
-      "fi\0" \
-  "usbboot=if usb start; then " \
-          "run uenvboot; " \
-          "echo Copying Linux from USB to RAM... && " \
-          "load usb 0 ${kernel_load_address} ${kernel_image} && " \
-          "load usb 0 ${devicetree_load_address} ${devicetree_image} && " \
-          "load usb 0 ${ramdisk_load_address} ${ramdisk_image} && " \
-          "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \
-      "fi\0" \
-  "nandboot=echo Copying Linux from NAND flash to RAM... && " \
-      "nand read ${kernel_load_address} 0x100000 ${kernel_size} && " \
-      "nand read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \
-      "echo Copying ramdisk... && " \
-      "nand read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "jtagboot=echo TFTPing Linux to RAM... && " \
-      "tftpboot ${kernel_load_address} ${kernel_image} && " \
-      "tftpboot ${devicetree_load_address} ${devicetree_image} && " \
-      "tftpboot ${ramdisk_load_address} ${ramdisk_image} && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "rsa_norboot=echo Copying Image from NOR flash to RAM... && " \
-      "cp.b 0xE2100000 0x100000 ${boot_size} && " \
-      "zynqrsa 0x100000 && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "rsa_nandboot=echo Copying Image from NAND flash to RAM... && " \
-      "nand read 0x100000 0x0 ${boot_size} && " \
-      "zynqrsa 0x100000 && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "rsa_qspiboot=echo Copying Image from QSPI flash to RAM... && " \
-      "sf probe 0 0 0 && " \
-      "sf read 0x100000 0x0 ${boot_size} && " \
-      "zynqrsa 0x100000 && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "rsa_sdboot=echo Copying Image from SD to RAM... && " \
-      "load mmc 0 0x100000 ${boot_image} && " \
-      "zynqrsa 0x100000 && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-  "rsa_jtagboot=echo TFTPing Image to RAM... && " \
-      "tftpboot 0x100000 ${boot_image} && " \
-      "zynqrsa 0x100000 && " \
-      "bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \
-      DFU_ALT_INFO \
-      BOOTENV
- #endif

+ /* Default environment */
+ #ifndef CONFIG_EXTRA_ENV_SETTINGS
+ #define CONFIG_EXTRA_ENV_SETTINGS      \
+    "fit_image=fit.itb\0"       \
+    "load_addr=0x2000000\0"     \
+    "fit_size=0x800000\0"       \
+    "flash_off=0x100000\0"      \
+    "nor_flash_off=0xE2100000\0"    \
+    "fdt_high=0x20000000\0"     \
+    "initrd_high=0x20000000\0"  \
+    "norboot=echo Copying FIT from NOR flash to RAM... && " \
+        "cp.b ${nor_flash_off} ${load_addr} ${fit_size} && " \
+        "bootm ${load_addr}\0" \
+    "sdboot=echo Copying FIT from SD to RAM... && " \
+        "load mmc 0 ${load_addr} ${fit_image} && " \
+        "bootm ${load_addr}\0" \
+    "jtagboot=echo TFTPing FIT to RAM... && " \
+        "tftpboot ${load_addr} ${fit_image} && " \
+        "bootm ${load_addr}\0" \
+    "usbboot=if usb start; then " \
+            "echo Copying FIT from USB to RAM... && " \
+            "load usb 0 ${load_addr} ${fit_image} && " \
+            "bootm ${load_addr}\0" \
+        "fi\0" \
+    "bootenv=uEnv.txt\0" \
+    "loadbootenv=load mmc 0 ${load_addr} ${bootenv}\0" \
+    "importbootenv=echo Importing environment from mmc ...;" \
+            "env import -t $load_addr $filesize\0" \
+    "loadbootscript=load mmc 0 ${load_addr} boot.scr\0" \
+    "bootscript=echo Running bootscript from mmc ...;" \
+            "source ${load_addr}\0" \
+    DFU_ALT_INFO
+ #endif
+
+
+ #define CONFIG_BOOTCOMMAND \
+     "if mmc rescan; then " \
+         "echo SD/MMC found on device...;" \
+         "if run loadbootenv; then " \
+             "echo Loaded environment from ${bootenv};" \
+             "run importbootenv;" \
+         "fi;" \
+         "if test -n $uenvcmd; then " \
+             "echo Running uenvcmd ...;" \
+             "run uenvcmd;" \
+         "fi;" \
+         "if run loadbootscript; then " \
+             "run bootscript; " \
+         "fi; " \
+     "fi;" \
+
+
+
+ #define CONFIG_CMD_BOOTZ

boot.binファイル、u-boot.imgファイルの生成

次のコマンドを入力し、u-boot-xlnxのディレクトリまで移動する。
cd ../../

移動した後、ビルドを行う。

make ARCH=arm zynq_zybo_defconfig
make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

ビルドが完了後、u-boot.imgがu-boot-xlnxのディレクトリ、boot.binがsplのディレクトリに生成される。

参考サイト

  1. zyboでXilinxリポジトリのu-bootとLinuxを動かす
    https://qiita.com/yoshiyasu1111/items/3cd78790c5e9df6beec1

  2. ZYBO用U-Bootを、ブート時にuEnv.txtを読むようにして、かつBOOT.binから起動できるようにする
    https://qiita.com/ikwzm/items/1734676d787e2693df47

zybo用Linuxイメージとルートファイルシステムの作成手順

はじめに

zybo用Linuxイメージとルートファイルシステムの作成手順について説明する。

目次


SDブート

今回使用するブートデバイスはSDカードである。SDカードを使用してLinuxを起動するためには、FATファイルシステムルートファイルシステムの2つのファイルシステムが必要である。そのため、SDカードのパーティションを次の2つに分け、各ファイルシステムに必要なファイル・データを格納する。

zybo用Linuxイメージ

Linuxイメージの作成手順は、FSBLをブートローダとする方法、U-Boot-spl(U-Boot Second Program Loader)をブートローダとする方法で手順が異なる。それぞれの作成手順の概要とブートシーケンスは、参考サイト:No.1-2に詳しく、かつ分かりやすく書かれている。

U-Boot-splは、boot.binファイルに.bitファイルを含めず、またfsbl.elfファイルを作成しなくてもよいので、簡単にイメージが差し替えできるという利点を持つ。そのため、今回は②U-Boot-splのブートローダを用いる方法にする。

FAT32ファイルシステムに格納するファイル

U-Boot-spl(U-Boot Second Program Loader)をブートローダとする方法では、FAT32領域に次の6つのファイルを格納する。

  • TopZybo.bit
    FPGAデータが格納されているファイル。
  • バイスツリー.dtb
    ・ハードウェア情報やPS・PL設定の情報が格納されているファイル
  • boot.bin
     ・ブートローダを起動するための設定情報が格納されているファイル。
  • u-boot.img
     ・U-Bootファイル
  • uENv.txt
     ・u-boot用の環境変数を定義しているファイル
  • zImage
     ・Linux カーネルファイル

zybo用Linuxイメージの作成手順

zybo用Linuxイメージの作成手順を次に示す。

  1. TopZybo.bitの作成
     ・vivadoにて作成する。ここでは割愛する。
  2. デバイスツリー.dtbの作成
  3. boot.binファイル、u-boot.imgファイルの生成
  4. uENv.txtファイルの生成
  5. zImageの生成


作成したzybo用Linuxイメージ

ここに今回作成したzybo用Linuxイメージをアップロードした。

ルートファイルシステム

ext4領域にはUbuntuのルートファイルシステムを格納する。Ubuntuを選択した理由は特にないので、そのうち変更するかも。

ルートファイルシステムの作成手順

Ubuntuのルートファイルシステム作成手順を次に示す。

  1. Ubuntuのルートファイルシステム作成

参考サイト

  1. FPGA+SoC+Linuxのブートシーケンス(ZYNQ+Vivado編):図2 ZYNQでLinuxを動作させるためのデザインフロー
    https://qiita.com/ikwzm/items/1614c35233e1836c7a26
  2. FPGA+SoC+Linuxのブートシーケンス(ZYNQ+U-Boot-SPL編):図2 ZYNQでLinuxを動作させるためのデザインフロー
    https://qiita.com/ikwzm/items/efacec8d8e0744e17d45

  3. ファイルシステムの話
    https://qiita.com/awakia/items/51d24b50585571b6d70b

Natural Docsを使ってverilogファイルからドキュメントを生成する その2

はじめに


前回はNaturalDocsの環境構築を行った。
今回はソースコードにコメントを書き、ドキュメントを作成する。

目次

コメントの記述

前回定義した次のキーワードを使用して、コメントを書いていく。

  • Module
     ・モジュール宣言する記述箇所で使用する。
  • Parameter
     ・Parameter文の記述箇所で使用する。
  • InternalSignal
     ・wireやassign、regなどの内部信号の記述箇所で使用する。

書き方はシンプルで、次のようにコメントを書く。

// キーワード: コメント対象となるもの
// 説明文


段落や太字など、それなりに表記の設定ができる。詳細は、参考サイトNo.1に記載されている。記述例を含め、丁寧に解説されているので、使用する前には一読した方が良い。

記載例 その1

例その1として、作成したキーワード「InternalSignal」を用いて、ドキュメントを作成する。 ソースコード上に次のコメントを書く。

// InternalSignal: cnt00_reg
// データ送受信用カウンタ
reg [7:0] cnt00_reg ;


生成したドキュメントでは、これが次のように表示される。

NaturalDocs、ドキュメント01



記載例 その2

次の例として、作成したキーワード「Module」の説明文に「Parameters」という見出しを付けて、モジュールの入出力信号について説明するドキュメントを作成する。

ソースコード上に次のコメントを書く。

/* Module: Adc
   Parameters:
    clk                  - 入力クロック:100 (MHz)
    rst_n                - 負論理のリセット信号
    ch_slct_in           - CHセレクト信号:1'b0-> CH0、1'b1-> CH1
    enpls_in             - AD変換開始トリガ信号:クロックパルス入力
    s_data_in            - ADCからのシリアルデータ
    config_data_out      - ADCへの設定データ出力信号
    sclk_out             - ADCへのシリアルクロック:2.5 (MHz)
    cs_nout              - チップセレクト信号
    ad_ch0_data_out      - CH0:10 bit ADデータ
    ad_ch1_data_out      - CH1:10 bit ADデータ
*/

module Adc(
    input  wire        clk,
    input  wire        rst_n,
    input  wire        ch_slct_in,
    input  wire        enpls_in,
    input  wire        s_data_in,
    output reg         config_data_out,
    output reg         sclk_out,
    output reg         cs_nout,
    output reg [ 9:0]  ad_ch0_data_out,
    output reg [ 9:0]  ad_ch1_data_out
);


生成したドキュメントでは、これが次のように表示される。

NaturalDocs、コメント02



注意点

コメントを書く時の注意点がある。これらをまとめた。

キーワードと:の間には、スペースを挿入しないこと。

キーワードと:の間にスペースを挿入してしまうと、そのキーワードの部分のドキュメントが生成されない。

コメント対象となるものと:の間にはスペースを挿入すること。

コメント対象となるものと:の間にスペースを挿入してしまうと、そのキーワードの部分のドキュメントが生成されない。 書式は必ず守らなければならない。

'があるコードは、正しく表示されない。

'の文字が存在するソースコードでドキュメントを生成すると、ドキュメント上でソースコードが表示されない。

// InternalSignal: cnt00_reg
// データ送受信用カウンタ
reg [7:0] cnt00_reg=8'b0;


NaturalDocs、ドキュメント02


色々と調べた結果、コメントの書き方ではなく、'があるコードが原因であることが分かった。

どうやら、'があると、下図のようにソースコードが表示されないようである。NaturalDocsのバグか設定の不備かわからないが、ドキュメントを作成するときには気を付けた方が良い。

ドキュメントの生成

コメントを記載した次のverilogファイルを用いて、ドキュメントを生成する。
ソース

前回作成した、アイコンをダブルクリックする。

アイコン


次の画面が表示される。

コマンドライン


Building documentation...
Done.


と表示されたら、ドキュメントが生成されている。 ※これ以外の表記が出たら、ドキュメントが生成されていないので、ディレクトリや設定を見直すこと。

指定したドキュメント出力先のディレクトリには、次のファイルが生成されている。 生成ファイル
ドキュメントであるindex.htmlを開く。 表紙には、Project.txtで設定したタイトルなどが表示される。

サンプルドキュメント


左側には、verilogファイルが表示されているので、それをクリックする。 ソースコードで記載したコメントが表示されている。

サンプルドキュメント2


使ってみた感想


簡単な設定とコメントでドキュメントができるので、便利であった。特に、自分でキーワードが定義できるので、verilogに適した表記のドキュメントが生成できるのが、魅力的だと感じた。
ただ、表や図を張り付けることができないので、そこが少し残念であった。
ドキュメントとは関係ないが、コメントのよい書き方についてもっと学ぼうと感じた。。

最後に今回作成したドキュメントは以下に保存しておく。
サンプルドキュメント

参考サイト

  1. NaturalDocs:Documenting Your Code
    https://www.naturaldocs.org/getting_started/documenting_your_code/

デバイスツリー.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

FSBLのビルド


ここでは、FSBLのビルド方法についてまとめた。基本的には、ザイリンクスのサイトに従って行う。 参考サイト:No.1

目次

前提条件


  • ザイリンクスSDK(v2018.2)がインストールされていること。
  • 使用するOSがUbuntu16.04 LTS であること。
  • vivadoでhdfファイルとbitファイルを生成していること。
     ・ここでは、hdfファイル名をTopZybo.hdf、bitファイル名をTopZybo.bitとする。
  • フォルダには、TopZybo.bit TopZybo.hdfのみが入っていること。

    例)
tanuki@tanuki-VirtualBox:~/work/GenBootbin/ZYBOv001$ ls
TopZybo.bit  TopZybo.hdf



FSBLのビルド

FSBLのビルドは、hsiコマンドを使用して実行する。ちなみに、hsiは Hardware Software Interfaceのことらしい。

手順

FSBLのビルド手順について記載する。

gmakeのシンボリックリンク作成

※これを行わないと、エラーが発生する。

FSBLビルド用フォルダの作成

  • FSBLビルド用フォルダを作成する。
    mkdir zynq_fsbl

XSDKの起動

  • 次のコマンドを入力し、、XSDKの環境変数を設定する。
    source /opt/Xilinx/SDK/2018.2/settings64.sh
  • hsiと入力し、XSDKを起動する。

  • 起動すると、次のログが表示される。

****** 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]

FSBLのビルド

  • 次のコマンドを入力し、fsblのビルドを行う。
    generate_app -hw $hwdsgn -os standalone -proc ps7_cortexa9_0 -app zynq_fsbl -compile -sw zynq -dir zynq_fsbl

  • ビルド中に表示されるログを以下に示す。

WARNING : No interface that uses file system is available
Running Make include in ps7_cortexa9_0/libsrc/dmaps_v2_3/src
Running Make include in ps7_cortexa9_0/libsrc/ddrps_v1_0/src
Running Make include in ps7_cortexa9_0/libsrc/standalone_v6_7/src
Running Make include in ps7_cortexa9_0/libsrc/scugic_v3_9/src
Running Make include in ps7_cortexa9_0/libsrc/xilrsa_v1_5/src
Running Make include in ps7_cortexa9_0/libsrc/xilffs_v3_9/src
Running Make include in ps7_cortexa9_0/libsrc/xadcps_v2_2/src
Running Make include in ps7_cortexa9_0/libsrc/devcfg_v3_5/src
Running Make include in ps7_cortexa9_0/libsrc/scuwdt_v2_1/src
Running Make include in ps7_cortexa9_0/libsrc/cpu_cortexa9_v2_6/src
Running Make include in ps7_cortexa9_0/libsrc/coresightps_dcc_v1_4/src
Running Make include in ps7_cortexa9_0/libsrc/scutimer_v2_1/src
Running Make libs in ps7_cortexa9_0/libsrc/dmaps_v2_3/src
Compiling dmaps
arm-none-eabi-ar: ../../../lib/libxil.a を作成しています
Running Make libs in ps7_cortexa9_0/libsrc/ddrps_v1_0/src
Compiling ddrps
Running Make libs in ps7_cortexa9_0/libsrc/standalone_v6_7/src
Compiling standalone
In file included from sleep.c:57:0:
xtime_l.h:89:9: note: #pragma message: For the sleep routines, Global timer is being used
 #pragma message ("For the sleep routines, Global timer is being used")
         ^~~~~~~
In file included from xtime_l.c:53:0:
xtime_l.h:89:9: note: #pragma message: For the sleep routines, Global timer is being used
 #pragma message ("For the sleep routines, Global timer is being used")
         ^~~~~~~
In file included from usleep.c:60:0:
xtime_l.h:89:9: note: #pragma message: For the sleep routines, Global timer is being used
 #pragma message ("For the sleep routines, Global timer is being used")
         ^~~~~~~
In file included from xil_sleeptimer.c:55:0:
xtime_l.h:89:9: note: #pragma message: For the sleep routines, Global timer is being used
 #pragma message ("For the sleep routines, Global timer is being used")
         ^~~~~~~
Running Make libs in ps7_cortexa9_0/libsrc/scugic_v3_9/src
Compiling scugic
Running Make libs in ps7_cortexa9_0/libsrc/xilrsa_v1_5/src
Running Make libs in ps7_cortexa9_0/libsrc/xilffs_v3_9/src
Compiling XilFFs Library
diskio.c: In function 'disk_status':
diskio.c:170:6: warning: unused variable 'DelayCount' [-Wunused-variable]
  u32 DelayCount = 0;
      ^~~~~~~~~~
diskio.c:169:6: warning: unused variable 'StatusReg' [-Wunused-variable]
  u32 StatusReg;
      ^~~~~~~~~
diskio.c: In function 'disk_initialize':
diskio.c:258:6: warning: unused variable 'Status' [-Wunused-variable]
  s32 Status;
      ^~~~~~
diskio.c: In function 'disk_read':
diskio.c:357:9: warning: unused parameter 'buff' [-Wunused-parameter]
   BYTE *buff, /* Pointer to the data buffer to store read data */
         ^~~~
diskio.c:358:9: warning: unused parameter 'sector' [-Wunused-parameter]
   DWORD sector, /* Start sector number (LBA) */
         ^~~~~~
diskio.c: In function 'disk_ioctl':
diskio.c:401:7: warning: unused parameter 'pdrv' [-Wunused-parameter]
  BYTE pdrv,    /* Physical drive number (0) */
       ^~~~
diskio.c:402:7: warning: unused parameter 'cmd' [-Wunused-parameter]
  BYTE cmd,    /* Control code */
       ^~~
diskio.c:403:8: warning: unused parameter 'buff' [-Wunused-parameter]
  void *buff    /* Buffer to send/receive control data */
        ^~~~
diskio.c: In function 'disk_write':
diskio.c:502:14: warning: unused parameter 'buff' [-Wunused-parameter]
  const BYTE *buff, /* Data to be written */
              ^~~~
diskio.c:503:8: warning: unused parameter 'sector' [-Wunused-parameter]
  DWORD sector,  /* Sector address (LBA) */
        ^~~~~~
Running Make libs in ps7_cortexa9_0/libsrc/xadcps_v2_2/src
Compiling xadcps
Running Make libs in ps7_cortexa9_0/libsrc/devcfg_v3_5/src
Compiling devcfg
Running Make libs in ps7_cortexa9_0/libsrc/scuwdt_v2_1/src
Compiling scuwdt
Running Make libs in ps7_cortexa9_0/libsrc/cpu_cortexa9_v2_6/src
Compiling cpu_cortexa9
Running Make libs in ps7_cortexa9_0/libsrc/coresightps_dcc_v1_4/src
Compiling coresightps_dcc
Running Make libs in ps7_cortexa9_0/libsrc/scutimer_v2_1/src
Compiling scutimer
Finished building libraries
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c pcap.c -o pcap.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
In file included from pcap.c:104:0:
zynq_fsbl_bsp/ps7_cortexa9_0/include/xtime_l.h:89:9: note: #pragma message: For the sleep routines, Global timer is being used
 #pragma message ("For the sleep routines, Global timer is being used")
         ^~~~~~~
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c qspi.c -o qspi.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c rsa.c -o rsa.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c main.c -o main.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
In file included from main.c:141:0:
zynq_fsbl_bsp/ps7_cortexa9_0/include/xtime_l.h:89:9: note: #pragma message: For the sleep routines, Global timer is being used
 #pragma message ("For the sleep routines, Global timer is being used")
         ^~~~~~~
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c fsbl_hooks.c -o fsbl_hooks.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c md5.c -o md5.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c image_mover.c -o image_mover.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c ps7_init.c -o ps7_init.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c nor.c -o nor.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c nand.c -o nand.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c sd.c -o sd.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
arm-none-eabi-gcc -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -c fsbl_handoff.S -o fsbl_handoff.o -Izynq_fsbl_bsp/ps7_cortexa9_0/include -I.
arm-none-eabi-gcc -o executable.elf  pcap.o  qspi.o  rsa.o  main.o  fsbl_hooks.o  md5.o  image_mover.o  ps7_init.o  nor.o  nand.o  sd.o  fsbl_handoff.o  -MMD -MP       -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard   -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard -Wl,-build-id=none -specs=Xilinx.spec  -lrsa -Wl,--start-group,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lxilffs,-lxil,-lgcc,-lc,--end-group -Wl,--start-group,-lrsa,-lxil,-lgcc,-lc,--end-group  -Wl,--gc-sections -Lzynq_fsbl_bsp/ps7_cortexa9_0/lib -L./ -Tlscript.ld
generate_app: Time (s): cpu = 00:00:08 ; elapsed = 00:00:10 . Memory (MB): peak = 452.422 ; gain = 0.000 ; free physical = 14037 ; free virtual = 25604



ビルド後の生成物

  • ビルド後の生成物はzynq_fsblフォルダに格納されている。

ビルド後の生成物



  • 以上でFSBLのビルドは完了である。次回は、デバイスツリーの作成を行う。
  • なお、hsiコマンドについては、ここのサイトに記載されている。


エラー

  • ビルド中に起こったエラーについて記載する。

    エラー内容

  • シンボリックリンクを作成しないで、hisコマンドを実行すると以下のエラーが発生する。
hsi%     generate_app -hw $hwdsgn -os standalone -proc ps7_cortexa9_0 -app zynq_fsbl -compile -sw zynq_fsbl -dir zynq_fsbl
WARNING : No interface that uses file system is available

ERROR: [Common 17-70] Application Exception: Not found in path: gmake



対策

  • 上記に記載しているコマンドを実行すること。


参考サイト

  1. Build FSBL
    https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841798/Build+FSBL

  2. AR# 68344:SDSoC - SDSoC で使用される Vivado HSI ユーティリティには gmake を提供するホスト OS が必要
    https://japan.xilinx.com/support/answers/68344.html

  3. ZYNQ に GPIO 回路を接続し Linux 上で割込みを受け付けてみる(後編)
    http://myokota.hatenablog.jp/entry/2015/08/12/233020

自作PC

はじめに

パソコンを新調した。
新しいパソコンは、PCパーツを自分で選んで組み立てる、いわゆる自作PCにした。

私が自作PCにしようと思った理由と、自作PCの構成について記載する。

自作PCの構成と金額

購入したPCパーツと金額を次に示す。思ったよりも高かった。自作PCで一番楽しかったのは、PCパーツの構成を考える時だったと思う。

No. 項目 型格 メーカ 備考 数量 単価 金額
1 CPU BX80684I79700K Intel Corei7-9700K 1 47,805 47,805
2 CPUクーラ SCCT-1000 サイズ トップフロータイプ 1 3,401 3,401
3 マザーボード Z390 PHANTOM GAMING 6 ASROCK ATX 1 24,738 24,738
4 グリス TG-K-001-RS 親和産業 1 762 762
5 SSD 860 EVO MZ-76E500B/IT Samsung 500 GB 2 7,880 15,760
6 HDD WD10EZEX WESTERNDIGITAL 1 TB 1 4,860 4,860
7 メモリ CMK32GX4M2A2666C16 CORSAIR DDR4-2666MHz、16GB×2枚 1 30,777 30,777
8 ビデオカード - - - 0
9 光学ドライブ - - - 0
10 電源 HCG750 GOLD Antec 750W 1 14,556 14,556
11 OS Microsoft Windows 10 Home Microsoft パッケージ版 1 15,200 15,200
12 PCケース CA-1J5-00M1WN-01 Thermaltake Technology Versa H26 Black /w casefan 1 3,983 3,983


合計:161,842円(税込み)



PCパーツはすべてAmazonで購入した。購入した時期はちょうどサイバーマンデーだったので、少し安く購入できたはず。

自作PCにしようと思った理由

自作PCにしようと思った理由は、次の3つがあるからだ。

  • 欲しいノートパソコンがなかった。
  • デスクトップパソコンに対する毛嫌いがなくなった。
  • 自作PCを作ってみたかった

欲しいノートパソコンがなかった。

Vertual BOX上でvivadoを使用していると、メモリ不足により画面がフリーズすることが多々あった。

Vertual BOX を快適に動かすには16 GB程度欲しいが、今使っているthinkpadはx240で最大 8GBしか増設できない。16GB の増設ができる(2スロットある)thinkpadが欲しくなったので、最新モデルのスペックを調べた。

thinkpadのX2xxシリーズが好きなので、最新モデルであるx280を購入しようと思っていた。x280は最大16 GBのメモリを乗せることができる。けれども、x280はLANポートがなくなったり、今まで使用していたドッキングステーションが使えなくなったりして、私の用途では使い勝手が悪い。どうやらx280で設計を一新したらしい。

x280の購入をやめて、x270を購入しようと思ったが、メーカーには在庫がなかった。楽天市場で探したが、相場よりも値段が高いし、低スペックなものが多い。ノートパソコンを使うならThinkpadにしたいので、今回は購入を見送ることにした。

デスクトップパソコンに対する毛嫌いがなくなった。

もともと、次の理由により、デスクトップパソコンを使いたくなかった。

  • キーボードやマウスなど周辺機器を色々と買うのでお金がかかる
  • 持ち運びできない。(作業場所が固定される)

でも、最近はラズパイ用にキーボードを購入したり、FPGAの学習用にVGA付きのディスプレイを購入したので、気づかないうちに、一通り周辺機器は揃っていた。

また、大阪に引っ越してからはノートPCを持ってマックやスタバで作業することも少なくなってきた。ほとんどは、家の机で作業している。


上記の理由があって、考え方が変わり、デスクトップパソコンでも良いなと思ってきた。

自作PCを作ってみたかった

デスクトップPCにするなら、既製品の購入よりも自作PCにしたいと思っていた。以前からYouTube自作PCの動画を見たりして、気になっていた。

自作PCを組み立ててみて

x240と比べると、やっぱりデスクトップパソコンは快適に作業できる。大きなトラブルもなく動いたので、時間はかからなかった。組み立てからWindows起動まで2時間程度だった。新しいThinkpadは来年以降に購入を考える。