電気回路/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: 2689 (from 2010/06/03),
today: 2,
yesterday: 1