summaryrefslogtreecommitdiff
path: root/recipes-core/mlinux-scripts/mlinux-scripts/mlinux-firmware-upgrade
blob: 55683579449e3eafed58c87220b62c184bf290d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash
PERSISTENT_DIR="/var/persistent/"
ERASE_PERSISTENT="${PERSISTENT_DIR}/mts_do_erase_persistent"
dofile=/var/volatile/do_flash_upgrade
dofactoryreset=0
id=$(id -u)
function usage {
    echo "Usage: $0 -f upgrade.bin"
    echo "                              \"-f\" factory reset"
    echo "                              \"-h\" help"
    exit 1
}
if (($(id -u) != 0)) ; then
    echo "You must be root to do a flash upgrade"
    exit 1
fi
while getopts "hf" arg; do
  case $arg in
    h)
      usage
      exit 1
      ;;
    f)
      mtd=$(cat /proc/mtd)
      if ! [[ $mtd =~ at91bootstrap ]] ; then
          echo Factory reset option is only supported on Atmel devices
          exit 1
      fi
      dofactoryreset=1
      ;;
    *)
      usage
      ;;
  esac
done
shift $((OPTIND-1))


if [ $# != 1 ]; then
    usage
fi

set -e
upgrade=$1

mkdir -p /var/volatile
cd /var/volatile

# make sure firmware is for this device
hw_version=$(cat /sys/devices/platform/mts-io/hw-version)
firmware_model=$(tar -xO -f $upgrade model)
shopt -s nocasematch
if [[ ! "$hw_version" =~ ^$firmware_model- ]]; then
    logger -s -t firmware_upgrade "Wrong firmware for this hardware"
    logger -s -t firmware_upgrade "hw version: $hw_version"
    logger -s -t firmware_upgrade "firmware model: $firmware_model"
    exit 1
fi

files=(bstrap.bin uboot.bin uImage.bin config.jffs2 oem.jffs2 rootfs.jffs2 install.sh)

tobeflashed=0
# verify all MD5 sums
for (( i = 0; i < ${#files[@]}; i++ )); do
    file=${files[i]}
    # if the file is in the tar, md5sum it
    if tar -t -f $upgrade | grep -F -q "$file"; then
        logger -s -t firmware_upgrade "Checking MD5 for $file..."
        if ! tar -x -f $upgrade $file.md5; then
            logger -s -t firmware_upgrade "MD5 is not found for the $file, upgrade aborted"
            exit 1
        fi
        if ((dofactoryreset == 0)) ; then
            if ! tar -xO -f $upgrade $file | md5sum -c $file.md5; then
                logger -s -t firmware_upgrade "MD5 check failed, upgrade aborted"
                exit 1
            fi
        fi
        tobeflashed=1
    fi
done

if (( $tobeflashed )); then
    if ((dofactoryreset == 1)) ; then
        for name in "u-Boot Config" "u-Boot Redundant Config" ; do
            part=$(echo "$mtd" | grep "$name" | sed 's/:.*//')
            if [[ $part =~ ^mtd[0-9] ]] ; then
                flash_erase /dev/${part} 0 0
            fi
        done
        fuser -mk /var/config || true
        for name in "User data" "Config" ; do
            part=$(echo "$mtd" | grep "\"$name\"" | sed 's/:.*//')
            num=$(echo "$part" | sed 's/mtd//')
            if [[ $part =~ ^mtd[0-9] ]] ; then
                umount -l /dev/mtdblock${num} || true
                flash_erase -j /dev/${part} 0 0
            fi
        done
    fi
    mkdir -p /var/volatile/flash-upgrade
    newbinfile=/var/volatile/flash-upgrade/upgrade.bin
    mv -f $upgrade $newbinfile
    if ((dofactoryreset == 1)) ; then
        tar -xO -f "${newbinfile}" do_flash_upgrade >"$dofile"
    else
        touch "$dofile"
    fi
    chown "root:root" "${dofile}" || true
    uid=$(stat -c %u "${dofile}") || true
    result=$?
    if ((result != 0)) ; then
        logger -s -t firmware_upgrade "Cannot create ${dofile}"
        exit 1
    fi
    if ((uid != 0)) ; then
        logger -s -t firmware_upgrade "Cannot set ownership of ${dofile} to root"
        exit 1
    fi
    if ((dofactoryreset == 1)) ; then
        logger -s -t firmware_upgrade "Power Off"
        sleep 1
        poweroff
    else
        ((KEEP_PERSISTENT)) || touch "$ERASE_PERSISTENT"
        logger -s -t firmware_upgrade "Rebooting"
        sleep 1
        reboot
    fi
    # NOTREACHED
    exit 0
else
    logger -s -t firmware_upgrade "Nothing to be flashed!"
    exit 1
fi