Petalinux2018.3によるzynq-7000ブート用SDカード作成 のバックアップソース(No.19)

更新

[[電気回路/zynq]]

* Petalinux 2018.3 を使って zynq-7000 用のブートSDカードを作る [#xf4d6dda]

[[電気回路/zynq/Petalinux2018.3環境を整える]] の続き。

以前、Petalinux 2016.4 でやった [[電気回路/zynq/Petalinux のビルド#aabc4100]] および [[電気回路/zynq/Petalinux のカスタマイズ#p4f8f224]] を新しいバージョンでやり直すことになる。

ターゲットは z-turn board で、これまで 2016.4 を使った記事をいくつか書いていた。

#ls2(電気回路/z-turn,compact)

z-turn ボードは Petalinux により標準でサポートされている環境ではない(BSP が提供されていない)ので、
いろいろ調べながらやることになる。

** 目次 [#q093e469]

#contents

* petalinux プロジェクトの作成 [#o40aac7b]

z-turn ボードに対応する BSP は配布されていないので、
zynq の汎用テンプレートを使ってプロジェクトを作る。
(BSP が配布されているシステムであればプロジェクト作成時に BSP を指定する)

プロジェクトルートに .gitignore が作られるので、
それをそのまま使うことで git による管理が形式的には可能となる。

ただし、現時点で petalinux の git 対応は完全ではないため、
プロジェクトを共有するには BSP を使った方が良い、との注意もあった。
実際、git で管理するファイルのみから全体をビルドする方法ってあるんだろうか???

多分、作業履歴を取っておく程度の意味しかない気がする。

 LANG:console
 $ cd
 $ mkdir petalinux
 $ cd petalinux
 $ petalinux-create -t project --template zynq -n zturn_v2018.3
  INFO: Create project: zturn_v2018.3
  INFO: New project successfully created in /home/takeuchi/petalinux/zturn_v2018.3
 $ cd zturn_v2018.3
 $ ls -a
  ./  ../  .gitignore  .petalinux/  config.project  project-spec/
 $ cat .gitignore
  */*/config.old
  */*/rootfs_config.old
  build/
  images/linux/
  pre-built/linux/
  .petalinux/*
  !.petalinux/metadata
  *.o
  *.jou
  *.log
  project-spec/meta-plnx-generated/
  /components/plnx_workspace
 $ git init
  Initialized empty Git repository in /home/takeuchi/petalinux/zturn_v2018.3/.git/
 $ git add .
 $ git config --global user.email "osamu@big.jp"
 $ git config --global user.name "Osamu Takeuchi"
 $ git commit -m "newly created"
  [master (root-commit) 1f2a538] newly created
   22 files changed, 997 insertions(+)

config.project と project-spec/ とがプロジェクトの本体になる。

* vivado のハードウェア設定を取り込みつつ基本の設定 [#o3495afb]

[[vivado のハードウェア設定を出力する>電気回路/zynq/Petalinux のビルド#a82e50cc]] の手順で 
vivado 2018.3 を使って design_1_wrapper.hdf  を作成して、zturn_v2018.3/hw_platform/design_1_wrapper.hdf  に置いた。
(.hdf ファイルの実体は主要ファイルを .zip 形式でまとめたもの。拡張子を .zip に変えると中味を見られる)

実は hdf ファイルを出力する前に vivado 上で [[ZYNQ7 Processor System の SDIO Clock を 50MHz にしておかなければダメだった>#i8da51ff]]。

 LANG:console
 $ ls hw_platform/
  design_1_wrapper.hdf 
 $ petalinux-config --get-hw-description=hw_platform
  INFO: Getting hardware description...
  [INFO] generating Kconfig for project
  [INFO] menuconfig project
  (設定画面が現れる → とりあえず何も変更せずに Exit して設定を保存する)
  configuration written to /home/takeuchi/petalinux/zturn_v2018.3/project-spec/configs/config
  
  *** End of the configuration.
  *** Execute 'make' to start the build or try 'make help'.
  
  [INFO] sourcing bitbake
  [INFO] generating plnxtool conf
  [INFO] generating meta-plnx-generated layer
  [INFO] generating machine configuration
  [INFO] generating bbappends for project . This may take time !
  [INFO] generating u-boot configuration files
  [INFO] generating kernel configuration files
  [INFO] generating kconfig for Rootfs
  [INFO] oldconfig rootfs
  [INFO] generating petalinux-user-image.bb
 $ ls
  build/  components/  config.project  hw_platform/  project-spec/
 $ ls build/
  bitbake-cookerdaemon.log  cache/  conf/  config.log  misc/  sstate-cache/  tmp/
 $ git add .
 $ git commit -m "configured as default"
  [master 3c376ac] configured as default
   12 files changed, 173923 insertions(+), 25 deletions(-)
   create mode 100644 .petalinux/metadata
   create mode 100644 hw_platform/design_1_wrapper.hdf
   create mode 100644 project-spec/hw-description/design_1_wrapper.bit
   create mode 100644 project-spec/hw-description/ps7_init.c
   create mode 100644 project-spec/hw-description/ps7_init.h
   create mode 100644 project-spec/hw-description/ps7_init.html
   create mode 100644 project-spec/hw-description/ps7_init.tcl
   create mode 100644 project-spec/hw-description/ps7_init_gpl.c
   create mode 100644 project-spec/hw-description/ps7_init_gpl.h
   create mode 100644 project-spec/hw-description/system.hdf

とりあえず何も変更せずに Exit し、git へ登録した。

** 罫線の表示がおかしい [#t90ff50a]

設定画面が現れたのだけれど・・・そのままだと罫線部分が文字化けする。

&ref(petalinux-config1.png,,50%);

https://islandcnt.exblog.jp/16849117/ の "-YaSTのライン化け-" にあるように、
PuTTY の設定で Charactor set を use font encording にすればいいらしい。

&ref(petalinux-config2.png,,50%);

ただこれだと LANG=ja_JP.UTF-8 での日本語表示がおかしくなる。

http://totech.hateblo.jp/entry/2014/09/22/071012 にあるように 
ja_JP.sjis ロケールを追加して、

 LANG:console
 $ sudo localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
  character map `SHIFT_JIS' is not ASCII compatible, locale not ISO C compliant
 $ export LANG=ja_JP.sjis
  takeuchi@petalinux2019-3:~/petalinux/zturn_v2018.3$ ls -l
  合計 28
  drwxrwxr-x 7 takeuchi takeuchi 4096  3月 15 20:38 build
  drwxrwxr-x 3 takeuchi takeuchi 4096  3月 15 20:31 components
  -rw-r--r-- 1 takeuchi takeuchi  248  3月 15 20:14 config.project
  drwxrwxr-x 2 takeuchi takeuchi 4096  3月 15 20:30 hw_platform
  drwxr-xr-x 6 takeuchi takeuchi 4096  3月 15 20:36 project-spec

のようにすれば文字化けはなくなるのだけれど・・・今時 Linux ターミナルで
SJIS 使うのはどうなのかと。

LANG=C で進めるか、その都度 PuTTY の設定を変える方がよいのかもしれない。

** ロケール問題再び? [#rfb10738]

ああそういえば、以前試したときは [[電気回路/zynq/Petalinux のビルド#y0c5addb]] 
で痛い目に遭ったように、Petalinux 自体が LANG=C 以外だとおかしな事になるという
問題があったんだった。

今はどうかというと、、、

 LANG:console
 $ export LANG=ja_JP.sjis
 $ petalinux-build -c kernel
  [INFO] building kernel
  [INFO] sourcing bitbake
  INFO: bitbake virtual/kernel
  Please use a locale setting which supports UTF-8 (such as LANG=en_US.UTF-8).
  Python can't change the filesystem locale after loading so we need a UTF-8 when Python starts or things won't work.
  ERROR: Failed to build kernel

のように、自ら検出してエラーを出してくれるようになっていた。

あれ?エラーメッセージを読むと UTF-8 なら問題ないと書いてある???

というかむしろ、

 LANG:console
 $ export LANG=C
 $ petalinux-build -c kernel
  [INFO] building kernel
  [INFO] sourcing bitbake
  INFO: bitbake virtual/kernel
  Please use a locale setting which supports UTF-8 (such as LANG=en_US.UTF-8).
  Python can't change the filesystem locale after loading so we need a UTF-8 when Python starts or things won't work.
  ERROR: Failed to build kernel

LANG=C だと UTF-8 が処理できないのでダメらしい。

** 暗号化ファイルシステムの問題 [#haea0979]

ということは、LANG=ja_JP.UTF-8 なら問題ない?

 LANG:console
 $ export LANG=ja_JP.UTF-8
 $ petalinux-build -c kernel
  [INFO] building kernel
  [INFO] sourcing bitbake
  INFO: bitbake virtual/kernel
  ERROR:  OE-core's config sanity checker detected a potential misconfiguration.
      Either fix the cause of this error or at your own risk disable the checker (see sanity.conf).
      Following is the list of potential problems / advisories:
  
      Failed to create a file with a long name in TMPDIR. Please use a filesystem that does not unreasonably limit filename length.
  Failed to create a file with a long name in SSTATE_DIR. Please use a filesystem that does not unreasonably limit filename length.
 
  Summary: There was 1 ERROR message shown, returning a non-zero exit code.
 ERROR: Failed to build kernel

今度は長いファイル名を使えないのがダメと言われた。

うわーこれきついや。

仕方がないので [[ホームディレクトリ暗号化の解除>電気回路/zynq/Petalinux2018.3環境を整える#e1dacfc9]]
の手順で暗号化を解除した。

すると、

 LANG:console
 $ source /opt/petalinux_2018.3/settings.sh
 $ petalinux-build -c kernel
  [INFO] building kernel
  [INFO] sourcing bitbake
  INFO: bitbake virtual/kernel
  Parsing recipes:   5%

のようにビルドが進むようになった。

LANG=ja_JP.UTF-8 のままで大丈夫みたいだ。
* WARNING は出たけど build できた [#a30662f2]

 LANG:console
 $ petalinux-build -c kernel
  ...
   WARNING: petalinux-user-image-1.0-r0 do_rootfs: [log_check] petalinux-user-image: found 1 warning message in the logfile:
  [log_check] warning: %post(sysvinit-inittab-2.88dsf-r10.plnx_zynq7) scriptlet failed, exit status 1
  
  NOTE: Tasks Summary: Attempted 2350 tasks of which 2122 didn't need to be rerun and all succeeded.
  
  Summary: There was 1 WARNING message shown.
  INFO: Copying Images from deploy to images
  INFO: Creating images/linux directory
  NOTE: Failed to copy built images to tftp dir:  /tftpboot
  [INFO] successfully built kernel
 $ grep sysvinit-inittab build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/petalinux-user-image/1.0-r0/temp/log.do_rootfs
  sysvinit-inittab                plnx_zynq7      2.88dsf-r10      oe-repo 7.5 k
  sysvinit-inittab-lic            plnx_zynq7      2.88dsf-r10      oe-repo  12 k
   Installing       : sysvinit-inittab-2.88dsf-r10.plnx_zynq7             69/122
   Running scriptlet: sysvinit-inittab-2.88dsf-r10.plnx_zynq7             69/122
 warning: %post(sysvinit-inittab-2.88dsf-r10.plnx_zynq7) scriptlet failed, exit status 1
   Installing       : sysvinit-inittab-lic-2.88dsf-r10.plnx_zynq7        117/122
   Verifying        : sysvinit-inittab-2.88dsf-r10.plnx_zynq7             79/122
   Verifying        : sysvinit-inittab-lic-2.88dsf-r10.plnx_zynq7         94/122
   sysvinit-inittab-lic.plnx_zynq7 2.88dsf-r10
   sysvinit-inittab.plnx_zynq7 2.88dsf-r10
 Non-fatal POSTIN scriptlet failure in rpm package sysvinit-inittab
 Non-fatal POSTIN scriptlet failure in rpm package sysvinit-inittab
 NOTE: Saving postinstall script of sysvinit-inittab
 NOTE: Delayed package scriptlet: 100-sysvinit-inittab
 [log_check] warning: %post(sysvinit-inittab-2.88dsf-r10.plnx_zynq7) scriptlet failed, exit status 1

Non-fatal となっているので、無視しても良いってことかしら???

以下のように、全体のビルドも問題なかった。

 LANG:console
 $ petalinux-build
  ...
 
  NOTE: Tasks Summary: Attempted 3065 tasks of which 2474 didn't need to be rerun and all succeeded.
  INFO: Copying Images from deploy to images
  NOTE: Failed to copy built images to tftp dir:  /tftpboot
  [INFO] successfully built project
 $ ls images/linux/
  image.ub         rootfs.cpio.gz         rootfs.ext4     rootfs.manifest       system.bit        u-boot.elf
  rootfs.bin       rootfs.cpio.gz.u-boot  rootfs.ext4.gz  rootfs.tar.bz2        system.dtb        vmlinux
  rootfs.cpio      rootfs.ext3            rootfs.its      rootfs.tar.gz         System.map.linux  zImage
  rootfs.cpio.bz2  rootfs.ext3.bz2        rootfs.jffs2    rootfs.testdata.json  u-boot.bin        zynq_fsbl.elf

いろいろとできていることを確認できる。

** 古い .hdf だとエラーが出た [#x53811ae]

同じソースから vivado 2016.4 で作成した hdf を与えた場合には
"Unable to find ps7 init files" というエラーが出た。

新しいバージョンで作り直さないとダメみたい。

 LANG:console
 $ petalinux-build -c kernel
  [INFO] building kernel
  [INFO] sourcing bitbake
  INFO: bitbake virtual/kernel
  Loading cache: 100% |############################################| Time: 0:00:03
  Loaded 3444 entries from dependency cache.
  Parsing recipes: 100% |##########################################| Time: 0:00:31
  Parsing of 2569 .bb files complete (2532 cached, 37 parsed). 3445 targets, 149 skipped, 0 masked, 0 errors.
  NOTE: Resolving any missing task queue dependencies
  Initialising tasks: 100% |#######################################| Time: 0:00:21
  Checking sstate mirror object availability: 100% |###############| Time: 0:00:46
  NOTE: Executing SetScene Tasks
  NOTE: Executing RunQueue Tasks
  WARNING: petalinux-user-image-1.0-r0 do_rootfs: [log_check] petalinux-user-image: found 1 warning message in the logfile:
  [log_check] warning: %post(sysvinit-inittab-2.88dsf-r10.plnx_zynq7) scriptlet failed, exit status 1
  
  ERROR: fsbl-2018.3+gitAUTOINC+56f3da2afb-r0 do_configure: Function failed: do_configure (log file is located at /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/temp/log.do_configure.5645)
  ERROR: Logfile of failure stored in: /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/temp/log.do_configure.5645
  Log data follows:
  | DEBUG: Executing shell function do_configure
  | MISC_ARG is  -yamlconf /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/fsbl.yaml
  | APP_ARG is  -app "Zynq FSBL"
  | Using xsct from: /opt/petalinux_2018.3/tools/xsct/SDK/2018.3/bin/xsct
  | cmd is: xsct -sdx -nodisp /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/app.tcl -ws /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/build -pname fsbl -rp /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/git -processor ps7_cortexa9_0 -hdf /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/deploy/images/plnx-zynq7/Xilinx-plnx-zynq7.hdf -arch 32  -app "Zynq FSBL"  -yamlconf /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/fsbl.yaml
  | INFO: [Hsi 55-1698] elapsed time for repository loading 0 seconds
  | Opening the hardware design, this may take few seconds.
  | ERROR: [Hsi 55-1606] Unable to find ps7 init files in the directory /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/build/fsbl_plat/_platform/dsa.
  | INFO: create bsp using fsbl_domain
  | Creating app at: /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/build
  | ERROR: [Hsi 55-1606] Unable to find ps7 init files in the directory /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/build/fsbl_plat/_platform/dsa.
  | ERROR: [Hsi 55-1438] Error running generate_app.
  | ERROR: [Common 17-39] 'hsi::generate_app' failed due to earlier errors.
  |
  |     while executing
  | "::hsi::generate_app -app $hsitemplate"
  |     (procedure "app" line 323)
  |     invoked from within
  | "app create -name $params(pname) -lang c -template $params(app) -plnx"
  |     invoked from within
  | "if { $params(ws) ne "" } {
  |       #Local Work Space available
  |       if { $params(pname) ne "" } {
  |               # hwpname/bspname is empty then default it to pname+_hwproj/b..."
  |     (file "/home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/app.tcl" line 139)
  | WARNING: exit code 1 from a shell command.
  | ERROR: Function failed: do_configure (log file is located at /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/temp/log.do_configure.5645)
  ERROR: Task (/opt/petalinux_2018.3/components/yocto/source/arm/layers/meta-xilinx-tools/recipes-bsp/fsbl/fsbl_git.bb:do_configure) failed with exit code '1'
  NOTE: Tasks Summary: Attempted 2330 tasks of which 2115 didn't need to be rerun and 1 failed.
  
  Summary: 1 task failed:
    /opt/petalinux_2018.3/components/yocto/source/arm/layers/meta-xilinx-tools/recipes-bsp/fsbl/fsbl_git.bb:do_configure
  Summary: There was 1 WARNING message shown.
  Summary: There was 1 ERROR message shown, returning a non-zero exit code.
  ERROR: Failed to build kernel
 $ ls /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/temp/run.do_configure
  /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/temp/run.do_configure
 $ ls /home/takeuchi/petalinux/zturn_v2018.3/build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/fsbl/2018.3+gitAUTOINC+56f3da2afb-r0/build/fsbl_plat/_platform/dsa
  Xilinx-plnx-zynq7.dsa  Xilinx-plnx-zynq7.hdf

* BOOT.BIN の作成 [#x067d23c]

 LANG:console
 $ petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf --fpga  images/linux/system.bit --u-boot --force
  INFO: File in BOOT BIN: "/home/takeuchi/petalinux/zturn_v2018.3/images/linux/zynq_fsbl.elf"
  INFO: File in BOOT BIN: "/home/takeuchi/petalinux/zturn_v2018.3/images/linux/system.bit"
  INFO: File in BOOT BIN: "/home/takeuchi/petalinux/zturn_v2018.3/images/linux/u-boot.elf"
  INFO: Generating Zynq binary package BOOT.BIN...
  
  
  ****** Xilinx Bootgen v2018.3
    **** Build date : Nov 15 2018-19:22:29
      ** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved.
  
  INFO: Binary is ready.
  WARNING: Unable to access the TFTPBOOT folder /tftpboot!!!
  WARNING: Skip file copy to TFTPBOOT folder!!!
 $ ls
  build  components  config.project  hw_platform  hw_platform_old  images  project-spec
 $ ls images/linux/
  BOOT.BIN     rootfs.cpio.bz2        rootfs.ext3.bz2  rootfs.jffs2     rootfs.testdata.json  u-boot.bin  zynq_fsbl.elf
  image.ub     rootfs.cpio.gz         rootfs.ext4      rootfs.manifest  system.bit            u-boot.elf
  rootfs.bin   rootfs.cpio.gz.u-boot  rootfs.ext4.gz   rootfs.tar.bz2   system.dtb            vmlinux
  rootfs.cpio  rootfs.ext3            rootfs.its       rootfs.tar.gz    System.map.linux      zImage

昔と違って [[カレントフォルダに BOOT.BIN が生成されてしまうこと>電気回路/zynq/Petalinux のビルド#w888792f]] はなくなったみたい。

* SD カードに書き込んで試す [#e5d26699]

[[電気回路/z-turn/VirtualBox に Debia8 を入れる#g8dc93aa]] の手順
(USB3.0 に繋いだカードリーダーでは一手間必要なのだった)で 
VirtualBox から SD カードへアクセスできるようにして、

 LANG:console
 $ lsblk
  NAME                            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
  sda                               8:0    0   100G  0 disk
  ├─sda1                            8:1    0   731M  0 part  /boot
  ├─sda2                            8:2    0     1K  0 part
  └─sda5                            8:5    0  99.3G  0 part
    ├─petalinux2019--3--vg-root   252:0    0  98.3G  0 lvm   /
    └─petalinux2019--3--vg-swap_1 252:1    0   976M  0 lvm
      └─cryptswap1                252:2    0 975.5M  0 crypt [SWAP]
  sdf                               8:80   1   3.7G  0 disk
  ├─sdf1                            8:81   1 196.1M  0 part
  └─sdf2                            8:82   1   3.5G  0 part
  sr0                              11:0    1  1024M  0 rom
 $ ls /mnt
 $ sudo mkdir /mnt/sdcard1 /mnt/sdcard2
 $ sudo mount /dev/sdf1 /mnt/sdcard1
 $ ls 
  ... (消していい内容であることを確認)
 
 $ sudo mount /dev/sdf2 /mnt/sdcard2
 $ ls 
  ... (消していい内容であることを確認)
 
 $ sudo umount /mnt/sdcard?

まっさらな FAT パーティションおよび ext4 パーティションを作成

 LANG:console
 $ sudo fdisk /dev/sdf
    p (print)
    d (delete) 1  # 必要に応じて
    d (delete) 2  # 必要に応じて
    n (new) p (primary) 1 ret (start=default) +64M (size)
    n (new) p (primary) 2 retrn (start=default) return (size=default)
    t (type) 1 b (W95 FAT32)
    a (bootable) 1
    p (print)
 
  デバイス   起動  Start 最後から セクタ  Size Id タイプ
  /dev/sdf1  *      2048   264191  262144  128M  b W95 FAT32
  /dev/sdf2       264192  7744511 7480320  3.6G 83 Linux
 
    w (write & exit)
 $ lsblk
  NAME                            MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
  ...
  sdf                               8:80   1   3.7G  0 disk
  ├─sdf1                            8:81   1   128M  0 part
  └─sdf2                            8:82   1   3.6G  0 part
  ...
 $ sudo mkfs.msdos -n BOOT /dev/sdf1
 $ sudo mkfs.ext4  -L ROOT /dev/sdf2

http://engineernote.hatenablog.com/entry/2016/01/31/012227

によると、

> BOOT.binはbitstreamとFSBL、u-bootをひとつのバイナリに結合したもので、image.ubはkernelとrootfs、デバイスツリーのようです。

とのことなので、まっさらな FAT フォーマットの SD カードに BOOT.bin と image.ub だけ入れればいい。

 LANG:console
 $ sudo mount /dev/sdf1 /mnt/sdcard1
 $ sudo cp images/linux/BOOT.BIN images/linux/image.ub /mnt/sdcard1
 $ sudo umount /dev/sdf1

これでいいはず。

** SDIO Clock = 50MHz にしないとだめだった [#i8da51ff]

上でもちょっと書いたけれど
「[[電気回路/zynq/最新の fsbl で Linux が起動しない理由を調べる]]」 で判明したのと同じ原因で、
.hdf を作る際に ZYNQ7 Processor System の設定で SDIO Clock を 50MHz 
にしないとまったくうんともすんとも言わなかった。

&ref(sdio-clock-50MHz.png,,50%);

** 起動した [#c542cf35]

以下は、USB_UART に USB ケーブルを繋ぎ、Tera Term で COM6 を見ながら
z-turn board をリセットした際に表示された起動メッセージ。

 LANG:console
 U-Boot 2018.01 (Mar 19 2019 - 03:03:19 +0000) Xilinx Zynq ZC702
 
 Board: Xilinx Zynq
 Silicon: v3.1
 I2C:   ready
 DRAM:  ECC disabled 1 GiB
 MMC:   mmc@e0100000: 0 (SD)
 SF: Detected w25q128bv with page size 256 Bytes, erase size 4 KiB, total 16 MiB
 *** Warning - bad CRC, using default environment
 
 ## Error: flags type check failure for "serverip" <= "AUTO" (type: i)
 himport_r: can't insert "serverip=AUTO" into hash table
 In:    serial@e0001000
 Out:   serial@e0001000
 Err:   serial@e0001000
 Board: Xilinx Zynq
 Silicon: v3.1
 Net:   ZYNQ GEM: e000b000, phyaddr ffffffff, interface rgmii-id
 eth0: ethernet@e000b000
 U-BOOT for zturn_v2018.3
 
 ethernet@e000b000 Waiting for PHY auto negotiation to complete......... TIMEOUT !
 Hit any key to stop autoboot:  0
 Device: mmc@e0100000
 Manufacturer ID: 3
 OEM: 5344
 Name: SU04G
 Tran Speed: 50000000
 Rd Block Len: 512
 SD version 3.0
 High Capacity: Yes
 Capacity: 3.7 GiB
 Bus Width: 4-bit
 Erase Group Size: 512 Bytes
 reading image.ub
 10000404 bytes read in 559 ms (17.1 MiB/s)
 ## Loading kernel from FIT Image at 10000000 ...
    Using 'conf@system-top.dtb' configuration
    Verifying Hash Integrity ... OK
    Trying 'kernel@1' kernel subimage
      Description:  Linux kernel
      Type:         Kernel Image
      Compression:  gzip compressed
      Data Start:   0x10000104
      Data Size:    3941035 Bytes = 3.8 MiB
      Architecture: ARM
      OS:           Linux
      Load Address: 0x00008000
      Entry Point:  0x00008000
      Hash algo:    sha1
      Hash value:   70dd39c3d4c46f9073ba1a881abb498a1bfd9191
    Verifying Hash Integrity ... sha1+ OK
 ## Loading ramdisk from FIT Image at 10000000 ...
    Using 'conf@system-top.dtb' configuration
    Trying 'ramdisk@1' ramdisk subimage
      Description:  petalinux-user-image
      Type:         RAMDisk Image
      Compression:  gzip compressed
      Data Start:   0x103c5ca4
      Data Size:    6043105 Bytes = 5.8 MiB
      Architecture: ARM
      OS:           Linux
      Load Address: unavailable
      Entry Point:  unavailable
      Hash algo:    sha1
      Hash value:   a9a00f2e7dda4f17404055e7afa2b3244ca7afd9
    Verifying Hash Integrity ... sha1+ OK
 ## Loading fdt from FIT Image at 10000000 ...
    Using 'conf@system-top.dtb' configuration
    Trying 'fdt@system-top.dtb' fdt subimage
      Description:  Flattened Device Tree blob
      Type:         Flat Device Tree
      Compression:  uncompressed
      Data Start:   0x103c24b0
      Data Size:    14132 Bytes = 13.8 KiB
      Architecture: ARM
      Hash algo:    sha1
      Hash value:   d1094e4d7bd40491e9cae7952924c378a7d2d1b0
    Verifying Hash Integrity ... sha1+ OK
    Booting using the fdt blob at 0x103c24b0
    Uncompressing Kernel Image ... OK
    Loading Ramdisk to 07a3c000, end 07fff5e1 ... OK
    Loading Device Tree to 07a35000, end 07a3b733 ... OK
 
 Starting kernel ...
 
 Booting Linux on physical CPU 0x0
 Linux version 4.14.0-xilinx-v2018.3 (oe-user@oe-host) (gcc version 7.3.0 (GCC)) #1 SMP PREEMPT Mon Mar 18 15:35:06 UTC 2019
 CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d
 CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
 OF: fdt: Machine model: xlnx,zynq-7000
 bootconsole [earlycon0] enabled
 Memory policy: Data cache writealloc
 cma: Reserved 16 MiB at 0x3f000000
 percpu: Embedded 16 pages/cpu @ef7ce000 s34764 r8192 d22580 u65536
 Built 1 zonelists, mobility grouping on.  Total pages: 260608
 Kernel command line: console=ttyPS0,115200 earlyprintk
 PID hash table entries: 4096 (order: 2, 16384 bytes)
 Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
 Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
 Memory: 1006984K/1048576K available (6144K kernel code, 238K rwdata, 1564K rodata, 1024K init, 152K bss, 25208K reserved, 16384K cma-reserved, 245760K highmem)
 Virtual kernel memory layout:
     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
     fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
     vmalloc : 0xf0800000 - 0xff800000   ( 240 MB)
     lowmem  : 0xc0000000 - 0xf0000000   ( 768 MB)
     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
     modules : 0xbf000000 - 0xbfe00000   (  14 MB)
       .text : 0xc0008000 - 0xc0700000   (7136 kB)
       .init : 0xc0900000 - 0xc0a00000   (1024 kB)
       .data : 0xc0a00000 - 0xc0a3b880   ( 239 kB)
        .bss : 0xc0a3b880 - 0xc0a61bc4   ( 153 kB)
 Preemptible hierarchical RCU implementation.
         RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.
         Tasks RCU enabled.
 RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=2
 NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
 efuse mapped to f0802000
 slcr mapped to f0804000
 L2C: platform modifies aux control register: 0x72360000 -> 0x72760000
 L2C: DT/platform modifies aux control register: 0x72360000 -> 0x72760000
 L2C-310 erratum 769419 enabled
 L2C-310 enabling early BRESP for Cortex-A9
 L2C-310 full line of zeros enabled for Cortex-A9
 L2C-310 ID prefetch enabled, offset 1 lines
 L2C-310 dynamic clock gating enabled, standby mode enabled
 L2C-310 cache controller enabled, 8 ways, 512 kB
 L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x76760001
 zynq_clock_init: clkc starts at f0804100
 Zynq clock init
 sched_clock: 64 bits at 333MHz, resolution 3ns, wraps every 4398046511103ns
 clocksource: arm_global_timer: mask: 0xffffffffffffffff max_cycles: 0x4ce07af025, max_idle_ns: 440795209040 ns
 Switching to timer-based delay loop, resolution 3ns
 clocksource: ttc_clocksource: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 537538477 ns
 timer #0 at f080c000, irq=17
 Console: colour dummy device 80x30
 Calibrating delay loop (skipped), value calculated using timer frequency.. 666.66 BogoMIPS (lpj=3333333)
 pid_max: default: 32768 minimum: 301
 Mount-cache hash table entries: 2048 (order: 1, 8192 bytes)
 Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes)
 CPU: Testing write buffer coherency: ok
 CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
 Setting up static identity map for 0x100000 - 0x100060
 Hierarchical SRCU implementation.
 smp: Bringing up secondary CPUs ...
 CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
 smp: Brought up 1 node, 2 CPUs
 SMP: Total of 2 processors activated (1333.33 BogoMIPS).
 CPU: All CPU(s) started in SVC mode.
 devtmpfs: initialized
 random: get_random_u32 called from bucket_table_alloc+0x1c4/0x204 with crng_init=0
 VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4
 clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
 futex hash table entries: 512 (order: 3, 32768 bytes)
 pinctrl core: initialized pinctrl subsystem
 random: fast init done
 NET: Registered protocol family 16
 DMA: preallocated 256 KiB pool for atomic coherent allocations
 cpuidle: using governor menu
 hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.
 hw-breakpoint: maximum watchpoint size is 4 bytes.
 zynq-ocm f800c000.ocmc: ZYNQ OCM pool: 256 KiB @ 0xf0880000
 zynq-pinctrl 700.pinctrl: zynq pinctrl initialized
 e0000000.serial: ttyPS1 at MMIO 0xe0000000 (irq = 28, base_baud = 6249999) is a xuartps
 e0001000.serial: ttyPS0 at MMIO 0xe0001000 (irq = 29, base_baud = 6249999) is a xuartps
 ・onsole [ttyPS0] enabled
 console [ttyPS0] enabled
 bootconsole [earlycon0] disabled
 bootconsole [earlycon0] disabled
 vgaarb: loaded
 SCSI subsystem initialized
 usbcore: registered new interface driver usbfs
 usbcore: registered new interface driver hub
 usbcore: registered new device driver usb
 media: Linux media interface: v0.10
 Linux video capture interface: v2.00
 pps_core: LinuxPPS API ver. 1 registered
 pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
 PTP clock support registered
 EDAC MC: Ver: 3.0.0
 FPGA manager framework
 fpga-region fpga-full: FPGA Region probed
 Advanced Linux Sound Architecture Driver Initialized.
 clocksource: Switched to clocksource arm_global_timer
 NET: Registered protocol family 2
 TCP established hash table entries: 8192 (order: 3, 32768 bytes)
 TCP bind hash table entries: 8192 (order: 4, 65536 bytes)
 TCP: Hash tables configured (established 8192 bind 8192)
 UDP hash table entries: 512 (order: 2, 16384 bytes)
 UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
 NET: Registered protocol family 1
 RPC: Registered named UNIX socket transport module.
 RPC: Registered udp transport module.
 RPC: Registered tcp transport module.
 RPC: Registered tcp NFSv4.1 backchannel transport module.
 Trying to unpack rootfs image as initramfs...
 Freeing initrd memory: 5904K
 hw perfevents: no interrupt-affinity property for /pmu@f8891000, guessing.
 hw perfevents: enabled with armv7_cortex_a9 PMU driver, 7 counters available
 workingset: timestamp_bits=30 max_order=18 bucket_order=0
 jffs2: version 2.2. (NAND) (SUMMARY)  c 2001-2006 Red Hat, Inc.
 bounce: pool size: 64 pages
 io scheduler noop registered
 io scheduler deadline registered
 io scheduler cfq registered (default)
 io scheduler mq-deadline registered
 io scheduler kyber registered
 dma-pl330 f8003000.dmac: Loaded driver for PL330 DMAC-241330
 dma-pl330 f8003000.dmac:        DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16
 brd: module loaded
 loop: module loaded
 m25p80 spi0.0: found w25q128, expected n25q512a
 m25p80 spi0.0: w25q128 (16384 Kbytes)
 4 ofpart partitions found on MTD device spi0.0
 Creating 4 MTD partitions on "spi0.0":
 0x000000000000-0x000000500000 : "boot"
 0x000000500000-0x000000520000 : "bootenv"
 0x000000520000-0x000000fa0000 : "kernel"
 0x000000fa0000-0x000001000000 : "spare"
 libphy: Fixed MDIO Bus: probed
 CAN device driver interface
 libphy: MACB_mii_bus: probed
 macb e000b000.ethernet eth0: Cadence GEM rev 0x00020118 at 0xe000b000 irq 31 (00:0a:35:00:1e:53)
 Generic PHY e000b000.ethernet-ffffffff:00: attached PHY driver [Generic PHY] (mii_bus:phy_addr=e000b000.ethernet-ffffffff:00, irq=POLL)
 e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
 e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
 ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
 ehci-pci: EHCI PCI platform driver
 usbcore: registered new interface driver usb-storage
 i2c /dev entries driver
 cdns-i2c e0004000.i2c: 400 kHz mmio e0004000 irq 24
 cdns-i2c e0005000.i2c: 400 kHz mmio e0005000 irq 25
 IR NEC protocol handler initialized
 IR RC5(x/sz) protocol handler initialized
 IR RC6 protocol handler initialized
 IR JVC protocol handler initialized
 IR Sony protocol handler initialized
 IR SANYO protocol handler initialized
 IR Sharp protocol handler initialized
 IR MCE Keyboard/mouse protocol handler initialized
 IR XMP protocol handler initialized
 cdns-wdt f8005000.watchdog: Xilinx Watchdog Timer at f098d000 with timeout 10s
 EDAC MC: ECC not enabled
 Xilinx Zynq CpuIdle Driver started
 sdhci: Secure Digital Host Controller Interface driver
 sdhci: Copyright(c) Pierre Ossman
 sdhci-pltfm: SDHCI platform and OF driver helper
 mmc0: SDHCI controller on e0100000.mmc [e0100000.mmc] using ADMA
 ledtrig-cpu: registered to indicate activity on CPUs
 usbcore: registered new interface driver usbhid
 usbhid: USB HID core driver
 fpga_manager fpga0: Xilinx Zynq FPGA Manager registered
 NET: Registered protocol family 10
 Segment Routing with IPv6
 sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
 NET: Registered protocol family 17
 can: controller area network core (rev 20170425 abi 9)
 NET: Registered protocol family 29
 can: raw protocol (rev 20170425)
 can: broadcast manager protocol (rev 20170425 t)
 can: netlink gateway (rev 20170425) max_hops=1
 Registering SWP/SWPB emulation handler
 hctosys: unable to open rtc device (rtc0)
 of_cfs_init
 of_cfs_init: OK
 ALSA device list:
   No soundcards found.
 Freeing unused kernel memory: 1024K
 mmc0: new high speed SDHC card at address aaaa
 mmcblk0: mmc0:aaaa SU04G 3.69 GiB
 INIT:  mmcblk0: p1 p2
 version 2.88 booting
 Starting udev
 udevd[743]: starting version 3.2.2
 udevd[744]: starting eudev-3.2.2
 EXT4-fs (mmcblk0p2): recovery complete
 EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
 FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
 hwclock: can't open '/dev/misc/rtc': No such file or directory
 Tue Mar 19 03:03:03 UTC 2019
 hwclock: can't open '/dev/misc/rtc': No such file or directory
 Starting internet superserver: inetd.
 Configuring packages on first boot....
  (This may take several minutes. Please do not power off the machine.)
 Running postinst /etc/rpm-postinsts/100-sysvinit-inittab...
 update-rc.d: /etc/init.d/run-postinsts exists during rc.d purge (continuing)
  Removing any system startup links for run-postinsts ...
   /etc/rcS.d/S99run-postinsts
 INIT: Entering runlevel: 5
 Configuring network interfaces... IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
 udhcpc (v1.24.1) started
 Sending discover...
 Sending discover...
 Sending discover...
 No lease, forking to background
 done.
 Starting Dropbear SSH server: Generating key, this may take a while...
 Public key portion is:
 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCaB+HRMpl/uuag+WGIACkJu6SU3hMa+RZ/qA/7PCELRCDQF7mFLm0nYYh/ZRwmU+WRf1W+Aef17A4Mvuv8tJPq/FLgeft/3/XkQrPFepAV4ZGfPKA0UCgwf+D+NpgU8IH5hraVXPtj+UHpbrdfQOn6Cs2AdOuEa0ExF5k+aRdWMllK1ItO3bmJqEUU1QSml9t0SgpVu5gCViHszKDzYz5b3K9NLnXJ9TbEcfAUTfoENTZyg0f7bonnis9n1DYmLig+dKLr8AMVyPImMDGrr+YhSx1UI41mEj+4MUTvfjK4vuANbvHwRD60lOsRFA2qU0vWLkMxg4MT7bjhy18eX+Pv root@zturn_v2018.3
 Fingerprint: md5 8b:58:66:af:30:d6:4e:98:9b:bf:10:67:40:20:63:27
 dropbear.
 hwclock: can't open '/dev/misc/rtc': No such file or directory
 Starting syslogd/klogd: done
 Starting tcf-agent: OK
 
 PetaLinux 2018.3 zturn_v2018.3 /dev/ttyPS0
 
 zturn_v2018.3 login: root
 Password:
 root@zturn_v2018:~#

** FSBL の UART チャンネル設定 [#lfc4ab30]

起動するにはしたが 「[[電気回路/zynq/Petalinux のビルド#ode1428c]]」 と比べると、
FSBL 関連のメッセージが出ていないので、どこかで UART チャンネルの指定が足りていないっぽい?
(と思ったら、"#define FSBL_DEBUG_INFO 1" も足りてなかった)

対処法は・・・これかもしれない?

https://japan.xilinx.com/support/answers/61349.html

menuconfig で [Linux Components Selection] に移動し、[First Stage Bootloader] 
を無効にしたけれど components/ に fsbl のコードは存在しないのでどうしようもない。

えー?

しかたがないので、Windows 上の Xilinx SDK で fsbl を作成することにする。

[New]-[Aplication Project] から、
&ref(sdk-new-application-project.png,,50%);

適当な名前を付けて [Next] 後、テンプレートとして ZYNQ_FSBL を選択する。

&ref(sdk-new-project1.png,,50%);
&ref(sdk-new-project2.png,,50%);

UART のチャンネルが 0 でなく 1 なのに対応して、
fsbl_bsp\ps7_cortexa9_0\include\xparameters.h にて、

 LANG:C
 #define STDIN_BASEADDRESS 0xE0001000
 #define STDOUT_BASEADDRESS 0xE0001000

とする。

&ref(fsbl-uart-channel.png,,50%);

そして、fsbl_debug.h の冒頭に

 LANG:C
 #define	FSBL_DEBUG_INFO	1

を追加した。

&ref(fsbl_debug_info_1.png,,50%);

[Project]-[Build] したところ、

 arm-none-eabi-gcc.exe - アプリケーション エラー
 ----
 アプリケーションを正しく起動できませんでした (0xc0000142)。
 [OK] をクリックしてアプリケーションを閉じて下さい。

&ref(errror-0xc0000142.png,,50%);

が出た。

https://forums.xilinx.com/t5/Embedded-Development-Tools/The-application-was-unable-to-start-correctly-0xc0000142/td-p/563029

によると、WinAVR など一部のツールと PATH 設定でバッティングするらしい。

[Xilinx]-[Launch Shell] からコマンドプロンプトを立ち上げて試すと

 LANG:console
 > which arm-none-eabi-gcc.exe
  C:\Xilinx\SDK\2018.3\gnu\aarch32\nt\gcc-arm-none-eabi\bin\arm-none-eabi-gcc.exe
 >arm-none-eabi-gcc.exe --version
  arm-none-eabi-gcc.exe (Linaro GCC 7.3-2018.04-rc3) 7.3.1 20180314
  Copyright (C) 2017 Free Software Foundation, Inc.
  This is free software; see the source for copying conditions.  There is NO
  warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 > type %PATH%
  ... ;C:\WinAVR-20100110\bin;C:\WinAVR-20100110\utils\bin; ...
  ... ;C:\Xilinx\Vivado\2018.3\tps\mingw\6.2.0\win64.o\nt\bin;...

のように一見正しく起動するようなのだが、、、PATH 設定で tps\mingw 関連の優先度が 
WinAVR より低くなっているのが気になる。

そこで、
- C:\Xilinx\Vivado\2018.3\.settings64-Vivado.bat
- C:\Xilinx\Vivado\2018.3\bin\vivado.bat
- C:\Xilinx\SDK\2018.3\bin\xsdk.bat

の先頭に、

 LANG:bat
 SET PATH=%PATH:C:\WinAVR-20100110\bin;=%
 SET PATH=%PATH:C:\WinAVR-20100110\utils\bin;=%

を追加して、vivado や SDK の起動時に AVR 関連の PATH 設定を除去することにした。

その後、vivado および SDK を立ち上げ直し、プロジェクトの設定を Release に変更したら

&ref(fsbl-config-release.png,,50%);

[Project]-[Build All] でコンパイルする。Release フォルダに fsbl の elf 
ファイルができるので、これを Petalinux 側の hw_platform フォルダへコピーした。

&ref(fsbl_elf.png,,50%);

&ref(fsbl_elf2.png,,50%);


* 設定 [#ne1acba3]

build できそうなところまで確認できたため、
もう一度始めから [[電気回路/zynq/Petalinux のカスタマイズ#p4f8f224]] を参照しつつやり直す。

基本的に、zynq の Linux 上で開発をやりたいので、
SD カードの中味を簡単に変更できるような形にしておきたい。

コードを直すたびに petalinux-build して SD カードに焼いて再起動なんてやってられるか、っていう話。

 LANG:console
 $ cd ~/petalinux
 $ mv zturn-v2018.3/hw_platform .
 $ rm -rf zturn-v2018.3
 $ cat >> ~/.bashrc  # 自動実行スクリプトに登録する
  alias petalinux-setup='source /opt/petalinux_2018.3/settings.sh;export LANG=en_US.UTF-8'
 ^D
 $ petalinux-setup
 $ petalinux-create -t project --template zynq -n zturn-v2018.3
 $ cd zturn-v2018.3
 $ git init
 $ git add .
 $ git commit -m "newly created"
 $ petalinux-config --get-hw-description=../hw_platform
  (何もしないで Exit)
 $ git add .
 $ git commit -m "configure as default"
 $ petalinux-config --get-hw-description=../hw_platform
  Linux Components Selection --->
    [Uncheck] First Stage Bootloaer
  Auto Config Settings --->
    [Uncheck] fsbl autoconfig
  Subsystem AUTO Hardware Settings --->
    Advanced bootable images storage Settings --->
      dtb image settings --->
        image storage media --->
          primary sd $ git add .
  DTG Settings --->
    [Check] Devicetree overlay
  u-boot Configuration --->
    U-boot config --->  
      other
  Image Packaging Configuration --->
    Root filesystem type --->
      SD card
    [Uncheck] Copy final images to tftpboot
  Yocto Settings --->
    Parallel thread execution --->
      BB_NUMBER_THREADS = 3
      PARALLEL_MAKE = 3
 $ git add .
 $ git commit -m "petalinux configured"
 $ petalinux-config -c u-boot
  (何もしないで Exit)
 $ git add .
 $ git commit -m "u-boot configured as default"
 $ petalinux-config -c u-boot
  Boot images --->
    [Uncheck] Support Flattened Image Tree
  Boot media --->
    [Check] Support for booting from SD/EMMC
  Environment  --->
    Select the location of the environment --->  
      Environment is not stored
  Networking support --->
    [Uncheck] all
  Device Drivers --->
    [Uncheck] Ethernet PHY support
 $ git add .
 $ git commit -m "u-boot configured"
 $ mkdir -p images/linux/
 $ petalinux-package --image -c kernel --format uImage
  NOTE: Tasks Summary: Attempted 713 tasks of which 614 didn't need to be rerun and all succeeded.
 $ ls images/linux
  uImage
 $ ls -F build/tmp/deploy/images/plnx-zynq7/
  fitImage-4.14-xilinx-v2018.3+gitAUTOINC+eeab73d120-r0-plnx-zynq7-20190320020532.bin
  fitImage-its-4.14-xilinx-v2018.3+gitAUTOINC+eeab73d120-r0-plnx-zynq7-20190320020532.its
  fitImage-its-plnx-zynq7.its@
  fitImage-linux.bin-4.14-xilinx-v2018.3+gitAUTOINC+eeab73d120-r0-plnx-zynq7-20190320020532.bin
  fitImage-linux.bin-plnx-zynq7.bin@
  fitImage-plnx-zynq7.bin@
  modules--4.14-xilinx-v2018.3+git0+eeab73d120-r0-plnx-zynq7-20190320020532.tgz
  modules-plnx-zynq7.tgz@
  plnx-zynq7-system-20190320020532.dtb
  plnx-zynq7-system.dtb@
  System.map.linux
  uImage@
  uImage--4.14-xilinx-v2018.3+git0+eeab73d120-r0-plnx-zynq7-20190320020532.bin
  uImage-plnx-zynq7.bin@
  vmlinux@
  vmlinux--4.14-xilinx-v2018.3+git0+eeab73d120-r0-plnx-zynq7-20190320020532.bin
  vmlinux-plnx-zynq7.bin@
  Xilinx-plnx-zynq7.hdf
  zImage@
  zImage--4.14-xilinx-v2018.3+git0+eeab73d120-r0-plnx-zynq7-20190320020532.bin
  zImage-plnx-zynq7.bin@
 $ ls build/tmp/deploy/images/plnx-zynq7/u-boot.elf
  ls: cannot access 'build/tmp/deploy/images/plnx-zynq7/u-boot.elf': No such file or directory
 $ petalinux-build -c u-boot
  ...
  WARNING: /opt/petalinux_2018.3/components/yocto/source/arm/layers/meta-xilinx/meta-xilinx-bsp/recipes-bsp/u-boot/u-boot-xlnx_2018.3.bb.do_compile is tainted from a forced run
  ...
  Summary: There was 1 WARNING message shown.
 $ ls images/linux/
  image.ub  system.bit  system.dtb  System.map.linux  u-boot.bin  u-boot.elf  uImage  vmlinux  zImage
 $ petalinux-package --boot --fsbl ../hw_platform/zturn_fsbl_2018_3.elf --u-boot --force
 $ ls images/linux/
  BOOT.BIN  image.ub  system.bit  system.dtb  System.map.linux  u-boot.bin  u-boot.elf  uImage  vmlinux  zImage  zynq_fsbl.elf
 $ ln -s system.dtb images/linux/devicetree.dtb
 $ cat >images/linux/uEnv.txt
  bootargs=console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 devtmpfs.mount=0 rootwait
  uenvcmd=echo Copying Linux from SD to RAM... && mmcinfo && run load_image && bootm ${kernel_load_address} - ${devicetree_load_address}
  load_image=fatload mmc 0 ${kernel_load_address} ${kernel_image} && fatload mmc 0 ${devicetree_load_address} ${devicetree_image}
 ^D

ユーザー権限で sdcard をマウント可能にする。

 LANG:console
 $ vi fstab
 + /dev/sdf1 /mnt/sdcard1 auto defaults,user 0 0
 + /dev/sdf2 /mnt/sdcard2 auto defaults,user 0 0

起動ファイルのコピー

 LANG:console
 $ mount /dev/sdf1 /mnt/sdcard1
 $ sudo rm /mnt/sdcard1/*
 $ cp images/linux/BOOT.BIN images/linux/devicetree.dtb images/linux/uEnv.txt images/linux/uImage /mnt/sdcard1
 $ umount /dev/sdf1

ルートファイルシステムを作成してコピー

 LANG:console
 $ petalinux-build -c rootfs
  ...
  WARNING: petalinux-user-image-1.0-r0 do_rootfs: [log_check] petalinux-user-image: found 1 warning message in the logfile:
 [log_check] warning: %post(sysvinit-inittab-2.88dsf-r10.plnx_zynq7) scriptlet failed, exit status 1
  ...
  Summary: There was 1 WARNING message shown.
  [INFO] successfully built rootfs
 $ ls images/linux/
  BOOT.BIN        rootfs.cpio.bz2        rootfs.ext3.bz2  rootfs.manifest       system.bit        u-boot.bin  vmlinux
  devicetree.dtb  rootfs.cpio.gz         rootfs.ext4      rootfs.tar.bz2        system.bit.bin    u-boot.elf  zImage
  image.ub        rootfs.cpio.gz.u-boot  rootfs.ext4.gz   rootfs.tar.gz         system.dtb        uEnv.txt    zynq_fsbl.elf
  rootfs.cpio     rootfs.ext3            rootfs.jffs2     rootfs.testdata.json  System.map.linux  uImage
 $ sudo mount /dev/sdf2 /mnt/sdcard2
 $ sudo tar fxz images/linux/rootfs.tar.gz -C /mnt/sdcard2
 $ sudo umount /dev/sdf2

** いくつか問題を解決する [#b38f6377]

以上、ほぼ [[電気回路/zynq/Petalinux のカスタマイズ#p4f8f224]] を踏襲することで起動するようにはなったが、いくつか問題があった。対処法が分かったものについてはすでに上の「設定」に含めてある。

*** Warning - bad CRC, using default environment [#i987cb85]

U-Boot 起動メッセージに

 LANG:console
 U-Boot 2018.01 (Mar 20 2019 - 04:12:57 +0000) Xilinx Zynq ZC702
 
 Board: Xilinx Zynq
 Silicon: v3.1
 I2C:   ready
 DRAM:  ECC disabled 1 GiB
 MMC:   mmc@e0100000: 0 (SD)
 SF: Detected w25q128bv with page size 256 Bytes, erase size 4 KiB, total 16 MiB
 *** Warning - bad CRC, using default environment

として、"Warning - bad CRC, using default environment" が出た。

これは Serial Flash (SF) に environment が書き込まれていないという警告のようで、
ZYNQ> プロンプトでの saveenv コマンドで現在の環境変数を保存すると出なくなるらしいのだが、
その必要はないのでむしろ u-boot の設定で

 LANG:console
 Environment  --->
   Select the location of the environment --->  
     Environment is not stored

として、環境変数を保存する機能を切っておく。

 LANG:console
 U-Boot 2018.01-00083-gd8fc4b3b70 (Mar 20 2019 - 09:59:27 +0000) Xilinx Zynq ZC702
 
 Board: Xilinx Zynq
 Silicon: v3.1
 I2C:   ready
 DRAM:  ECC disabled 1 GiB
 MMC:   mmc@e0100000: 0 (SD)
 Using default environment

これで WARNING は出なくなった。
*** "reading uEnv.txt" が2回表示される [#fcfee566]

 LANG:console
 reading uEnv.txt
 371 bytes read in 8 ms (44.9 KiB/s)
 Importing environment from SD ...
 Hit any key to stop autoboot:  0
 Device: mmc@e0100000
 Manufacturer ID: 3
 OEM: 5344
 Name: SU04G
 Tran Speed: 50000000
 Rd Block Len: 512
 SD version 3.0
 High Capacity: Yes
 Capacity: 3.7 GiB
 Bus Width: 4-bit
 Erase Group Size: 512 Bytes
 reading uEnv.txt
 371 bytes read in 8 ms (44.9 KiB/s)
 Loaded environment from uEnv.txt
 Importing environment from SD ...
 Running uenvcmd ...

無駄な気がする。

uEnv.txt で指定する環境変数の規定値などは

 LANG:console
 less ./build/tmp/work/plnx_zynq7-xilinx-linux-gnueabi/u-boot-xlnx/v2018.01-xilinx-v2018.3+gitAUTOINC+d8fc4b3b70-r0/git/include/configs/zynq-common.h

で確認できるのでこれをよく見ると、1回目の読み込みは preboot で行われていて、
ソースコード的には "#define CONFIG_PREBOOT" を無効にすれば良さそうだ。

今のところ、petalinux-config のメニューからこれを変更する方法が分からず、しかたなく放置している。


* カーネルをソースから make [#t9b088e3]

petalinux-config & petalinux-build では時間がかかりすぎるので、
[[電気回路/zynq/Petalinux のカスタマイズ#g5728922]] を踏襲して
カーネルをソースファイルの make でビルドできるようにしておく。

 LANG:console
 $ cp -R build/tmp/work-shared/plnx-zynq7/kernel-source/ .
 $ cp build/tmp/work-shared/plnx_arm/kernel-build-artifacts/.config kernel-source/
 $ echo /kernel-source >> .gitignore
 $ git add -f kernel-source/.config
 $ git commit -m "add kernel .config"
 $ cd kernel-source/
 $ sudo apt-get install -y crossbuild-essential-armhf bc u-boot-tools # 必要なパッケージを導入
 $ make ARCH=arm menuconfig # kernel 設定のメニューを表示
 $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x8000 uImage modules
 $ cp arch/arm/boot/uImage ../images/linux # 一応ここにコピーしておく
 $ sudo mount /dev/sdf1 /mnt/sdcard1/
 $ sudo cp arch/arm/boot/uImage /mnt/sdcard1/
 $ sudo umount /dev/sdf1
 $ sudo mount /dev/sdf2 /mnt/sdcard2/
 $ sudo make ARCH=arm INSTALL_MOD_PATH=/mnt/sdcard2 modules_install
 $ sudo umount /dev/sdf2

デフォルトのままでビルドすると iptables (ファイアーウォール)
機能が盛り込まれていないことが後で分かった。
この段階から、menu-config で iptables を有効にしておくのが良い気がする。

* ルートファイルシステムに Ubuntu 18.04 LTS を採用 [#mf635800]

上記のようにしてインストールしたカーネルは、

 LANG:console
 $ uname -a
  Linux zturn-v2018.3 4.14.0-xilinx-v2018.3 #1 SMP PREEMPT Wed Mar 20 02:25:46 UTC 2019 armv7l GNU/Linux

となる。

Ubuntu の 18.04 LTS が Linux Kernel 4.15 ベースなので、ギリギリこれが入れられるのかもしれない?~
→ 公式にサポートされているとの記載を発見 https://japan.xilinx.com/support/answers/71653.html

以下の手順で ~/petalinux/zturn-v2018.3/rootfs に Ubuntu 18.04 LTS 
のディスクイメージを作成して、SD カードに焼いて使うことにする。

VirtualBox 内の Ubuntu から、 

 LANG:console
 $ sudo apt-get install qemu-user-static debootstrap binfmt-support
 $ export targetdir=~/petalinux/zturn-v2018.3/rootfs
 $ export distro=bionic
 $ mkdir -p $targetdir
 $ sudo debootstrap --arch=armhf --foreign $distro $targetdir
 $ sudo cp /usr/bin/qemu-arm-static $targetdir/usr/bin
 $ sudo cp /etc/resolv.conf $targetdir/etc
 $ sudo chroot $targetdir

 LANG:console
 $ export distro=bionic
 $ export LANG=C
 $ export hostname=zturn2018_3
 $ /debootstrap/debootstrap --second-stage
 $ cat << EOT > /etc/apt/sources.list
  # http://ascii.jp/elem/000/000/441/441502/index-3.html によれば、
  #   main が Canonical によりメンテナンスされているオープンソースウェア
  #   restricted が Canonical によりメンテナンスされているクローズウェア
  #   universe が オープンソースウェア
  #   multiverse が オープンソースでないもの
  deb http://ports.ubuntu.com/ubuntu-ports/ $distro main restricted universe multiverse
  deb http://ports.ubuntu.com/ubuntu-ports/ $distro-backports main restricted universe multiverse
  deb http://ports.ubuntu.com/ubuntu-ports/ $distro-security main restricted universe multiverse
  deb http://ports.ubuntu.com/ubuntu-ports/ $distro-updates main restricted universe multiverse
  EOT
 $ cat << EOT > /etc/apt/apt.conf.d/71-no-recommends
  APT::Install-Recommends "0";
  APT::Install-Suggests "0";
  EOT
 $ apt-get update
 $ apt-get install -y etckeeper  # /etc 以下の更新履歴を取る
 $ apt-get install -y locales dialog
 $ dpkg-reconfigure locales
  Generating locales (this might take a while)...
    en_US.UTF-8... done
    ja_JP.UTF-8... done
  Generation complete.
 $ apt-get install -y openssh-server ntpdate hwinfo ntp samba jed aptitude dbus ca-certificates \
 > build-essential device-tree-compiler cmake doxygen libsysfs-dev libhugetlbfs-dev \
 > dbus bash-completion
 $ cat /etc/network/interfaces
  # ifupdown has been replaced by netplan(5) on this system.  See
  # /etc/netplan for current configuration.
  # To re-enable ifupdown on this system, you can run:
  #    sudo apt install ifupdown
 $ cat << EOT > /etc/netplan/eth0.yaml
  network:
      version: 2
      renderer: networkd
      ethernets:
          enp3s0:
              dhcp4: y
              dhcp6: n
  EOT
 $ cat << EOT > /usr/lib/networkd-dispatcher/routable.d/ntp-restart
 > #!/bin/sh
 > /usr/sbin/service ntp restart
 > EOT
 $ chmod u+x /usr/lib/networkd-dispatcher/routable.d/ntpdate
 $ echo $hostname > /etc/hostname
 $ echo "127.0.0.1    " $hostname >> /etc/hosts
 $ echo "/dev/mmcblk0p1  /boot auto  defaults   0   0" >> /etc/fstab
 $ adduser takeuchi
 $ adduser takeuchi sudo
  Adding user `takeuchi' to group `sudo' ...
  Adding user takeuchi to group sudo
  Done.
 $ su takeuchi
 $ groups
  takeuchi sudo
 $ exit
 $ vi /etc/samba/smb.conf
    [global]
  +    # プリンタ関連の警告が出ないようにする
  +    printing = bsd
  +    load printers = no
  +    printcap name = /dev/null
    ...
    [homes]
    ...
  -    read only = yes
  +    # ホームディレクトリを書き込み可能にする
  +    read only = no
    ...
  + # /boot 以下を共有する
  + [boot]
  +    path = /boot
  +    force group = root
  +    force user = root
  +    create mode = 600
  +    directory mode = 755
  +    valid user = takeuchi
  +    writable = yes
 $ # samba インストール前に作られた既存ユーザーについては
 $ # 別途 samba に登録してやる必要がある
 $ pdbedit -a -u takeuchi
  new password:
  retype new password:
 $ exit

 LANG:console
 $ sudo tar fcz ubuntu18.04LTS_rootfs.tar.gz rootfs
 $ sudo rm -rf rootfs/
 $ mount /dev/sdf2
 $ sudo rm -rf /mnt/sdcard2/*  # 以前のファイルを全て消す
 $ sudo tar fxz ubuntu18.04LTS_rootfs.tar.gz -C /mnt/sdcard2
 $ umount /dev/sdf2

Petalinux で作成した images/linux/rootfs.tar.gz が 6MB 程度だったのに対して、~
ubuntu18.04LTS_rootfs.tar.gz は 408MB あるので非常に大きい。

でも http を使ってブラウザ経由で制御するようなことを考えると
慣れた環境がうれしい。

** ネットワークが繋がらない? [#ccde9813]

はじめ、/etc/netplan 以下のファイルのファイル名を eth0.dhcp としていたために、
ネットワーク接続が得られなかった。

zynq 上のコンソールから:
 LANG:console
 $ ip address show
  1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
         valid_lft forever preferred_lft forever
      inet6 ::1/128 scope host
         valid_lft forever preferred_lft forever
  2: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN group default qlen 10
      link/can
  3: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
      link/ether 00:0a:35:00:01:22 brd ff:ff:ff:ff:ff:ff
  4: sit0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
      link/sit 0.0.0.0 brd 0.0.0.0
 $ sudo ip link set eth0 up
 $ ip address show eth0
  3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
      link/ether 00:0a:35:00:01:22 brd ff:ff:ff:ff:ff:ff
      inet6 fe80::20a:35ff:fe00:122/64 scope link
         valid_lft forever preferred_lft forever
 $ sudo mv /etc/netplan/eth0.dhcp /etc/netplan/eth0.yaml
 $ sudo netplan apply
 $ ip address show eth0
  3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
      link/ether 00:0a:35:00:01:22 brd ff:ff:ff:ff:ff:ff
      inet 10.225.225.181/24 brd 10.225.225.255 scope global dynamic eth0
         valid_lft 3069652548sec preferred_lft 3069652548sec
      inet6 fe80::20a:35ff:fe00:122/64 scope link
         valid_lft forever preferred_lft forever

繋がった。

/etc/netplan/ の設定ファイルは拡張子を .yaml にしておかなければならないらしい。
はじめ、変な拡張子にしていたためにうまく行かなかった。

上記の設定で、再起動しても問題なく繋がるようになった。

** ネットワークに繋がった際に実行するスクリプト [#x5368054]

z-turn board はバッテリーを積んでいないので、電源を切ると時刻が初期化されてしまう。
ネットワークケーブルを繋いだ状態で電源を入れれば起動直後に ntpd 
が時刻を合わせてくれるようなのだけれど、
電源を入れた後でネットワークケーブルを繋ぐとしばらくは時刻がずれたままになってしまう。

そこで、ネットワークが link up した際に ntp を再起動するよう設定したい。

netplan は現状で、ネットワークに繋がった際に特定のスクリプトを実行するための
Hook を提供していないものの、networkd-dispatcher が同様の機能を提供しているそうだ。

- Netplan FAQ : Use pre-up, post-up, etc. hook scripts~
https://netplan.io/faq#use-pre-up-post-up-etc-hook-scripts

ifupdown であれば /etc/network/if-up.d 
に置いていたようなスクリプトに対応するには
networkd-dispatcher を使うことになるのだそうだ。

networkd-dispatcher は Ubuntu 18.04LTS にはデフォルトで入っているみたい。

 LANG:console
 $ # ネットワークケーブルを挿さずに起動
 $ date # 時刻がおかしい
  2018年  1月 28日 日曜日 15:58:34 UTC
 $ sudo apt show networkd-dispatcher # すでに入っている
  Package: networkd-dispatcher
  Version: 1.7-0ubuntu3.3
  Priority: important
  Section: utils
  Origin: Ubuntu
  Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
  Bugs: https://bugs.launchpad.net/ubuntu/+filebug
  Installed-Size: 59.4 kB
  Depends: gir1.2-glib-2.0, python3-dbus, python3-gi, python3:any
  Suggests: iw | wireless-tools
  Homepage: https://github.com/craftyguy/networkd-dispatcher
  Task: minimal
  Supported: 5y
  Download-Size: 13.3 kB
  APT-Sources: http://ports.ubuntu.com/ubuntu-ports bionic-updates/main armhf Packages
  Description: Dispatcher service for systemd-networkd connection status changes
   Networkd-dispatcher is a dispatcher daemon for systemd-networkd
   connection status changes. It is similar to NetworkManager-dispatcher,
   but is much more limited in the types of events it supports due to the
   limited nature of systemd-networkd.
  
  N: 追加レコードが 1 件あります。表示するには '-a' スイッチを付けてください。
 $ ls -F /usr/lib/networkd-dispatcher/
  dormant.d/  no-carrier.d/  off.d/  routable.d/
 $ ls -F /usr/lib/networkd-dispatcher/routable.d/ # 何も設定されていない
 $ cat << EOT | sudo tee /usr/lib/networkd-dispatcher/routable.d/ntp-restart
 > #!/bin/sh
 > /usr/sbin/service ntp restart
 > EOT
 $ sudo chmod u+x /usr/lib/networkd-dispatcher/routable.d/ntpdate
 $ # ネットワークケーブルを挿す
 $ date
  2019年  3月 22日 金曜日 10:06:45 UTC

うまくいった。

Ubuntu の動作中はローカルの ntpd が動いており、に時刻を合わせている。

計測のための制御などで秒単位で正確な時間間隔が必要なときにシステムクロックを当てにしてしまうと、
ntpd による時刻の微調整のタイミングで間隔がズレる可能性があるため注意が必要だ。

独自にタイマーを持って、そちらを基準にすべきだ。


作業履歴へ戻る → [[電気回路/zynq]]

* コメント・質問 [#ved01a20]

#article_kcaptcha


Counter: 12741 (from 2010/06/03), today: 3, yesterday: 0