hc
2024-03-22 f63cd4c03ea42695d5f9b0e1798edd196923aae6
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
if itest.s a$uboot_defconfig == a; then
        echo "Please set uboot_defconfig to the appropriate value"
        exit
fi
 
offset=0x400
erase_size=0xC0000
qspi_offset=0x0
a_base=0x12000000
block_size=0x200
 
#grab 1st 2/3 characters of string
setexpr cpu2 sub "^(..?).*" "\\1" "${imx_cpu}"
setexpr cpu3 sub "^(..?.?).*" "\\1" "${imx_cpu}"
if itest.s x51 == "x${cpu2}"; then
   a_base=0x92000000
elif itest.s x53 == "x${cpu2}"; then
   a_base=0x72000000
elif itest.s x6SX == "x${cpu3}" || itest.s x6U == "x${cpu2}" || itest.s x7D == "x${cpu2}"; then
   a_base=0x82000000
elif itest.s x8M == "x${cpu2}"; then
   a_base=0x42000000
   offset=0x8400
   if itest.s x8MN == "x${cpu3}" || itest.s x8MP == "x${cpu3}"; then
       offset=0x8000
       if itest ${env_part} != 0 ; then
           offset=0x0
       fi
   fi
fi
 
qspi_match=1
setexpr a_qspi1 ${a_base}
setexpr a_qspi2 ${a_qspi1} + 0x400000
setexpr a_uImage1 ${a_qspi1} + 0x400
setexpr a_uImage2 ${a_qspi2} + 0x400
setexpr a_script ${a_base}
 
if itest.s "x${vidconsole}" == "x" ; then
   vidconsole=vga
fi
setenv stdout serial,${vidconsole}
 
if itest.s "x${sfname}" == "x" ; then
# U-Boot resides in (e)MMC
if itest.s "x${env_dev}" == "x" || itest.s "x${env_part}" == "x"; then
        echo "Please set env_dev/part to the appropriate values"
        exit
fi
 
# Load bootloader binary for this board
if ${fs}load ${devtype} ${devnum}:${distro_bootpart} ${a_uImage1} u-boot.$uboot_defconfig ; then
else
   echo "File u-boot.$uboot_defconfig not found on SD card" ;
   exit
fi
 
# Compute block count for filesize and offset
setexpr cntoffset ${offset} / ${block_size}
setexpr cntfile ${filesize} / ${block_size}
# Add 1 in case the $filesize is not a multiple of $block_size
setexpr cntfile ${cntfile} + 1
 
# Select media partition (if different from main partition)
mmc dev ${env_dev} ${env_part}
 
# Read and compare current U-Boot
mmc read ${a_uImage2} ${cntoffset} ${cntfile}
if cmp.b ${a_uImage1} ${a_uImage2} ${filesize} ; then
   echo "------- U-Boot versions match" ;
   echo "------- U-Boot upgrade NOT needed" ;
   exit ;
fi
 
echo "Need U-Boot upgrade" ;
echo "Program in 5 seconds" ;
for n in 5 4 3 2 1 ; do
   echo $n ;
   sleep 1 ;
done
mmc write ${a_uImage1} ${cntoffset} ${cntfile}
 
# Make sure to boot from the proper partition
if itest ${env_part} != 0 ; then
   mmc partconf ${env_dev} 1 ${env_part} 0
fi
 
# Switch back to main eMMC partition (to avoid confusion)
mmc dev ${env_dev}
 
else
# U-Boot resides in NOR flash
if sf probe || sf probe || sf probe 1 27000000 || sf probe 1 27000000 ; then
   echo "probed SPI ROM" ;
else
   echo "Error initializing EEPROM"
   exit
fi
 
if itest.s "x${sfname}" == "xat45db041d" ; then
   erase_size=0x7e000
fi
 
if itest.s x7D == "x${imx_cpu}"; then
   echo "check qspi parameter block" ;
   if ${fs}load ${devtype} ${devnum}:${distro_bootpart} ${a_qspi1} qspi-${sfname}.${uboot_defconfig} ; then
   else
       echo "parameter file qspi-${sfname}.${uboot_defconfig} not found on SD card"
       exit
   fi
   if itest ${filesize} != 0x200 ; then
       echo "------- qspi-${sfname}.${uboot_defconfig} 0x${filesize} != 0x200 bytes" ;
       exit
   fi
   setexpr a_marker ${a_qspi1} + 0x1fc
   if itest *${a_marker} != c0ffee01 ; then
       echo "------- qspi-${sfname}.${uboot_defconfig} c0ffee01 marker missing" ;
       exit
   fi
   if sf read ${a_qspi2} ${qspi_offset} 0x200 ; then
   else
       echo "Error reading qspi parameter from EEPROM"
       exit
   fi
   if cmp.b ${a_qspi1} ${a_qspi2} 0x200 ; then
       echo "------- qspi parameters match"
   else
       echo "------- qspi parameters mismatch"
       qspi_match=0
   fi
fi
 
echo "check U-Boot" ;
 
if ${fs}load ${devtype} ${devnum}:${distro_bootpart} ${a_uImage1} u-boot.$uboot_defconfig ; then
else
   echo "File u-boot.$uboot_defconfig not found on SD card" ;
   exit
fi
echo "read $filesize bytes from SD card" ;
if sf read ${a_uImage2} $offset $filesize ; then
else
   echo "Error reading boot loader from EEPROM" ;
   exit
fi
 
if cmp.b ${a_uImage1} ${a_uImage2} $filesize ; then
   echo "------- U-Boot versions match" ;
   if itest.s "${qspi_match}" == "1" ; then
       echo "------- U-Boot upgrade NOT needed" ;
       if itest.s "x" != "x${next}" ; then
           if ${fs}load ${devtype} ${devnum}:${distro_bootpart} ${a_script} ${next} ; then
               source ${a_script}
           else
               echo "${next} not found on SD card"
           fi
       fi
       exit
   fi
   erase_size=0x1000
   if itest.s xMX25L6405D == "x${sfname}"; then
       erase_size=0x10000
   fi
   setexpr filesize ${erase_size} - ${offset}
fi
 
echo "Need U-Boot upgrade" ;
echo "Program in 5 seconds" ;
for n in 5 4 3 2 1 ; do
   echo $n ;
   sleep 1 ;
done
echo "erasing" ;
sf erase 0 ${erase_size} ;
 
# two steps to prevent bricking
echo "programming" ;
setexpr a1 ${a_uImage1} + 0x400
setexpr o1 ${offset} + 0x400
setexpr s1 ${filesize} - 0x400
sf write ${a1} ${o1} ${s1} ;
sf write ${a_uImage1} $offset 0x400 ;
 
if itest.s x7D == "x${imx_cpu}"; then
   sf write ${a_qspi1} ${qspi_offset} 0x200
fi
 
echo "verifying" ;
if sf read ${a_uImage2} $offset $filesize ; then
else
   echo "Error re-reading EEPROM" ;
   exit
fi
if cmp.b ${a_uImage1} ${a_uImage2} $filesize ; then
else
   echo "Read verification error" ;
   exit
fi
 
if itest.s x7D == "x${imx_cpu}"; then
   if sf read ${a_qspi2} ${qspi_offset} 0x200 ; then
   else
       echo "Error re-reading qspi" ;
       exit
   fi
   if cmp.b ${a_qspi1} ${a_qspi2} 0x200 ; then
   else
       echo "qspi parameter block verification error" ;
       exit
   fi
fi
 
if itest.s "x" != "x${next}" ; then
   if ${fs}load ${devtype} ${devnum}:${distro_bootpart} ${a_script} ${next} ; then
       source ${a_script}
   else
       echo "${next} not found on ${devtype} ${devnum}:${distro_bootpart}"
   fi
fi
fi
 
if itest.s "xno" == "x${reset}" ; then
   while echo "---- U-Boot upgraded. Please reset the board" ; do
       sleep 120
   done
fi
echo "---- U-Boot upgraded. The board will now reset."
sleep 1
reset
done