summaryrefslogtreecommitdiff
path: root/meta-facebook/meta-bletchley/recipes-bletchley/fw-update/fw-update/usb-controller-update
blob: 1a1849733e6d1eece2ffe6e2397dd832cd617e03 (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
#!/bin/bash

set_gpio()
{
    local pin_info
    read -r -a pin_info < <(gpiofind "$1")
    gpioset "${pin_info[0]}" "${pin_info[1]}"="$2"
}

bind_flash()
{
    local sled_index=$1

    if [ "$sled_index" -eq 1 ]; then
        set_gpio SEL_SPI2_MUX 0
        set_gpio SPI2_MUX1 0
        set_gpio SPI2_MUX2 1
        set_gpio SPI2_MUX3 1
    elif [ "$sled_index" -eq 2 ]; then
        set_gpio SEL_SPI2_MUX 1
        set_gpio SPI2_MUX1 0
        set_gpio SPI2_MUX2 1
        set_gpio SPI2_MUX3 1
    elif [ "$sled_index" -eq 3 ]; then
        set_gpio SEL_SPI2_MUX 0
        set_gpio SPI2_MUX1 1
        set_gpio SPI2_MUX2 0
        set_gpio SPI2_MUX3 1
    elif [ "$sled_index" -eq 4 ]; then
        set_gpio SEL_SPI2_MUX 1
        set_gpio SPI2_MUX1 1
        set_gpio SPI2_MUX2 0
        set_gpio SPI2_MUX3 1
    elif [ "$sled_index" -eq 5 ]; then
        set_gpio SEL_SPI2_MUX 0
        set_gpio SPI2_MUX1 1
        set_gpio SPI2_MUX2 1
        set_gpio SPI2_MUX3 0
    elif [ "$sled_index" -eq 6 ]; then
        set_gpio SEL_SPI2_MUX 1
        set_gpio SPI2_MUX1 1
        set_gpio SPI2_MUX2 1
        set_gpio SPI2_MUX3 0
    else
        echo "Error: Invalid sled index $sled_index"
        return 1
    fi

    if ! echo -n 1e631000.spi > /sys/bus/platform/drivers/aspeed-smc/bind; then
        echo "Error: flash bind failed"
        return 1
    fi
    return 0
}

unbind_flash()
{
    echo -n 1e631000.spi > /sys/bus/platform/drivers/aspeed-smc/unbind
    set_gpio SEL_SPI2_MUX 1
    set_gpio SPI2_MUX1 1
    set_gpio SPI2_MUX2 1
    set_gpio SPI2_MUX3 1
    return 0
}

findmtd()
{
    m=$(grep -xl "$1" /sys/class/mtd/*/name)
    m=${m%/name}
    m=${m##*/}
    echo "$m"
}

error_cleanup()
{
    unbind_flash
    exit 1
}


SLED_INDEX=$1
IMAGE_FILE="/run/initramfs/image-usb"
MTD_NAME="pnor"
FLASH_CP_CMD="/usr/sbin/flashcp"
FLASH_ERASEALL_CMD="/usr/sbin/flash_eraseall"


if ! bind_flash "$SLED_INDEX"; then
    error_cleanup
fi

sleep 1

pnormtd="$(findmtd $MTD_NAME)"
if test -z "$pnormtd"; then
    echo "Error: can not find pnor mtd device"
    error_cleanup
fi

sleep 1

MTD_NODE_PATH="/dev/$pnormtd"
if [ ! -c  "$MTD_NODE_PATH" ]; then
    echo "Error: /dev/$pnormtd device node not exist"
    error_cleanup
fi

echo "Bind mtd node success, path: $MTD_NODE_PATH"
sleep 1

$FLASH_ERASEALL_CMD "$MTD_NODE_PATH" || error_cleanup
echo "Erase flash block done"
sleep 1

$FLASH_CP_CMD -v $IMAGE_FILE "$MTD_NODE_PATH" || error_cleanup
echo "Write firmware image done"
sync
sleep 1

unbind_flash
exit 0