summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-common/recipes-core/fw-update/files/fwupd.sh
blob: dd3b7f69a903aba7b994c6d081a989d7407f34c1 (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
#!/bin/sh

SSH_ID=$HOME/.ssh/id_rsa.db
[ -e $HOME/.fwupd.defaults ] && source $HOME/.fwupd.defaults

usage() {
        echo "usage: $(basename $0) uri"
        echo "       uri is something like: file:///path/to/fw"
        echo "                              tftp://tftp.server.ip.addr/path/to/fw"
        echo "                              scp://[user@]scp.server.ip.addr:/path/to/fw"
        echo "                              http[s]://web.server.ip.addr/path/to/fw"
        echo "                              ftp://[user@]ftp.server.ip.addr/path/to/fw"
        exit 1
}

if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then usage; fi
if [ $# -eq 0 ]; then
	# set DEFURI in $HOME/.fwupd.defaults
    URI="$DEFURI"
else
    URI="$1"
fi

PROTO=$(echo "$URI" | sed 's,\([a-z]*\)://.*$,\1,')
REMOTE=$(echo "$URI" | sed 's,.*://\(.*\)$,\1,')
REMOTE_HOST=$(echo "$REMOTE" | sed 's,\([^/]*\)/.*$,\1,')
if [ "$PROTO" = 'scp' ]; then
    REMOTE_PATH=$(echo "$REMOTE" | cut -d':' -f2)
else
    REMOTE_PATH=$(echo "$REMOTE" | sed 's,[^/]*/\(.*\)$,\1,')
fi
LOCAL_PATH="/tmp/$(basename $REMOTE_PATH)"
echo "PROTO=$PROTO"
echo "REMOTE=$REMOTE"
echo "REMOTE_HOST=$REMOTE_HOST"
echo "REMOTE_PATH=$REMOTE_PATH"
if [ ! -e $LOCAL_PATH ] || [ $(stat -c %s $LOCAL_PATH) -eq 0 ]; then
    echo "Download '$REMOTE_PATH' from $PROTO $REMOTE_HOST $REMOTE_PATH"
    case "$PROTO" in
        scp)
            mkdir -p $HOME/.ssh
            if [ -e "$SSH_ID" ]; then
                ARG_ID="-i $SSH_ID"
            fi
            scp $ARG_ID $REMOTE_HOST$REMOTE_PATH $LOCAL_PATH
            if [ $? -ne 0 ]; then
                echo "scp $REMOTE $LOCAL_PATH failed!"
                exit 255
            fi
            ;;
        tftp)
            cd /tmp
            tftp -g -r "$REMOTE_PATH" "$REMOTE_HOST"
            if [ $? -ne 0 ]; then
                echo "tftp -g -r \"$REMOTE_PATH\" \"$REMOTE_HOST\" failed!"
                exit 255
            fi
            ;;
        http|https|ftp)
            wget --no-check-certificate "$URI" -O "$LOCAL_PATH"
            if [ $? -ne 0 ]; then
                echo "wget $URI failed!"
                exit 255
            fi
            ;;
        file)
            cp "$REMOTE_PATH" "$LOCAL_PATH"
            ;;
        *)
            echo "Invalid URI $URI"
            exit 1;
            ;;
    esac
fi

# do a quick sanity check on the image
if [ $(stat -c "%s" "$LOCAL_PATH") -lt 10000000 ]; then
    echo "Update file "$LOCAL_PATH" seems to be too small"
    exit 1
fi
dtc -I dtb -O dtb "$LOCAL_PATH" > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "Update file $LOCAL_PATH doesn't seem to be in the proper format"
    exit 1
fi

#this file being created at build time for PFR images
#TODO: Need to do runtime detection of PFR platform
#TODO: Also to check if PFR is provisioned or not
if [ -e /usr/share/pfr ]
then
TGT="/dev/mtd/image-stg"
echo "Updating $(basename $TGT)"
flash_erase $TGT 0 0
echo "Writing $(stat -c "%s" "$LOCAL_PATH") bytes"
cat "$LOCAL_PATH" > "$TGT"
#TODO: Add I2C command to write to PFRCPLD about BMC update intent.
else
# guess based on fw_env which partition we booted from
BOOTADDR=$(fw_printenv bootcmd | awk '{print $2}')

TGT="/dev/mtd/image-a"
case "$BOOTADDR" in
	20080000) TGT="/dev/mtd/image-b"; BOOTADDR="22480000" ;;
	22480000) TGT="/dev/mtd/image-a"; BOOTADDR="20080000" ;;
	*)        TGT="/dev/mtd/image-a"; BOOTADDR="20080000" ;;
esac
echo "Updating $(basename $TGT) (use bootm $BOOTADDR)"
flash_erase $TGT 0 0
echo "Writing $(stat -c "%s" "$LOCAL_PATH") bytes"
cat "$LOCAL_PATH" > "$TGT"
fw_setenv "bootcmd" "bootm ${BOOTADDR}"

# reboot
reboot
fi