電気回路/zynq/自動起動の設定 のバックアップ差分(No.3)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[電気回路/zynq]]

* 電源投入後に初期化&アプリケーションを自動実行する [#v9672a1a]

- FPGA ロジックのプログラム
- 各種 dtso のデバイスツリーへの組み込み
- 初期化スクリプトの実行
- アプリケーションの実行

をしたい。

** 目次 [#seefcc4e]

#contents

* systemd にするか sysvinit にするか [#rfb55e43]
* /etc/init.d と /etc/rc5.d を使う [#rfb55e43]

この際 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 なので、
通常起動時の 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 n in 901 902 903 904 905
     for init in $INITFILES
     do
       echo $n > /sys/class/gpio/export
       $init start
     done
 
     lcd-show-ip
 }
 
 fpga_stop () {
     for n in 901 902 903 904 905
     for init in $INITFILES
     do
       echo $n > /sys/class/gpio/unexport
       $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

のようにして起動スクリプトを追加していけばいい。

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

#article_kcaptcha


Counter: 2149 (from 2010/06/03), today: 1, yesterday: 1