ZYBO (Zynq) 初心者ガイド (15) Linux起動時にアプリケーションを自動実行させる

- [1回目: 開発環境の準備](https://qiita.com/take-iwiw/items/966f252f6ca954aff08b)
- [2回目: Hello Worldプロジェクト](https://qiita.com/take-iwiw/items/24a8a94741fdbb80f62a)
- [3回目: PSのGPIOでLチカ](https://qiita.com/take-iwiw/items/39d2ed00fa88a1204fce)
- [4回目: PLのAXI GPIOでPSからLチカ](https://qiita.com/take-iwiw/items/a3b935a4e4dbd41593e1)
- [5回目: PLだけでLチカ](https://qiita.com/take-iwiw/items/efcdfca1866b9941fd2a)
- [6回目: 自作IPでLチカ](https://qiita.com/take-iwiw/items/b0f2ce7b4653bc6f32b9)
- [7回目: ブートイメージを作る](https://qiita.com/take-iwiw/items/ece0cdf83e6e1908fad8)
- [8回目: Linux起動する](https://qiita.com/take-iwiw/items/6e6915f7318689818368)
- [9回目: Linuxカーネルを少しカスタマイズする](https://qiita.com/take-iwiw/items/6f2644d16cbfdb021d07)
- [10回目: LinuxのRootFSをカスタマイズする / PythonでHello World](https://qiita.com/take-iwiw/items/94a90047978664159681)
- [11回目: LinuxユーザアプリケーションでLチカ](https://qiita.com/take-iwiw/items/5e4ab9a106acfda2c866)
- [12回目: LinuxカーネルモジュールでLチカ](https://qiita.com/take-iwiw/items/e7efc48d92d7b979efdc)
- [13回目: LAN(Ethernet 0)を使う](https://qiita.com/take-iwiw/items/ac489acaca1ab54d7ce8)
- [14回目: Linuxユーザアプリをデバッグする / RootFSに取り込む](https://qiita.com/take-iwiw/items/8134ca7098622219b177)
- __[15回目: Linux起動時にアプリケーションを自動実行させる](https://qiita.com/take-iwiw/items/50065df6cdd1ba8bcbd6) <--- 今回の内容__
- [16回目: Linuxから自作IPをUIOで制御する](https://qiita.com/take-iwiw/items/da91ce4dc2a8a8df3c0a)
- [17回目: Linuxで自作IPのデバイスドライバを作る](https://qiita.com/take-iwiw/items/05eb1204cb51ce0a5c03)
- [18回目: IoT化してスマホからLチカ](https://qiita.com/take-iwiw/items/e9311292c5078d785699)

# 環境
- 開発用PC: Windows 10 64-bit 
	- Vivado 2017.4 WebPACKライセンス
	- Xilinx SDK 2017.4  <- 今回は未使用
- 開発用PC (Linux): Ubuntu 16.04 本家 (日本語版じゃない) (on VirtualBox 5.2.4)
	- PetaLinux 2017.4
- ターゲットボード: ZYBO (Z7-20) 

# Linux起動時にアプリケーションを自動実行させる
[前回](https://qiita.com/take-iwiw/items/8134ca7098622219b177)の内容で、自作のユーザアプリケーションをRootFSにインストールすることが出来ました。これによって、作成したアプリケーションをZYBO上で実行することが出来ます。しかし、実際のプロダクトだと、お客さんはコマンドを打って実行をするなんてことはできません。

今回は、自作したアプリケーションをLinux起動時に自動実行させるということをやります。

前回の続きとして、`/usb/bin/blink1`がすでにあるものとします。今回は、このアプリケーションを起動時に実行させます。

# 起動スクリプトの作成
方針としては、起動スクリプト(`/etc/init.d/myinit`)をインストールして、そのスクリプトで任意のアプリケーションを呼ぶようにします。結果として、自作アプリケーションがデーモンとして実行されます。今回は、直接`blink1`を呼ぶのではなく、`myinit_run.sh`という`blink1`を呼ぶだけのシェルスクリプトを間に挟みます。これは、省略できます。が、今後、何か起動時の処理を変更したいときは、`myinit_run.sh`をいじるだけでOKになります。

- 起動 -> `/etc/init.d/myinit` -> `/usb/bin/myinit_run.sh` -> `/usb/bin/blink1`


下記コマンドで、myinitというアプリケーションを作ります。これは、Cプログラムではなく、シェルスクリプトを取り込む(インストールする)だけのアプリケーションです。
`myinit.bb`はビルド/パッケージ化(`petalinux-build -x package`)するときの処理が書かれているレシピになります。使用するファイルは`myinit`と`myinit_run.sh(後で自分で新規作成する)`です。`myinit`を起動スクリプトとするので、`/etc/init.d/`にコピーするようにします。`myinit_run.sh`に実際に処理する内容を書きます。これはひとまず`/usr/bin`にコピーすることにします。

```sh:開発PCのターミナル
petalinux-create -t apps --template install -n myinit --enable
code project-spec/meta-user/recipes-apps/myinit/myinit.bb &
code project-spec/meta-user/recipes-apps/myinit/files/myinit &
code project-spec/meta-user/recipes-apps/myinit/files/myinit_run.sh &
```

```sh:myinit.bb
#
# This file is the myinit recipe.
#

SUMMARY = "Simple myinit application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

SRC_URI = "file://myinit \
           file://myinit_run.sh \
          "

S = "${WORKDIR}"

inherit update-rc.d
INITSCRIPT_NAME = "myinit"
INITSCRIPT_PARAMS = "start 99 S ."

do_install() {
	# myinit is init daemon
	install -d ${D}${sysconfdir}/init.d
	install -m 0755 ${S}/myinit ${D}${sysconfdir}/init.d/myinit

	# myinit.sh is shell script called from myinit
	install -d ${D}${bindir}
	install -m 0755 myinit_run.sh ${D}${bindir}
}

FILES_${PN} += "${sysconfdir}/*"
```

```sh:myinit
#!/bin/sh

DAEMON=/usr/bin/myinit_run.sh

start ()
{
	echo " Starting myinit"
	start-stop-daemon -S -o --background -x $DAEMON
}

stop ()
{
	echo " Stoping myinit"
	start-stop-daemon -K -x $DAEMON
}

restart()
{
	stop
	start
}

[ -e $DAEMON ] || exit 1
	case "$1" in
		start)
			start; ;;
		stop)
			stop; ;;
		restart)
			restart; ;;
		*)
			echo "Usage: $0 {start|stop|restart}"
			exit 1
	esac
exit $?
```

```sh:myinit_run.sh
#!/bin/sh
blink1
```

`myinit_run.sh`を使わない場合は、`myinit`内の`DAEMON=/usr/bin/myinit_run.sh`を`DAEMON=blink1`にする

## image.ubの再作成
上記のように3つのファイルを編集したら、下記コマンドでimage.ubを再作成します。

```
petalinux-build -x package
```

# 確認する
出来上がったimage.ubをSDカードに上書きコピーして、ZYBOを起動します。

すると、自動的にLEDがチカチカするはずです。(ログインも不要です)


# 参考
https://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx2017_2/ug1144-petalinux-tools-reference-guide.pdf
(起動用スクリプトは、ほぼ丸写しです。)