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

is_valid_sled_num()
{
    var=$1
    if [[ $var =~ ^-?[0-9]+$ ]]; then
        if [ "$var" -ge 1 ] && [ "$var" -le 6 ]; then
            return 0
        fi
    fi
    return 1
}

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 spi1.0 > /sys/bus/spi/drivers/spi-nor/bind; then
        echo "Error: flash bind failed"
        return 1
    fi
    return 0
}

unbind_flash()
{
    echo -n spi1.0 > /sys/bus/spi/drivers/spi-nor/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 ! is_valid_sled_num "$SLED_INDEX"; then
    echo "Invalid sled number: $SLED_INDEX"
    echo "Usage: usb-controller-update <SLED_NUM>"
    echo ""
    echo "  SLED_NUM [1-6]"
    echo ""
    exit 1
fi

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