Signed-off-by: Dieter Pfeuffer <dieter.pfeuf...@men.de>
---
 scripts/men-mkfwupgrade.sh                         |  69 ++++++++
 target/linux/mpc85xx/base-files/lib/upgrade/men.sh | 188 +++++++++++++++++++++
 .../mpc85xx/base-files/lib/upgrade/platform.sh     |  10 +-
 3 files changed, 266 insertions(+), 1 deletion(-)
 create mode 100755 scripts/men-mkfwupgrade.sh
 create mode 100755 target/linux/mpc85xx/base-files/lib/upgrade/men.sh

diff --git a/scripts/men-mkfwupgrade.sh b/scripts/men-mkfwupgrade.sh
new file mode 100755
index 0000000..51f654e
--- /dev/null
+++ b/scripts/men-mkfwupgrade.sh
@@ -0,0 +1,69 @@
+#/bin/sh
+#
+# Copyright (c) 2016 MEN Mikro Elektronik GmbH
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+# 
+# Assemble individual sysupgrade image for MEN NM50 board. 
+#
+
+ME="${0##*/}"
+
+usage() {
+       echo "Usage: $ME <NM50> <upgrade bin> [-u <u-boot bin>] [-e <u-boot-env 
bin>] [-d <dtb bin>] [-k <kernel bin>] [-r <rootfs bin>]"
+       exit 1
+}
+
+[ "$#" -lt 4 ] && echo "*** to less arguments (at least one '-' option 
required)" && usage
+
+BOARD=$1
+BIN_OUT=$2
+
+case $BOARD in
+       NM50)
+               board=men_nm50
+               ;;
+       *)
+               echo "Error - unsupported board: $BOARD"
+               exit 1
+               ;;
+esac
+
+shift 2
+
+while [[ $# > 1 ]]
+do
+arg="$1"
+case $arg in
+    -u)
+    UBOOT="$2 u-boot"
+       shift
+    ;;
+    -e)
+    UBOOT_ENV="$2 u-boot-env"
+       shift
+    ;;
+    -d)
+    DTB="$2 dtb"
+       shift
+    ;;
+    -k)
+    KERNEL="$2 kernel"
+       shift
+    ;;
+    -r)
+    ROOTFS="$2 rootfs"
+       shift
+    ;;
+    *)
+               echo "Error - unsupported option: $arg"
+               usage
+               exit 1
+    ;;
+esac
+shift
+done
+
+$(dirname $0)/combined-ext-image.sh $board $BIN_OUT \
+       $UBOOT $UBOOT_ENV $DTB $KERNEL $ROOTFS 
diff --git a/target/linux/mpc85xx/base-files/lib/upgrade/men.sh 
b/target/linux/mpc85xx/base-files/lib/upgrade/men.sh
new file mode 100755
index 0000000..0fc214d
--- /dev/null
+++ b/target/linux/mpc85xx/base-files/lib/upgrade/men.sh
@@ -0,0 +1,188 @@
+#
+# Copyright (c) 2016 MEN Mikro Elektronik GmbH
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+# 
+# The MEN NM50 flash partitions can be individually updated with one combined
+# image file. The file header (64K) stores information about the target device,
+# the number of included binary files and for each included binary file, the
+# name of the dedicated partition, size and md5 checksum of the binary file.
+# Make creates an OpenWrt upgrade image (dtb + kernel + rootfs). Individual
+# upgrade images (e.g. for u-boot + kernel) can be created with the
+# men-mkfwupgrade.sh shell script. 
+# For detailed information of the combined image format, see the
+# combined-ext-image.sh shell script (used from mpc85xx/image/Makefile and
+# men-mkfwupgrade.sh).
+#
+
+trim()
+{
+       echo $1
+}
+
+platform_check_image_men()
+{
+       local img_magic=$1
+       local img_path=$2
+       local img_board_target= img_num_files=
+
+       case "$img_magic" in
+               # Combined Extended Image v1
+               43453031)
+                       img_board_target=$(trim $(dd if="$img_path" bs=4 skip=1 
count=8 2>/dev/null))
+                       img_num_files=$(trim $(dd if="$img_path" bs=2 skip=18 
count=1 2>/dev/null))
+                       ;;
+               *)
+                       echo "Invalid image ($img_magic). Use combined extended 
images on this platform."
+                       return 1
+                       ;;
+       esac
+
+       case "$img_board_target" in
+               men_nm50)
+                       eepromid=$(dd 
if=/sys/bus/i2c/drivers/at24/0-0054/eeprom bs=1 count=6 skip=9 2>/dev/null)
+                       ([ $eepromid != "SC29" ]) && {
+                               echo "Invalid board ($eepromid). Use the 
correct image for this platform."
+                               return 1
+                       }                                       
+                       ;;
+               *)
+                       echo "Invalid board target ($img_board_target). Use the 
correct image for this platform."
+                       return 1
+                       ;;
+       esac
+
+       # check number of files
+       ([ $img_num_files -lt 1 ] || [ $img_num_files -gt 8 ]) && {
+               echo "Invalid number of embedded images ($img_num_files). Use 
the correct image for this platform."
+               return 1
+       }
+
+       # further checking (no upgrade yet)
+       platform_do_upgrade_men 0 "$2" && return 0
+       return 1
+}
+
+platform_find_partition() {
+       local dev size erasesize name
+       while read dev size erasesize name; do
+               name=${name#'"'}; name=${name%'"'}
+               [ "$name" = "$1" ] && {
+                       echo "$dev$size:$erasesize:$name"
+                       return
+               }
+       done < /proc/mtd
+       echo "error"
+}
+
+platform_do_upgrade_men()
+{
+       local doit=$1 
+       local img_path=$2 
+       local data_offset=$((64 * 1024)) offset=
+       local img_num_files= part_name= part_size= data_size= data_md5=
+       local ret= i=0 calc_md5=
+       local magic= magic_of=
+
+       img_num_files=$(trim $(dd if="$img_path" bs=2 skip=18 count=1 
2>/dev/null))
+
+       offset=$data_offset
+       while [ "$i" -lt "$img_num_files" ]
+       do
+               part_name=$(trim $(dd if="$img_path" bs=2 skip=$((19 + i * 36)) 
count=16 2>/dev/null))
+               data_size=0x$(dd if="$img_path" bs=2 skip=$((35 + i * 36)) 
count=4 2>/dev/null)
+               data_md5=$(dd if="$img_path" bs=2 skip=$((39 + i * 36)) 
count=16 2>/dev/null)
+
+               ret=$(platform_find_partition $part_name)
+               [ $ret = "error" ] && {
+                       echo "Unknown partition name ($part_name) for this 
platform: $board. Use the correct image for this platform."
+                       return 1
+               }
+               
+               # further checking only 
+               if [ $doit = "0" ] 
+               then
+
+                       part_size=${ret#*:}
+                       part_size=0x${part_size%%:*}
+               
+                       # check if partition is accessible/writable
+                       mtd -n write /dev/null $part_name 2>&-
+                       if [ $? = 1 ]; then                     
+                               echo "Partition $part_name is not 
accessible/writable. Use the correct image for this platform."
+                               echo "Note: You may first need to perform an 
upgrade with an other image to make $part_name writable."
+                               return 1
+                       fi
+       
+                       # check file size
+                       [ $((data_size)) -gt $((part_size)) ] && {
+                               echo "Data size ($data_size) greater than 
partition size ($part_size) of partition $part_name. Use the correct image for 
this platform."
+                               return 1
+                       }
+
+                       # check md5
+                       calc_md5=$(dd if=$img_path bs=1 skip=$offset 
count=$((data_size)) 2>&- | md5sum)
+                       calc_md5=${calc_md5/-/}
+                       [ $calc_md5 != $data_md5 ] && {
+                               echo "Invalid md5 checksum (data_md5=$data_md5 
!= $calc_md5) for partition $part_name. Use the correct image for this 
platform."
+                               return 1
+                       }
+                       
+                       # check binary data
+                       # u-boot: +0x40: 424f 4f54
+                       # fdt: d00d feed
+                       # kernel: 2705 1956
+                       # rootfs: 6873 7173
+                       case $part_name in
+                       u-boot)
+                               magic_of=$((offset + 0x40))
+                               magic=0x424f4f54
+                               ;;      
+                       # todo: crc32 tool not available in OpenWrt and cksum 
computes a different CRC32 value
+                       #u-boot-env)
+                       #       magic_of=$offset
+                       #       magic=0x$(crc32 <(dd if="$img_path" bs=1 
skip=$((offset + 4)) count=$((data_size)) 2>&-))
+                       #       ;;      
+                       dtb)
+                               magic_of=$offset                        
+                               magic=0xd00dfeed
+                               ;;      
+                       kernel)
+                               magic_of=$offset                        
+                               magic=0x27051956
+                               ;;      
+                       rootfs)
+                               magic_of=$offset                        
+                               magic=0x68737173
+                               ;;      
+                       *)
+                               magic_of=0                      
+                               ;;
+                       esac                    
+                       
+                       if [ $magic_of != 0 ]
+                       then
+                               data_magic=0x$(xxd -s $magic_of -l 4 -g 4 -ps 
$img_path 2>&-)
+                               [ $data_magic != $magic ]  && {
+                                       echo "Invalid image 
(data_magic=$data_magic != $magic) for partition $part_name. Use the correct 
image for this platform."
+                                       return 1
+                               }
+                       fi                      
+                       
+               # upgrade only
+               else            
+                       if [ $part_name =  "rootfs" ] && [ -f "$CONF_TAR" -a 
"$SAVE_CONFIG" -eq 1 ]
+                       then
+                               dd if="$img_path" bs=1 skip=$offset 
count=$((data_size)) 2>&- | mtd $MTD_CONFIG_ARGS -j "$CONF_TAR" write - 
"$part_name"                        
+                       else
+                               dd if="$img_path" bs=1 skip=$offset 
count=$((data_size)) 2>&- | mtd $MTD_CONFIG_ARGS write - "$part_name"
+                       fi              
+               fi
+               
+               offset=$((offset + data_size))
+               i=$((i+1))
+       done    
+
+       return 0
+}
diff --git a/target/linux/mpc85xx/base-files/lib/upgrade/platform.sh 
b/target/linux/mpc85xx/base-files/lib/upgrade/platform.sh
index d95ec30..b693c05 100755
--- a/target/linux/mpc85xx/base-files/lib/upgrade/platform.sh
+++ b/target/linux/mpc85xx/base-files/lib/upgrade/platform.sh
@@ -58,6 +58,11 @@ platform_check_image() {
 
                return 0
                ;;
+               
+       men_nm50)
+               platform_check_image_men "$magic" "$1" && return 0
+               return 1
+               ;;              
        esac
 
        echo "Sysupgrade is not yet supported on $board."
@@ -67,7 +72,10 @@ platform_check_image() {
 platform_do_upgrade() {
        local board=$(mpc85xx_board_name)
 
-       case "$board" in
+       case $board in
+       men_nm50)
+               platform_do_upgrade_men 1 "$ARGV"
+               ;;      
        *)
                default_do_upgrade "$ARGV"
                ;;
-- 
1.9.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to