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
参考サイト
- zyboでXilinxリポジトリのu-bootとLinuxを動かす
https://qiita.com/yoshiyasu1111/items/3cd78790c5e9df6beec1 - uenv.txt file for building Linux Kernel
https://forums.xilinx.com/t5/Embedded-Linux/uenv-txt-file-for-building-Linux-Kernel/td-p/727214 - 5.9.4.2. bootm - boot application image from memory
https://www.denx.de/wiki/view/DULG/UBootCmdGroupExec#Section_5.9.4.2. - 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のディレクトリに生成される。
参考サイト
zyboでXilinxリポジトリのu-bootとLinuxを動かす
https://qiita.com/yoshiyasu1111/items/3cd78790c5e9df6beec1ZYBO用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イメージの作成手順を次に示す。
- TopZybo.bitの作成
・vivadoにて作成する。ここでは割愛する。 - デバイスツリー.dtbの作成
- boot.binファイル、u-boot.imgファイルの生成
- uENv.txtファイルの生成
- zImageの生成
作成したzybo用Linuxイメージ
ここに今回作成したzybo用Linuxイメージをアップロードした。
ルートファイルシステム
ext4領域にはUbuntuのルートファイルシステムを格納する。Ubuntuを選択した理由は特にないので、そのうち変更するかも。
ルートファイルシステムの作成手順
参考サイト
- FPGA+SoC+Linuxのブートシーケンス(ZYNQ+Vivado編):図2 ZYNQでLinuxを動作させるためのデザインフロー
https://qiita.com/ikwzm/items/1614c35233e1836c7a26 FPGA+SoC+Linuxのブートシーケンス(ZYNQ+U-Boot-SPL編):図2 ZYNQでLinuxを動作させるためのデザインフロー
https://qiita.com/ikwzm/items/efacec8d8e0744e17d45ファイルシステムの話
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 ;
生成したドキュメントでは、これが次のように表示される。
記載例 その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 );
生成したドキュメントでは、これが次のように表示される。
注意点
コメントを書く時の注意点がある。これらをまとめた。
キーワードと:
の間には、スペースを挿入しないこと。
キーワードと:
の間にスペースを挿入してしまうと、そのキーワードの部分のドキュメントが生成されない。
コメント対象となるものと:
の間にはスペースを挿入すること。
コメント対象となるものと:
の間にスペースを挿入してしまうと、そのキーワードの部分のドキュメントが生成されない。
書式は必ず守らなければならない。
'
があるコードは、正しく表示されない。
'
の文字が存在するソースコードでドキュメントを生成すると、ドキュメント上でソースコードが表示されない。
// InternalSignal: cnt00_reg // データ送受信用カウンタ reg [7:0] cnt00_reg=8'b0;
色々と調べた結果、コメントの書き方ではなく、'
があるコードが原因であることが分かった。
どうやら、'
があると、下図のようにソースコードが表示されないようである。NaturalDocsのバグか設定の不備かわからないが、ドキュメントを作成するときには気を付けた方が良い。
ドキュメントの生成
コメントを記載した次のverilogファイルを用いて、ドキュメントを生成する。
ソース
前回作成した、アイコンをダブルクリックする。
次の画面が表示される。
Building documentation... Done.
と表示されたら、ドキュメントが生成されている。
※これ以外の表記が出たら、ドキュメントが生成されていないので、ディレクトリや設定を見直すこと。
指定したドキュメント出力先のディレクトリには、次のファイルが生成されている。
ドキュメントであるindex.html
を開く。
表紙には、Project.txtで設定したタイトルなどが表示される。
左側には、verilogファイルが表示されているので、それをクリックする。
ソースコードで記載したコメントが表示されている。
使ってみた感想
簡単な設定とコメントでドキュメントができるので、便利であった。特に、自分でキーワードが定義できるので、verilogに適した表記のドキュメントが生成できるのが、魅力的だと感じた。
ただ、表や図を張り付けることができないので、そこが少し残念であった。
ドキュメントとは関係ないが、コメントのよい書き方についてもっと学ぼうと感じた。。
最後に今回作成したドキュメントは以下に保存しておく。
サンプルドキュメント
参考サイト
- 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
- 生成されてファイルのうち、使用するのは次である。その他は使用しない。
デバイスツリー(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 = <ðernet_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
参考サイト
Build Device Tree Blob
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842279/Build+Device+Tree+BlobPetalinux 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[Linux][kernel] Device Tree についてのまとめ
https://qiita.com/koara-local/items/ed99a7b96a0ca252fc4e組み込みLinuxデバイスドライバの作り方 (11)
https://qiita.com/take-iwiw/items/0d13142863d9ed064e41Digilent/Petalinux-Zybo:system-user.dtsi
https://github.com/Digilent/Petalinux-Zybo/tree/master/Zybo/project-spec/meta-user/recipes-bsp/device-tree/fileszynq / 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のシンボリックリンク作成
- ビルドは、
gmakeコマンド
を必要とする。
そのため、シンボリックリンクを作成する。 参考サイト:No.2-3
sudo ln -s /usr/bin/make/usr/bin/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フォルダに格納されている。
エラー
- ビルド中に起こったエラーについて記載する。
エラー内容
- シンボリックリンクを作成しないで、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
対策
- 上記に記載しているコマンドを実行すること。
参考サイト
Build FSBL
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841798/Build+FSBLAR# 68344:SDSoC - SDSoC で使用される Vivado HSI ユーティリティには gmake を提供するホスト OS が必要
https://japan.xilinx.com/support/answers/68344.htmlZYNQ に 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は来年以降に購入を考える。