summaryrefslogtreecommitdiff
path: root/recipes-core/mlinux-scripts/mlinux-scripts/mlinux-firmware-upgrade
blob: a6e6d6869def6d47152a851b324db559a7764615 (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
#!/bin/bash
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 ! tar -xO -f $upgrade $file | md5sum -c $file.md5; then
            logger -s -t firmware_upgrade "MD5 check failed, upgrade aborted"
            exit 1
        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
    mv -f $upgrade /var/volatile/flash-upgrade/upgrade.bin
    touch "${dofile}"
    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
        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