20170120_jeffrey - silenceuncrio/diary GitHub Wiki

Index

  • 0920 - 繼續昨天的修改前先盤一下
  • 0945 - FirmwareUpgrade.sh
  • 1030 - uboot_env.sh
  • 1055 - commit 時要寫什麼呢
  • 1130 - git push... ok
  • 1335 - 加了 gps 的 web page
  • 1350 - 把預設的位置改到公司來
  • 1440 - mfgtool flashing firmware 後是沒有 /home/log 的... 要注意阿...

0920

繼續昨天的修改前先盤一下

  • modified: /proscend/base_fs/default/rootfs/etc/rc.local
  • modified: /proscend/prosrc/icos/script/FirmwareUpgrade.sh
  • new file: /proscend/prosrc/icos/script/uboot_env.sh

rc.local

diff --git a/proscend/base_fs/default/rootfs/etc/rc.local b/proscend/base_fs/default/rootfs/etc/rc.local
old mode 100644
new mode 100755
index 52440a4..d3f8101
--- a/proscend/base_fs/default/rootfs/etc/rc.local
+++ b/proscend/base_fs/default/rootfs/etc/rc.local
@@ -53,23 +53,48 @@ echo 1 > /proc/sys/net/ipv4/ip_forward


 # ======================================================================
-# | attach the related MTD device to UBI,
-# | according to the current rootfs
+# | apply the uboot env variables related to current application
+# ======================================================================
+/usr/sbin/icos/uboot_env.sh
+
+
+
+# ======================================================================
+# | read-only remount a mounted root file system
+# | attach MTD device to UBI according to the current rootfs
 # ======================================================================
 /bin/mkdir -p /mnt/data
+/bin/mkdir -p /mnt/config
+
 if df | grep rootfs_a
 then
+    #echo "read-only remount a mounted root file system"
+    #mount -t ubifs ubi0:rootfs_a / -o remount,ro
+
     echo "attach MTD device 5 (mtd5) to UBI - ubi1:config_a"
     ubiattach -m 5
-    mount -t ubifs ubi1:config_a /mnt/data
+    mount -t ubifs ubi1:config_a /mnt/config
 else
+    #echo "read-only remount a mounted root file system"
+    #mount -t ubifs ubi0:rootfs_b / -o remount,ro
+
     echo "attach MTD device 10 (mtd10) to UBI - ubi1:config_b"
     ubiattach -m 10
-    mount -t ubifs ubi1:config_b /mnt/data
+    mount -t ubifs ubi1:config_b /mnt/config
 fi



+# ======================================================================
+# | prepare '/mnt/data' and '/home/log' for the application
+# ======================================================================
+/bin/mkdir -p /mnt/config/data
+/bin/mkdir -p /mnt/config/log
+mount /mnt/config/data /mnt/data
+mount /mnt/config/log /home/log
+
+
+
 # ==========================================================================
 # | mkdir /mnt/data/icos         for icos data storage (/etc/icos)
 # | mkdir /mnt/data/etc          for other app data storage
@@ -102,14 +127,15 @@ if [ ! -z "$sys_time" ]; then
 fi

 if [ -d "/home/log" ]; then
-       TIME=$(date +"%Y%m%d%H%M")
-       cd /home; tar zcf log-${TIME}.tgz log
+    TIME=$(date +"%Y%m%d%H%M")
+    cd /mnt/data
+    tar zcf log-${TIME}.tgz /home/log
     rm -rf /home/log/*
 fi

 KEEP=2
 KEEP_LOGS=$(ls log-*.tgz 2>/dev/null | tail -n $KEEP)
-TEMP_DIR=_log_temp
+TEMP_DIR=/tmp/_log_temp

 mkdir -p $TEMP_DIR
 for log in $KEEP_LOGS
@@ -137,3 +163,14 @@ modprobe cryptodev
        --hold-exit 5 0 &
 # Ariel: make icos watch dog to be the last one.Max timeout is 128 seconds.
 /usr/sbin/icoswdog -T 120 &
+
+
+
+# ======================================================================
+# | reset the uboot env no_good counter
+# | we think our applicaion is good at this moment
+# ======================================================================
+fw_setenv no_good .
+
+
+
  1. 為了套用新的 uboot env 呼叫了 uboot_env.sh
  2. 在把 rootfs 轉成 read-only 之前, 先把需要的 folder 建立出來
  3. 依據目前的 primary applicaiton MTD 決定 /mnt/config 的 mount 對象是 ubi1:config_a 還是 ubi1:config_b
  4. M300 應用需要寫入的地方有兩個: /mnt/data/home/log
  • /mnt/data mount 到 /mnt/config/data
  • /home/log mount 到 /mnt/config/log
  1. 把記錄檔的寫入位置從 read-only 的 /home 改到 /mnt/data
  2. 目前先把 rc.local 的末端當成是 M300 應用服務確認是完整的 check point

目前某些 icos 模組因為 rootfs read-only 的關係導致 M300 應用服務初始化失敗

所以先把 rootfs 轉成 read-only 的動作 comment 掉

0945

FirmwareUpgrade.sh

diff --git a/proscend/prosrc/icos/script/FirmwareUpgrade.sh b/proscend/prosrc/icos/script/FirmwareUpgrade.sh
index b869e4a..423f921 100755
--- a/proscend/prosrc/icos/script/FirmwareUpgrade.sh
+++ b/proscend/prosrc/icos/script/FirmwareUpgrade.sh
@@ -69,23 +69,23 @@ then
     echo "finished" >> /tmp/FirmwareUpgrade.log
     exit 1
   fi
-  echo "Create derectory /mnt/rootfs_b" >> /tmp/FirmwareUpgrade.log
-  mkdir -p /mnt/rootfs_b
-  echo "Mount /mnt/rootfs_b with node ubi2:rootfs_b" >> /tmp/FirmwareUpgrade.log
-  if mount -t ubifs ubi2:rootfs_b /mnt/rootfs_b
+  echo "Create derectory /tmp/rootfs_b" >> /tmp/FirmwareUpgrade.log
+  mkdir -p /tmp/rootfs_b
+  echo "Mount /tmp/rootfs_b with node ubi2:rootfs_b" >> /tmp/FirmwareUpgrade.log
+  if mount -t ubifs ubi2:rootfs_b /tmp/rootfs_b
   then
-    echo "mount -t ubifs ubi2:rootfs_b /mnt/rootfs_b succeeded" >> /tmp/FirmwareUpgrade.log
+    echo "mount -t ubifs ubi2:rootfs_b /tmp/rootfs_b succeeded" >> /tmp/FirmwareUpgrade.log
   else
-    echo "mount -t ubifs ubi2:rootfs_b /mnt/rootfs_b failed" >> /tmp/FirmwareUpgrade.log
+    echo "mount -t ubifs ubi2:rootfs_b /tmp/rootfs_b failed" >> /tmp/FirmwareUpgrade.log
     echo "finished" >> /tmp/FirmwareUpgrade.log
     exit 1
   fi
   echo "" >> /tmp/FirmwareUpgrade.log
   echo "Writting rootfs... please wait" >> /tmp/FirmwareUpgrade.log
   echo "" >> /tmp/FirmwareUpgrade.log
-  tar -jxv -C /mnt/rootfs_b -f /tmp/firmware/rootfs.tar.bz2
-  echo "Unmount /mnt/rootfs_b" >> /tmp/FirmwareUpgrade.log
-  umount /mnt/rootfs_b
+  tar -jxv -C /tmp/rootfs_b -f /tmp/firmware/rootfs.tar.bz2
+  echo "Unmount /tmp/rootfs_b" >> /tmp/FirmwareUpgrade.log
+  umount /tmp/rootfs_b
   echo "Detach rootfs_b patition from UBI - MTD device 9" >> /tmp/FirmwareUpgrade.log
   ubidetach /dev/ubi_ctrl -m 9
 else
@@ -98,23 +98,23 @@ else
     echo "finished" >> /tmp/FirmwareUpgrade.log
     exit 1
   fi
-  echo "Create derectory /mnt/rootfs_a" >> /tmp/FirmwareUpgrade.log
-  mkdir -p /mnt/rootfs_a
-  echo "Mount /mnt/rootfs_a with node ubi2:rootfs_a" >> /tmp/FirmwareUpgrade.log
-  if mount -t ubifs ubi2:rootfs_a /mnt/rootfs_a
+  echo "Create derectory /tmp/rootfs_a" >> /tmp/FirmwareUpgrade.log
+  mkdir -p /tmp/rootfs_a
+  echo "Mount /tmp/rootfs_a with node ubi2:rootfs_a" >> /tmp/FirmwareUpgrade.log
+  if mount -t ubifs ubi2:rootfs_a /tmp/rootfs_a
   then
-    echo "mount -t ubifs ubi2:rootfs_a /mnt/rootfs_a succeeded" >> /tmp/FirmwareUpgrade.log
+    echo "mount -t ubifs ubi2:rootfs_a /tmp/rootfs_a succeeded" >> /tmp/FirmwareUpgrade.log
   else
-    echo "mount -t ubifs ubi2:rootfs_a /mnt/rootfs_a failed" >> /tmp/FirmwareUpgrade.log
+    echo "mount -t ubifs ubi2:rootfs_a /tmp/rootfs_a failed" >> /tmp/FirmwareUpgrade.log
     echo "finished" >> /tmp/FirmwareUpgrade.log
     exit 1
   fi
   echo "" >> /tmp/FirmwareUpgrade.log
   echo "Writting rootfs... please wait" >> /tmp/FirmwareUpgrade.log
   echo "" >> /tmp/FirmwareUpgrade.log
-  tar -jxvm -C /mnt/rootfs_a -f /tmp/firmware/rootfs.tar.bz2
-  echo "Unmount /mnt/rootfs_a" >> /tmp/FirmwareUpgrade.log
-  umount /mnt/rootfs_a
+  tar -jxvm -C /tmp/rootfs_a -f /tmp/firmware/rootfs.tar.bz2
+  echo "Unmount /tmp/rootfs_a" >> /tmp/FirmwareUpgrade.log
+  umount /tmp/rootfs_a
   echo "Detach rootfs_b patition from UBI - MTD device 4" >> /tmp/FirmwareUpgrade.log
   ubidetach /dev/ubi_ctrl -m 4
 fi
@@ -134,21 +134,22 @@ then
     echo "finished" >> /tmp/FirmwareUpgrade.log
     exit 1
   fi
-  echo "Create derectory /mnt/config_b" >> /tmp/FirmwareUpgrade.log
-  mkdir -p /mnt/config_b
-  echo "Mount /mnt/config_b with node ubi2:config_b" >> /tmp/FirmwareUpgrade.log
-  if mount -t ubifs ubi2:config_b /mnt/config_b
+  echo "Create derectory /tmp/config_b" >> /tmp/FirmwareUpgrade.log
+  mkdir -p /tmp/config_b
+  echo "Mount /tmp/config_b with node ubi2:config_b" >> /tmp/FirmwareUpgrade.log
+  if mount -t ubifs ubi2:config_b /tmp/config_b
   then
-    echo "mount -t ubifs ubi2:config_b /mnt/config_b succeeded" >> /tmp/FirmwareUpgrade.log
+    echo "mount -t ubifs ubi2:config_b /tmp/config_b succeeded" >> /tmp/FirmwareUpgrade.log
   else
-    echo "mount -t ubifs ubi2:config_b /mnt/config_b failed" >> /tmp/FirmwareUpgrade.log
+    echo "mount -t ubifs ubi2:config_b /tmp/config_b failed" >> /tmp/FirmwareUpgrade.log
     echo "finished" >> /tmp/FirmwareUpgrade.log
     exit 1
   fi
   echo "Synchronize the config" >> /tmp/FirmwareUpgrade.log
-  cp -r /mnt/data/* /mnt/config_b/
-  echo "Unmount /mnt/config_b" >> /tmp/FirmwareUpgrade.log
-  umount /mnt/config_b
+  mkdir -p /tmp/config_b/data
+  cp -r /mnt/data/* /tmp/config_b/data
+  echo "Unmount /tmp/config_b" >> /tmp/FirmwareUpgrade.log
+  umount /tmp/config_b
   echo "Detach config_b device from UBI - MTD device 10" >> /tmp/FirmwareUpgrade.log
   ubidetach /dev/ubi_ctrl -m 10
 else
@@ -161,21 +162,22 @@ else
     echo "finished" >> /tmp/FirmwareUpgrade.log
     exit 1
   fi
-  echo "Create derectory /mnt/config_a" >> /tmp/FirmwareUpgrade.log
-  mkdir -p /mnt/config_a
-  echo "Mount /mnt/config_a with node ubi2:config_a" >> /tmp/FirmwareUpgrade.log
-  if mount -t ubifs ubi2:config_a /mnt/config_a
+  echo "Create derectory /tmp/config_a" >> /tmp/FirmwareUpgrade.log
+  mkdir -p /tmp/config_a
+  echo "Mount /tmp/config_a with node ubi2:config_a" >> /tmp/FirmwareUpgrade.log
+  if mount -t ubifs ubi2:config_a /tmp/config_a
   then
-    echo "mount -t ubifs ubi2:config_a /mnt/config_a succeeded" >> /tmp/FirmwareUpgrade.log
+    echo "mount -t ubifs ubi2:config_a /tmp/config_a succeeded" >> /tmp/FirmwareUpgrade.log
   else
-    echo "mount -t ubifs ubi2:config_a /mnt/config_a failed" >> /tmp/FirmwareUpgrade.log
+    echo "mount -t ubifs ubi2:config_a /tmp/config_a failed" >> /tmp/FirmwareUpgrade.log
     echo "finished" >> /tmp/FirmwareUpgrade.log
     exit 1
   fi
   echo "Synchronize the config" >> /tmp/FirmwareUpgrade.log
-  cp -r /mnt/data/* /mnt/config_a/
-  echo "Unmount /mnt/config_a" >> /tmp/FirmwareUpgrade.log
-  umount /mnt/config_a
+  mkdir -p /tmp/config_a/data
+  cp -r /mnt/data/* /tmp/config_a/data
+  echo "Unmount /tmp/config_a" >> /tmp/FirmwareUpgrade.log
+  umount /tmp/config_a
   echo "Detach config_a device from UBI - MTD device 5" >> /tmp/FirmwareUpgrade.log
   ubidetach /dev/ubi_ctrl -m 5
 fi
@@ -183,21 +185,8 @@ fi


 echo "" >> /tmp/FirmwareUpgrade.log
-echo "Change uboot env..." >> /tmp/FirmwareUpgrade.log
-if df | grep rootfs_a
-then
-  echo "The active firmware is a, switch to b" >> /tmp/FirmwareUpgrade.log
-  echo "Modify uboot env 'bootargs'" >> /tmp/FirmwareUpgrade.log
-  fw_setenv bootargs "console=ttymxc0,115200 ubi.mtd=9 root=ubi0:rootfs_b rootfstype=ubifs mtdparts=gpmi-nand:3m(boot),1m(boot_env),10m(kernel_a),2m(dtb_a),96m(rootfs_a),16m(config_a),4m(misc),10m(kernel_b),2m(dtb_b),96m(rootfs_b),-(config_b)"
-  echo "Modify uboot env 'bootcmd'" >> /tmp/FirmwareUpgrade.log
-  fw_setenv bootcmd "saveenv;nand read \${loadaddr} \${kernel_b_addr} 0x800000;nand read \${fdt_addr} \${dtb_b_addr} 0x100000;bootz \${loadaddr} - \${fdt_addr}"
-else
-  echo "The active firmware is b, switch to a" >> /tmp/FirmwareUpgrade.log
-  echo "Modify uboot env 'bootargs'" >> /tmp/FirmwareUpgrade.log
-  fw_setenv bootargs "console=ttymxc0,115200 ubi.mtd=4 root=ubi0:rootfs_a rootfstype=ubifs mtdparts=gpmi-nand:3m(boot),1m(boot_env),10m(kernel_a),2m(dtb_a),96m(rootfs_a),16m(config_a),4m(misc),10m(kernel_b),2m(dtb_b),96m(rootfs_b),-(config_b)"
-  echo "Modify uboot env 'bootcmd'" >> /tmp/FirmwareUpgrade.log
-  fw_setenv bootcmd "saveenv;nand read \${loadaddr} \${kernel_a_addr} 0x800000;nand read \${fdt_addr} \${dtb_a_addr} 0x100000;bootz \${loadaddr} - \${fdt_addr}"
-fi
+echo "Replace current primary application" >> /tmp/FirmwareUpgrade.log
+fw_setenv no_good .xx

因為 rootfs 改成 read-only 的關係, 從 /mnt/rootfs_x 改成 /tmp/rootfs_x

因為 M300 應用設定需要寫入的 folder 從原本的

  • /bin/mkdir -p /mnt/data
  • mount -t ubifs ubi1:config_a /mnt/data

改成

  • /bin/mkdir -p /mnt/data
  • /bin/mkdir -p /mnt/config
  • mount -t ubifs ubi1:config_a /mnt/config
  • /bin/mkdir -p /mnt/config/data
  • mount /mnt/config/data /mnt/data

所以在同步 primary 和 secondary application 的時候

從原本的

  • mkdir -p /mnt/config_x
  • mount -t ubifs ubi2:config_x /mnt/config_x
  • cp -r /mnt/data/* /mnt/config_x/
  • umount /mnt/config_x

改成

  • mkdir -p /tmp/config_x
  • mount -t ubifs ubi2:config_x /tmp/config_x
  • mkdir -p /tmp/config_x/data
  • cp -r /mnt/data/* /tmp/config_x/data
  • umount /tmp/config_x

因為修改了 uboot env 的關係

現在只要利用 fw_setenv no_good .xx 便可以讓下一次開機時交換 primary application

其實就是讓目前的 primary application 的 no_good counter 被記滿兩點

這樣下次開機就會被換掉了

1030

uboot_env.sh

#!/bin/bash
# uboot env



uboot_env_ver=1.0



if fw_printenv uboot_env_ver | grep $uboot_env_ver
then
  echo "uboot_env_ver $uboot_env_ver match, nothing to do"
  exit 0
else
  echo "uboot_env_ver not match, patching for the current applicaiton"
fi



# set the current uboot env version into uboot env MTD
fw_setenv uboot_env_ver $uboot_env_ver


# set nandread_a and nandread_b

fw_setenv nandread_a 'nand read ${loadaddr} ${kernel_a_addr} 0x800000; \
nand read ${fdt_addr} ${dtb_a_addr} 0x100000;'

fw_setenv nandread_b 'nand read ${loadaddr} ${kernel_b_addr} 0x800000; \
nand read ${fdt_addr} ${dtb_b_addr} 0x100000;'



# set bootargs_a and bootargs_b

fw_setenv bootargs_a 'echo bootargs for room a; \
setenv bootargs console=ttymxc0,115200 ubi.mtd=4 root=ubi0:rootfs_a rootfstype=ubifs mtdparts=gpmi-nand:3m(boot),1m(boot_env),10m(kernel_a),2m(dtb_a),96m(rootfs_a),16m(config_a),4m(misc),10m(kernel_b),2m(dtb_b),96m(rootfs_b),-(config_b)'

fw_setenv bootargs_b 'echo bootargs for room b; \
setenv bootargs console=ttymxc0,115200 ubi.mtd=9 root=ubi0:rootfs_b rootfstype=ubifs mtdparts=gpmi-nand:3m(boot),1m(boot_env),10m(kernel_a),2m(dtb_a),96m(rootfs_a),16m(config_a),4m(misc),10m(kernel_b),2m(dtb_b),96m(rootfs_b),-(config_b)'



# ======================================================================
# | dual image
# ======================================================================

fw_setenv no_good .


# according to the current running rootfs to set the primary app

if df | grep rootfs_a
then
  fw_setenv app_primary a
  fw_setenv app_secondary b
else
  fw_setenv app_primary b
  fw_setenv app_secondary a
fi


fw_setenv app_replace 'if test ${app_primary} = a; \
then echo a to b; setenv app_primary b; setenv app_secondary a; \
else echo b to a; setenv app_primary a; setenv app_secondary b; \
fi'

fw_setenv app_choose 'if test ${no_good} = ".xx"; \
then echo replace primary app; run app_replace; setenv no_good .; saveenv; \
else echo run primary app; \
fi'



# ======================================================================
# | bootcmd
# ======================================================================

# turn on the system LED first - shortest the bootdelay

fw_setenv bootdelay 1

fw_setenv bootcmd 'mw 0x020A0004 00100000 1; mw 0x020E01CC 0x00000005 1; \
run app_choose; \
echo run bootargs_${app_primary}; run bootargs_${app_primary}; \
run nandread_${app_primary}; \
setenv no_good ${no_good}x; saveenv; \
bootz ${loadaddr} - ${fdt_addr}'

1055

commit 時要寫什麼呢

  • now our dual image has failover ability
  • rootfs read-only ready - some icos module init fail

1130

git push... ok

1335

加了 gps 的 web page

搭配 google map 演出

因為只是 demo 性質所以目前目前並沒有搭配的 CGI

git commit

git push

1350

反正目前只是作展示

把預設的位置改到公司來

1440

use /bin/mkdir -p /home/log to make a dir since /home/log is not exit after fgtool flashing the firmware

@@ -65,6 +65,7 @@ echo 1 > /proc/sys/net/ipv4/ip_forward
# ======================================================================
/bin/mkdir -p /mnt/data
/bin/mkdir -p /mnt/config
/bin/mkdir -p /home/log

if df | grep rootfs_a
then

mfgtool flashing firmware 後是沒有 /home/log 的...

要注意阿...

不然 rc.local 就停在這邊導致系統起不來

⚠️ **GitHub.com Fallback** ⚠️