電気回路/zynq/自動起動の設定 の履歴(No.3)
更新電源投入後に初期化&アプリケーションを自動実行する†
- FPGA ロジックのプログラム
- 各種 dtso のデバイスツリーへの組み込み
- 初期化スクリプトの実行
- アプリケーションの実行
をしたい。
目次†
/etc/init.d と /etc/rc5.d を使う†
この際 systemd を使ってみようかしら、とも思ったけれど
- https://dev.classmethod.jp/cloud/aws/service-control-use-systemd/
- https://qiita.com/ledmonster/items/5f2e1633d4124cb978fe
何だかややこしいので Sysvinit でお茶を濁すことにする。
LANG:console $ runlevel N 5
通常起動時の runlevel は 5 なので、/etc/init.d に起動スクリプトを置いて、 そこへのシンボリックリンクを /etc/rc5.d に作っておく。
/etc/init.d/fpga
LANG:sh
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
. /lib/lsb/init-functions
FPGA_PROGRAM=/usr/local/bin/fpga-program
DTO=/usr/local/bin/dto
BINFILES="/boot/design*.bin"
DTSOFILES="/boot/dtso.d/*.dtso"
INITFILES="/boot/fpga_init.d/*[!~]"
test -x $DTO || exit 5
test -x $FPGA_PROGRAM || exit 5
num () {
echo $#
}
program_fpga () {
if [ $(num $BINFILES) = 0 ]; then
echo "No .bin file found at /boot."
return 1
fi
if [ $(num $BINFILES) = 1 ]; then
BINFILE=$BINFILES
else
echo "==== Multiple binary files found:"
n=1
for bin in $BINFILES
do
echo " " $n : $bin
n=$(($n + 1))
done
echo -n "Which file should be loaded: "
read selection
n=1
for bin in $BINFILES
do
if [ $n = $selection ]; then
BINFILE=$bin
fi
n=`expr $n + 1`
done
fi
echo "Programming FPGA logic with $BINFILE"
$FPGA_PROGRAM $BINFILE
}
load_dtso () {
for dtso in $DTSOFILES
do
mountp=$(echo $dtso|sed "s/.*\///"|sed "s/\..*//")
echo "Loading $dtso at $mountp"
$DTO $mountp $dtso
done
}
fpga_start () {
for init in $INITFILES
do
$init start
done
}
fpga_stop () {
for init in $INITFILES
do
$init stop
done
}
unload_dtso () {
for dtso in $DTSOFILES
do
mountp=$(echo $dtso|sed "s/.*\///"|sed "s/\..*//")
echo "Unloading $dtso at $mountp"
$DTO $mountp
done
}
case $1 in
start)
log_daemon_msg "Starting FPGA logic" "fpga"
program_fpga && load_dtso && fpga_start
log_end_msg $?
;;
stop)
log_daemon_msg "Stopping FPGA logic" "fpga"
fpga_stop && unload_dtso
;;
status)
fpga_status
;;
restart|force-reload)
$0 stop; sleep 1;$0 start
;;
*)
echo "Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
exit 2
;;
esac
を用意し、
LANG:console $ ln -s /etc/init.d/fpga /etc/rc5.d/S00fpga
することで、起動時に
- /boot/design*.bin を fpga-program する
- /boot/dtso/*.dtso を dto する
- /boot/fpga_init.d/* に start を付けて実行する
を行えるようになった。
後は、
/boot/fpga_init.d/10_gpio1
LANG:sh
#!/bin/sh
do_start () {
if [ ! -e /sys/class/gpio/gpiochip901 ]; then
echo "ERROR: /sys/class/gpio/gpiochip901 not found."
exit 1
fi
for n in 901 902 903 904 905
do
echo $n > /sys/class/gpio/export
done
}
do_stop () {
if [ ! -e /sys/class/gpio/gpiochip901 ]; then
echo "ERROR: /sys/class/gpio/gpiochip901 not found."
exit 1
fi
for n in 901 902 903 904 905
do
echo $n > /sys/class/gpio/unexport
done
}
case $1 in
start)
do_start
;;
stop)
do_stop
;;
*)
echo "Usage: $0 {start|stop}"
exit 2
;;
esac
/boot/fpga_init.d/80_lcd-show-ip
LANG:sh
#!/bin/sh
do_start () {
lcd-show-ip
}
do_stop () {
true
}
case $1 in
start)
do_start
;;
stop)
do_stop
;;
*)
echo "Usage: $0 {start|stop}"
exit 2
;;
esac
のようにして起動スクリプトを追加していけばいい。
コメント・質問†
Counter: 3088 (from 2010/06/03),
today: 7,
yesterday: 5