20170113_jeffrey - silenceuncrio/diary GitHub Wiki

Index

  • 0910 - 直接把 m300_v1.1_012C000000129880.tar 解開到 mfgtool 去燒錄程式
  • 1045 - uboot一開始就把系統燈點亮 - bootdelay 改短更好
  • 1515 - m300 週會 - Dual Images 結論 - 不要只給一次機會
  • 1715 - 搭配這一版的 uboot env 我們也要修正 FirmwareUpgrade.sh

0910

早上 morris 拿了 5 片 m300 麻煩我燒錄程式

這五片的 nand flash 都是空的

需要 mfgtool 來把前幾天準備好的 firmware 燒錄到 m300 的 nand flash 去

目前最新的 firmware - http://192.168.0.242/RD/M300/tags/v1.1

因應未來的需要 - http://192.168.0.242/RD/M300/commit/eb5615697a7e0510d3a6806e531a600c9398e19d

core-image-minimal-m300.tar.bz2 改成 rootfs.tar.bz2

因為 FirmwareUpgrade.sh 需要做因應修改的關係...

mfgtool 燒錄上去的 firmware 並沒有修改過的 FirmwareUpgrade.sh... 所以沒有辦法透過 web 來做 v1.1 的 firmware upgrade

直接 git checkout v1.1 自己做出適合 mfgtool 使用的 images... fail

| systemcfg.c: In function 'UpdateSystemInformation':
| systemcfg.c:434:17: warning: implicit declaration of function 'macaddr_get2' [-Wimplicit-function-declaration]
|                  macaddr_get2(LAN_IF_NAME,ethaddr);
|                  ^
| systemcfg.c:435:60: warning: too many arguments for format [-Wformat-extra-args]
|                  snprintf(pInfo->szMac,sizeof(pInfo->szMac),"%02x:%02x:%02x:%02x:%02x:%02x",
|                                                             ^
| systemcfg.c:435:60: warning: too many arguments for format [-Wformat-extra-args]
| systemcfg.c:492:39: error: 'GIT_HASH' undeclared (first use in this function)
|      sprintf(pInfo->szSwVersion, "%s", GIT_HASH);
|                                        ^
| systemcfg.c:492:39: note: each undeclared identifier is reported only once for each function it appears in
| make[4]: *** [systemcfg.o] Error 1
| make[4]: Leaving directory `/var/m300/proscend/prosrc/icos/icoslib/system'
| make[3]: *** [system] Error 2
| make[3]: Leaving directory `/var/m300/proscend/prosrc/icos/icoslib'
| make[2]: *** [default] Error 2
| make[2]: Leaving directory `/var/m300/proscend/prosrc/icos'
| make[1]: *** [icos] Error 2
| make[1]: Leaving directory `/var/m300/proscend/prosrc'
| make: *** [all] Error 2
| WARNING: exit code 1 from a shell command.
| ERROR: oe_runmake failed
| ERROR: Function failed: do_compile (log file is located at /var/m300/build_small/tmp/work/cortexa7hf-vfp-neon-poky-linux-gnueabi/prosrc/0.1-r0/temp/log.do_compile.732)
ERROR: Task 340 (/var/m300/meta-proscend/recipes-core/prosrc/prosrc_0.1.bb, do_compile) failed with exit code '1'

算了... 直接把 m300_v1.1_012C000000129880.tar 解開

把需要的 file 放到 mfgtool 去

修改 ucl2.xml - rootfs.tar.bz2

<UCL>
  <CFG>
    <STATE name="BootStrap" dev="MX6SL" vid="15A2" pid="0063"/>
    <STATE name="BootStrap" dev="MX6D" vid="15A2" pid="0061"/>
    <STATE name="BootStrap" dev="MX6Q" vid="15A2" pid="0054"/>
    <STATE name="BootStrap" dev="MX6SX" vid="15A2" pid="0071"/>
    <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
    <STATE name="BootStrap" dev="MX7D" vid="15A2" pid="0076"/>
    <STATE name="Updater"   dev="MSC" vid="066F" pid="37FF"/>
  </CFG>

  <LIST name="NAND Flash" desc="Choose NAND as media">

  <CMD state="BootStrap" type="boot" 
    body="BootStrap" file ="firmware/u-boot.imx">Loading U-boot</CMD>
  <CMD state="BootStrap" type="load" 
    file="firmware/zImage" address="0x80800000" 
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" >Loading Kernel.</CMD>
  <CMD state="BootStrap" type="load" 
    file="firmware/%initramfs%" address="0x83800000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE">Loading Initramfs.</CMD>
  <CMD state="BootStrap" type="load" 
    file="firmware/zImage-imx6ul-%6uldtb%-%nanddtb%.dtb" address="0x83000000"
    loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE">Loading device tree.</CMD>
  <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>

  <!--burn the uboot to NAND: --> 
  <CMD state="Updater" type="push" 
    body="$ mount -t debugfs debugfs /sys/kernel/debug">Mounting debugfs</CMD>
  <CMD state="Updater" type="push" 
    body="$ flash_erase /dev/mtd0 0 0">Erasing Boot partition</CMD>
  <CMD state="Updater" type="push" 
    body="$ flash_erase /dev/mtd1 0 0">Erasing Boot env partition</CMD>
  <CMD state="Updater" type="push" 
    body="send" file="files/u-boot.imx" ifdev="MX6UL">Sending u-boot.bin</CMD>
  <CMD state="Updater" type="push" 
    body="$ kobs-ng init -x -v --chip_0_device_path=/dev/mtd0 $FILE">Flashing Bootloader</CMD>

  <!--burn the kernel to NAND: -->
  <CMD state="Updater" type="push" 
    body="$ flash_erase /dev/mtd2 0 0">Erasing Kernel partition</CMD>
  <CMD state="Updater" type="push" 
    body="send" file="files/zImage">Sending kernel zImage</CMD>
  <CMD state="Updater" type="push" 
    body="$ nandwrite -p /dev/mtd2 -p $FILE">Flashing Kernel</CMD>
  <CMD state="Updater" type="push" 
    body="$ flash_erase /dev/mtd3 0 0">Erasing dtb partition</CMD>
  <CMD state="Updater" type="push" 
    body="send" file="files/zImage-imx6ul-14x14-evk.dtb">Sending Device Tree file</CMD>
  <CMD state="Updater" type="push" 
    body="$ nandwrite -p /dev/mtd3 -p $FILE">Flashing dtb</CMD>



  <!--prepare all ubi device: -->

  <CMD state="Updater" type="push" 
    body="$ flash_erase /dev/mtd4 0 0">Erasing rootfs_a partition</CMD>
  <CMD state="Updater" type="push" 
    body="$ flash_erase /dev/mtd5 0 0">Erasing config_a partition</CMD>
  <CMD state="Updater" type="push" 
    body="$ flash_erase /dev/mtd9 0 0">Erasing rootfs_b partition</CMD>
  <CMD state="Updater" type="push" 
    body="$ flash_erase /dev/mtd10 0 0">Erasing config_b partition</CMD>

  <CMD state="Updater" type="push" 
    body="$ ubiformat /dev/mtd4"/>
  <CMD state="Updater" type="push" 
    body="$ ubiformat /dev/mtd5"/>
  <CMD state="Updater" type="push" 
    body="$ ubiformat /dev/mtd9"/>
  <CMD state="Updater" type="push" 
    body="$ ubiformat /dev/mtd10"/>

  <CMD state="Updater" type="push" 
    body="$ ubiattach /dev/ubi_ctrl -m 4">Attaching UBI partition - /dev/ubi0</CMD>
  <CMD state="Updater" type="push" 
    body="$ ubiattach /dev/ubi_ctrl -m 5">Attaching UBI partition - /dev/ubi1</CMD>
  <CMD state="Updater" type="push" 
    body="$ ubiattach /dev/ubi_ctrl -m 9">Attaching UBI partition - /dev/ubi2</CMD>
  <CMD state="Updater" type="push" 
    body="$ ubiattach /dev/ubi_ctrl -m 10">Attaching UBI partition - /dev/ubi3</CMD>

  <CMD state="Updater" type="push" 
    body="$ ubimkvol /dev/ubi0 -N rootfs_a -m"/>
  <CMD state="Updater" type="push" 
    body="$ ubimkvol /dev/ubi1 -N config_a -m"/>
  <CMD state="Updater" type="push" 
    body="$ ubimkvol /dev/ubi2 -N rootfs_b -m"/>
  <CMD state="Updater" type="push" 
    body="$ ubimkvol /dev/ubi3 -N config_b -m"/>

  <!--burn the rootfs_a to NAND: -->
  <CMD state="Updater" type="push" 
    body="$ mkdir -p /mnt/rootfs_a"/>
  <CMD state="Updater" type="push" 
    body="$ mount -t ubifs ubi0:rootfs_a /mnt/rootfs_a"/>
  <CMD state="Updater" type="push" 
    body="pipe tar -jxv -C /mnt/rootfs_a" file="files/rootfs.tar.bz2">Sending and writting rootfs_a</CMD>
  <CMD state="Updater" type="push" 
    body="frf">Finishing rootfs write</CMD>
  <CMD state="Updater" type="push" 
    body="$ umount /mnt/rootfs_a">Unmounting rootfs_a partition</CMD>
  <CMD state="Updater" type="push" 
    body="$ echo Update Complete!">Done</CMD>

  </LIST>

</UCL>

1045

來幫忙一開始就把 m300 的系統燈點亮

參考 meta-proscend\recipes-kernel\linux\files\m300_ra2_io.patch

+    gpio-leds {
+        compatible = "gpio-leds";
+        pinctrl-names = "default";
+
+        sys {
+            label = "sys-status";
+            gpios = <&gpio2 20 1>;
+            linux,default-trigger = "timer";
+        };
+
+        vpn {
+            label = "vpn";
+            gpios = <&gpio2 16 1>;
+        };
+
+        rssi-m {
+            label = "rssi-m";
+            gpios = <&gpio4 22 1>;
+        };
+
+        rssi-l {
+            label = "rssi-l";
+            gpios = <&gpio2 19 1>;
+        };
+
+        sim-1 {
+            label = "sim-1";
+            gpios = <&gpio2 21 1>;
+        };
+
+        sim-2 {
+            label = "sim-2";
+            gpios = <&gpio2 18 1>;
+        };
+
+        alarm {
+            label = "alarm";
+            gpios = <&gpio5 2 1>;
+        };
+    };
 };

再參考 https://github.com/silenceuncrio/diary/wiki/20160727_jeffrey

得知要參考 i.MX 6UltraLite Applications Processor Reference Manual

其中的 26.2 External SignalsTable 26-1. GPIO External Signals

sys 這顆燈在該 table 描述如下

Instance Signal Pad Mode
GPIO2 IO20 SD1_DATA2 ALT5

理論上用以下的 uboot command 就能點燈了

  • GPIO2_GDIR - mw 0x020A0004 00100000 1
  • SW_MUX_CTL_PAD_SD1_DATA2 - mw 0x020E01CC 0x00000005 1

寫在 uboot env 裡的 bootcmd

從這樣

=> printenv bootcmd
bootcmd=saveenv;nand read ${loadaddr} ${kernel_b_addr} 0x800000;nand read ${fdt_addr} ${dtb_b_addr} 0x100000;bootz ${loadaddr} - ${fdt_addr}

寫成這樣

=> printenv bootcmd
bootcmd=mw 0x020A0004 00100000 1; mw 0x020E01CC 0x00000005 1; saveenv;nand read ${loadaddr} ${kernel_b_addr} 0x800000;nand read ${fdt_addr} ${dtb_b_addr} 0x100000;bootz ${loadaddr} - ${fdt_addr}

如果 bootdelay 能配合改短就更好了

1515

今天早上沒有會議室可以用

所以 m300 週會挪到下午開 剛剛才開完

針對 Proposal - Dual Images(Code Redundancy) 有個結論

  • 不要只給一次機會沒開起來就做 replace primary 的動作

修改了 proposal

有整理出實際可行的 uboot env

=> printenv
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
app_primary=b
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
app_secondary=a
baudrate=115200
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)
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)
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)
bootcmd=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}
bootcmd_mfg=run mfgtool_args;bootz ${loadaddr} ${initrd_addr} ${fdt_addr};
bootdelay=3
console=ttymxc0
dtb_a_addr=0x00E00000
dtb_b_addr=0x08E00000
ethact=FEC1
ethprime=FEC
fdt_addr=0x83000000
fdt_high=0xffffffff
initrd_addr=0x83800000
initrd_high=0xffffffff
kernel_a_addr=0x00400000
kernel_b_addr=0x08400000
loadaddr=0x80800000
mfgtool_args=setenv bootargs console=${console},${baudrate} rdinit=/linuxrc g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF g_mass_storage.iSerialNumber="" 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)
nandread_a=nand read ${loadaddr} ${kernel_a_addr} 0x800000;nand read ${fdt_addr} ${dtb_a_addr} 0x100000;
nandread_b=nand read ${loadaddr} ${kernel_b_addr} 0x800000;nand read ${fdt_addr} ${dtb_b_addr} 0x100000;
no_good=.
panel=TFT43AB

Environment size: 2316/1048572 bytes
=>

application 記得使用 fw_setenv no_good . 來 reset no_good counter

否則集滿兩張就要被換掉了

1715

搭配這一版的 uboot env

我們也要修正 FirmwareUpgrade.sh

把原本的

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 "" >> /tmp/FirmwareUpgrade.log
echo "Replace current primary application" >> /tmp/FirmwareUpgrade.log
fw_setenv no_good .xx

就是讓目前的 primary application 自願集滿兩張 no_good 來讓 u-boot 把它換掉

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