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
|