]>
Commit | Line | Data |
---|---|---|
56847f3a | 1 | #!/bin/bash -e |
6cfd09d4 T |
2 | # SPDX-License-Identifier: GPL-2.0+ |
3 | # (C) 2020 Pali Rohár <[email protected]> | |
4 | ||
5 | # External tools needed for this test: | |
6 | echo ' | |
7 | wget | |
8 | git | |
9 | truncate | |
10 | tar | |
11 | dpkg | |
12 | dd | |
13 | make | |
14 | gcc | |
15 | arm-linux-gnueabi-gcc | |
16 | fakeroot (homepage http://fakeroot-ng.lingnu.com/) | |
17 | mcopy (from mtools, homepage http://www.gnu.org/software/mtools/) | |
18 | mformat (from mtools, homepage http://www.gnu.org/software/mtools/) | |
19 | /usr/sbin/mkfs.ubifs (from mtd-utils, homepage http://www.linux-mtd.infradead.org/) | |
20 | /usr/sbin/ubinize (from mtd-utils, homepage http://www.linux-mtd.infradead.org/) | |
65298230 | 21 | /lib/ld-linux.so.2 (32-bit x86 version of LD loader, needed for qflasher) |
6cfd09d4 T |
22 | ' | while read tool info; do |
23 | if test -z "$tool"; then continue; fi | |
24 | if ! which $tool 1>/dev/null 2>&1; then | |
25 | echo "Tool $tool was not found and is required to run this test" | |
26 | echo "First install $tool $info" | |
27 | exit 1 | |
28 | fi | |
29 | done || exit 1 | |
30 | ||
31 | echo | |
32 | echo "============================================================" | |
33 | echo "========== Compiling U-Boot for Nokia RX-51 board ==========" | |
34 | echo "============================================================" | |
35 | echo | |
36 | ||
37 | # First compile u-boot.bin binary for Nokia RX-51 board | |
38 | make nokia_rx51_config | |
39 | make -j4 u-boot.bin ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- | |
40 | ||
41 | # And then do all stuff in temporary directory | |
42 | mkdir -p nokia_rx51_tmp | |
43 | cd nokia_rx51_tmp | |
44 | ||
45 | test -f mkimage || ln -s ../tools/mkimage . | |
46 | test -f u-boot.bin || ln -s ../u-boot.bin . | |
47 | ||
48 | echo | |
49 | echo "==========================================================================" | |
50 | echo "========== Downloading and compiling qemu from qemu-linaro fork ==========" | |
51 | echo "==========================================================================" | |
52 | echo | |
53 | ||
54 | # Download and compile linaro version qemu which has support for n900 machine | |
55 | # Last working commit is 8f8d8e0796efe1a6f34cdd83fb798f3c41217ec1 | |
56 | if ! test -f qemu-system-arm; then | |
57 | test -d qemu-linaro || git clone https://git.linaro.org/qemu/qemu-linaro.git | |
58 | cd qemu-linaro | |
59 | git checkout 8f8d8e0796efe1a6f34cdd83fb798f3c41217ec1 | |
b1c2102d | 60 | ./configure --enable-system --target-list=arm-softmmu --python=/usr/bin/python2.7 --disable-sdl --disable-gtk --disable-curses --audio-drv-list= --audio-card-list= --disable-werror --disable-xen --disable-xen-pci-passthrough --disable-brlapi --disable-vnc --disable-curl --disable-slirp --disable-kvm --disable-user --disable-linux-user --disable-bsd-user --disable-guest-base --disable-uuid --disable-vde --disable-linux-aio --disable-cap-ng --disable-attr --disable-blobs --disable-docs --disable-spice --disable-libiscsi --disable-smartcard-nss --disable-usb-redir --disable-guest-agent --disable-seccomp --disable-glusterfs --disable-nptl --disable-fdt |
6cfd09d4 T |
61 | make -j4 |
62 | cd .. | |
63 | ln -s qemu-linaro/arm-softmmu/qemu-system-arm . | |
64 | fi | |
65 | ||
66 | echo | |
67 | echo "===================================================" | |
68 | echo "========== Downloading external binaries ==========" | |
69 | echo "===================================================" | |
70 | echo | |
71 | ||
72 | # Download qflasher and nolo images | |
73 | # This is proprietary qemu flasher tool with first stage images, but license allows non-commercial redistribution | |
74 | wget -c http://repository.maemo.org/qemu-n900/qemu-n900.tar.gz | |
75 | tar -xf qemu-n900.tar.gz | |
76 | ||
77 | # Download Maemo script u-boot-gen-combined | |
78 | if ! test -f u-boot-gen-combined; then | |
79 | test -d u-boot-maemo || git clone https://github.com/pali/u-boot-maemo.git | |
80 | chmod +x u-boot-maemo/debian/u-boot-gen-combined | |
81 | ln -s u-boot-maemo/debian/u-boot-gen-combined . | |
82 | fi | |
83 | ||
84 | # Download Maemo fiasco kernel | |
85 | wget -c http://repository.maemo.org/pool/maemo5.0/free/k/kernel/kernel_2.6.28-20103103+0m5_armel.deb | |
86 | dpkg -x kernel_2.6.28-20103103+0m5_armel.deb kernel_2.6.28 | |
87 | ||
88 | # Download Maemo libc | |
89 | wget -c http://repository.maemo.org/pool/maemo5.0/free/g/glibc/libc6_2.5.1-1eglibc27+0m5_armel.deb | |
90 | dpkg -x libc6_2.5.1-1eglibc27+0m5_armel.deb libc6_2.5.1 | |
91 | ||
92 | # Download Maemo busybox | |
93 | wget -c http://repository.maemo.org/pool/maemo5.0/free/b/busybox/busybox_1.10.2.legal-1osso30+0m5_armel.deb | |
94 | dpkg -x busybox_1.10.2.legal-1osso30+0m5_armel.deb busybox_1.10.2 | |
95 | ||
96 | echo | |
97 | echo "=======================================" | |
98 | echo "========== Generating images ==========" | |
99 | echo "=======================================" | |
100 | echo | |
101 | ||
102 | # Generate rootfs directory | |
103 | mkdir -p rootfs | |
104 | mkdir -p rootfs/dev/ | |
105 | mkdir -p rootfs/bin/ | |
106 | mkdir -p rootfs/sbin/ | |
107 | mkdir -p rootfs/lib/ | |
108 | cp -a busybox_1.10.2/bin/busybox rootfs/bin/ | |
109 | cp -a libc6_2.5.1/lib/ld-linux.so.3 rootfs/lib/ | |
110 | cp -a libc6_2.5.1/lib/ld-2.5.so rootfs/lib/ | |
111 | cp -a libc6_2.5.1/lib/libc.so.6 rootfs/lib/ | |
112 | cp -a libc6_2.5.1/lib/libc-2.5.so rootfs/lib/ | |
113 | cp -a libc6_2.5.1/lib/libcrypt.so.1 rootfs/lib/ | |
114 | cp -a libc6_2.5.1/lib/libcrypt-2.5.so rootfs/lib/ | |
115 | test -f rootfs/bin/sh || ln -sf busybox rootfs/bin/sh | |
116 | test -f rootfs/sbin/poweroff || ln -sf ../bin/busybox rootfs/sbin/poweroff | |
117 | cat > rootfs/sbin/preinit << EOF | |
118 | #!/bin/sh | |
119 | echo | |
120 | echo "Successfully booted" | |
121 | echo | |
122 | /sbin/poweroff -f | |
123 | EOF | |
124 | chmod +x rootfs/sbin/preinit | |
125 | ||
126 | # Generate ubi config file for ubi rootfs image | |
127 | cat > ubi.ini << EOF | |
128 | [rootfs] | |
129 | mode=ubi | |
130 | image=ubifs.img | |
131 | vol_id=0 | |
132 | vol_size=160MiB | |
133 | vol_type=dynamic | |
134 | vol_name=rootfs | |
135 | vol_alignment=1 | |
136 | vol_flags=autoresize | |
137 | EOF | |
138 | ||
139 | # Generate ubi rootfs image from rootfs directory | |
140 | # NOTE: Character device on host filesystem can be created only by root | |
141 | # But we do not need it on host filesystem, just in ubifs image | |
142 | # So run mknod and mkfs.ubifs commands under fakeroot program | |
143 | # which via LD_PRELOAD simulate mknod() and stat() functions | |
144 | # so mkfs.ubifs will see dev/console as character device and | |
145 | # put it correctly as character device into final ubifs image | |
146 | # Therefore we can run whole script as non-root nobody user | |
147 | fakeroot sh -c ' | |
148 | rm -f rootfs/dev/console; | |
149 | mknod rootfs/dev/console c 5 1; | |
150 | /usr/sbin/mkfs.ubifs -m 2048 -e 129024 -c 2047 -r rootfs ubifs.img; | |
151 | ' | |
152 | /usr/sbin/ubinize -o ubi.img -p 128KiB -m 2048 -s 512 ubi.ini | |
153 | ||
1ce0e1cb T |
154 | # Generate bootmenu for U-Boot serial console testing |
155 | cat > bootmenu_uboot << EOF | |
156 | setenv bootmenu_0 'Serial console test=echo; echo "Testing serial console"; echo; echo "Successfully booted"; echo; poweroff'; | |
157 | setenv bootmenu_1; | |
158 | setenv bootmenu_delay 1; | |
159 | setenv bootdelay 1; | |
160 | EOF | |
161 | ./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_uboot -d bootmenu_uboot bootmenu_uboot.scr | |
162 | ||
cc434fcc | 163 | # Generate bootmenu for eMMC booting (uImage) |
6cfd09d4 T |
164 | cat > bootmenu_emmc << EOF |
165 | setenv bootmenu_0 'uImage-2.6.28-omap1 from eMMC=setenv mmcnum 1; setenv mmcpart 1; setenv mmctype fat; setenv bootargs; setenv setup_omap_atag 1; setenv mmckernfile uImage-2.6.28-omap1; run trymmckernboot'; | |
166 | setenv bootmenu_1; | |
167 | setenv bootmenu_delay 1; | |
168 | setenv bootdelay 1; | |
169 | EOF | |
56847f3a | 170 | ./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_emmc -d bootmenu_emmc bootmenu_emmc.scr |
6cfd09d4 | 171 | |
cc434fcc T |
172 | # Generate bootmenu for eMMC booting (zImage) |
173 | cat > bootmenu_emmc2 << EOF | |
174 | setenv bootmenu_0 'zImage-2.6.28-omap1 from eMMC=setenv mmcnum 1; setenv mmcpart 1; setenv mmctype fat; setenv bootargs; setenv setup_omap_atag 1; setenv mmckernfile zImage-2.6.28-omap1; run trymmckernboot'; | |
175 | setenv bootmenu_1; | |
176 | setenv bootmenu_delay 1; | |
177 | setenv bootdelay 1; | |
178 | EOF | |
179 | ./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_emmc2 -d bootmenu_emmc2 bootmenu_emmc2.scr | |
180 | ||
6cfd09d4 T |
181 | # Generate bootmenu for OneNAND booting |
182 | cat > bootmenu_nand << EOF | |
183 | setenv bootmenu_0 'uImage-2.6.28-omap1 from OneNAND=mtd read initfs \${kernaddr}; setenv bootargs; setenv setup_omap_atag 1; bootm \${kernaddr}'; | |
184 | setenv bootmenu_1; | |
185 | setenv bootmenu_delay 1; | |
186 | setenv bootdelay 1; | |
187 | EOF | |
56847f3a | 188 | ./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_nand -d bootmenu_nand bootmenu_nand.scr |
6cfd09d4 | 189 | |
cc434fcc T |
190 | # Generate bootmenu for default booting |
191 | cat > bootmenu_default << EOF | |
192 | setenv bootmenu_delay 1; | |
193 | setenv bootdelay 1; | |
194 | EOF | |
195 | ./mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n bootmenu_default -d bootmenu_default bootmenu_default.scr | |
196 | ||
6cfd09d4 T |
197 | # Generate combined image from u-boot and Maemo fiasco kernel |
198 | dd if=kernel_2.6.28/boot/zImage-2.6.28-20103103+0m5.fiasco of=zImage-2.6.28-omap1 skip=95 bs=1 | |
cc434fcc | 199 | ./u-boot-gen-combined u-boot.bin zImage-2.6.28-omap1 combined_zimage.bin |
6cfd09d4 | 200 | ./mkimage -A arm -O linux -T kernel -C none -a 80008000 -e 80008000 -n zImage-2.6.28-omap1 -d zImage-2.6.28-omap1 uImage-2.6.28-omap1 |
cc434fcc | 201 | ./u-boot-gen-combined u-boot.bin uImage-2.6.28-omap1 combined_uimage.bin |
6cfd09d4 T |
202 | |
203 | # Generate combined hack image from u-boot and Maemo fiasco kernel (kernel starts at 2MB offset and qflasher puts 2kB header before supplied image) | |
204 | cp u-boot.bin combined_hack.bin | |
205 | dd if=uImage-2.6.28-omap1 of=combined_hack.bin bs=1024 seek=$((2048-2)) | |
206 | ||
1ce0e1cb T |
207 | # Generate FAT32 eMMC image for U-Boot serial console testing |
208 | truncate -s 50MiB emmc_uboot.img | |
209 | mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_uboot.img | |
210 | mcopy bootmenu_uboot.scr ::/bootmenu.scr -i emmc_uboot.img | |
211 | ||
cc434fcc | 212 | # Generate FAT32 eMMC image for eMMC booting (uImage) |
6cfd09d4 T |
213 | truncate -s 50MiB emmc_emmc.img |
214 | mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_emmc.img | |
215 | mcopy uImage-2.6.28-omap1 ::/uImage-2.6.28-omap1 -i emmc_emmc.img | |
216 | mcopy bootmenu_emmc.scr ::/bootmenu.scr -i emmc_emmc.img | |
217 | ||
cc434fcc T |
218 | # Generate FAT32 eMMC image for eMMC booting (zImage) |
219 | truncate -s 50MiB emmc_emmc2.img | |
220 | mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_emmc2.img | |
221 | mcopy zImage-2.6.28-omap1 ::/zImage-2.6.28-omap1 -i emmc_emmc2.img | |
222 | mcopy bootmenu_emmc2.scr ::/bootmenu.scr -i emmc_emmc2.img | |
223 | ||
6cfd09d4 T |
224 | # Generate FAT32 eMMC image for OneNAND booting |
225 | truncate -s 50MiB emmc_nand.img | |
226 | mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_nand.img | |
227 | mcopy bootmenu_nand.scr ::/bootmenu.scr -i emmc_nand.img | |
228 | ||
cc434fcc T |
229 | # Generate FAT32 eMMC image for default booting |
230 | truncate -s 50MiB emmc_default.img | |
231 | mformat -m 0xf8 -F -h 4 -s 16 -c 1 -t $((50*1024*1024/(4*16*512))) :: -i emmc_default.img | |
232 | mcopy bootmenu_default.scr ::/bootmenu.scr -i emmc_default.img | |
233 | ||
1ce0e1cb T |
234 | # Generate MTD image for U-Boot serial console testing |
235 | rm -f mtd_uboot.img | |
236 | ./qflasher -v -x xloader-qemu.bin -s secondary-qemu.bin -k u-boot.bin -m rx51 -o mtd_uboot.img | |
237 | ||
6cfd09d4 T |
238 | # Generate MTD image for RAM booting from bootloader nolo images, compiled image and rootfs image |
239 | rm -f mtd_ram.img | |
cc434fcc T |
240 | ./qflasher -v -x xloader-qemu.bin -s secondary-qemu.bin -k combined_uimage.bin -r ubi.img -m rx51 -o mtd_ram.img |
241 | rm -f mtd_ram2.img | |
242 | ./qflasher -v -x xloader-qemu.bin -s secondary-qemu.bin -k combined_zimage.bin -r ubi.img -m rx51 -o mtd_ram2.img | |
6cfd09d4 T |
243 | |
244 | # Generate MTD image for eMMC booting from bootloader nolo images, u-boot image and rootfs image | |
245 | rm -f mtd_emmc.img | |
246 | ./qflasher -v -x xloader-qemu.bin -s secondary-qemu.bin -k u-boot.bin -r ubi.img -m rx51 -o mtd_emmc.img | |
247 | ||
248 | # Generate MTD image for OneNAND booting from bootloader nolo images, combined hacked image and rootfs image | |
249 | # Kernel image is put into initfs area, but qflasher reject to copy kernel image into initfs area because it does not have initfs signature | |
250 | # This is hack to workaround this problem, tell qflasher that kernel area for u-boot is bigger and put big combined hacked image (u-boot + kernel with correct offset) | |
251 | rm -f mtd_nand.img | |
252 | ./qflasher -v -x xloader-qemu.bin -s secondary-qemu.bin -k combined_hack.bin -r ubi.img -m rx51 -p k=4094,i=2 -o mtd_nand.img | |
253 | ||
254 | echo | |
255 | echo "======================================================" | |
256 | echo "========== Running test images in n900 qemu ==========" | |
257 | echo "======================================================" | |
258 | echo | |
259 | ||
1ce0e1cb T |
260 | # Run MTD image in qemu and wait for 300s if U-Boot prints testing string to serial console and poweroff |
261 | rm -f qemu_uboot.log | |
262 | ./qemu-system-arm -M n900 -mtdblock mtd_uboot.img -sd emmc_uboot.img -serial /dev/stdout -display none > qemu_uboot.log & | |
263 | qemu_pid=$! | |
264 | tail -F qemu_uboot.log & | |
265 | tail_pid=$! | |
266 | sleep 300 & | |
267 | sleep_pid=$! | |
268 | wait -n $sleep_pid $qemu_pid || true | |
269 | kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true | |
270 | wait || true | |
271 | ||
cc434fcc | 272 | # Run MTD image in qemu and wait for 300s if uImage kernel from RAM is correctly booted |
6cfd09d4 T |
273 | rm -f qemu_ram.log |
274 | ./qemu-system-arm -M n900 -mtdblock mtd_ram.img -serial /dev/stdout -display none > qemu_ram.log & | |
275 | qemu_pid=$! | |
276 | tail -F qemu_ram.log & | |
277 | tail_pid=$! | |
56847f3a | 278 | sleep 300 & |
6cfd09d4 | 279 | sleep_pid=$! |
56847f3a T |
280 | wait -n $sleep_pid $qemu_pid || true |
281 | kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true | |
282 | wait || true | |
6cfd09d4 | 283 | |
cc434fcc T |
284 | # Run MTD image in qemu and wait for 300s if zImage kernel from RAM is correctly booted |
285 | rm -f qemu_ram2.log | |
286 | ./qemu-system-arm -M n900 -mtdblock mtd_ram2.img -sd emmc_default.img -serial /dev/stdout -display none > qemu_ram2.log & | |
287 | qemu_pid=$! | |
288 | tail -F qemu_ram2.log & | |
289 | tail_pid=$! | |
290 | sleep 300 & | |
291 | sleep_pid=$! | |
292 | wait -n $sleep_pid $qemu_pid || true | |
293 | kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true | |
294 | wait || true | |
295 | ||
296 | # Run MTD image in qemu and wait for 300s if uImage kernel from eMMC is correctly booted | |
6cfd09d4 T |
297 | rm -f qemu_emmc.log |
298 | ./qemu-system-arm -M n900 -mtdblock mtd_emmc.img -sd emmc_emmc.img -serial /dev/stdout -display none > qemu_emmc.log & | |
299 | qemu_pid=$! | |
300 | tail -F qemu_emmc.log & | |
301 | tail_pid=$! | |
56847f3a | 302 | sleep 300 & |
6cfd09d4 | 303 | sleep_pid=$! |
56847f3a T |
304 | wait -n $sleep_pid $qemu_pid || true |
305 | kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true | |
306 | wait || true | |
6cfd09d4 | 307 | |
cc434fcc T |
308 | # Run MTD image in qemu and wait for 300s if zImage kernel from eMMC is correctly booted |
309 | rm -f qemu_emmc2.log | |
310 | ./qemu-system-arm -M n900 -mtdblock mtd_emmc.img -sd emmc_emmc2.img -serial /dev/stdout -display none > qemu_emmc2.log & | |
311 | qemu_pid=$! | |
312 | tail -F qemu_emmc2.log & | |
313 | tail_pid=$! | |
314 | sleep 300 & | |
315 | sleep_pid=$! | |
316 | wait -n $sleep_pid $qemu_pid || true | |
317 | kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true | |
318 | wait || true | |
319 | ||
6cfd09d4 T |
320 | # Run MTD image in qemu and wait for 300s if kernel from OneNAND is correctly booted |
321 | rm -f qemu_nand.log | |
322 | ./qemu-system-arm -M n900 -mtdblock mtd_nand.img -sd emmc_nand.img -serial /dev/stdout -display none > qemu_nand.log & | |
323 | qemu_pid=$! | |
324 | tail -F qemu_nand.log & | |
325 | tail_pid=$! | |
56847f3a | 326 | sleep 300 & |
6cfd09d4 | 327 | sleep_pid=$! |
56847f3a T |
328 | wait -n $sleep_pid $qemu_pid || true |
329 | kill -9 $tail_pid $sleep_pid $qemu_pid 2>/dev/null || true | |
330 | wait || true | |
6cfd09d4 T |
331 | |
332 | echo | |
333 | echo "=============================" | |
334 | echo "========== Results ==========" | |
335 | echo "=============================" | |
336 | echo | |
337 | ||
1ce0e1cb | 338 | if grep -q 'Successfully booted' qemu_uboot.log; then echo "U-Boot serial console is working"; else echo "U-Boot serial console test failed"; fi |
cc434fcc T |
339 | if grep -q 'Successfully booted' qemu_ram.log; then echo "Kernel (uImage) was successfully booted from RAM"; else echo "Failed to boot kernel (uImage) from RAM"; fi |
340 | if grep -q 'Successfully booted' qemu_ram2.log; then echo "Kernel (zImage) was successfully booted from RAM"; else echo "Failed to boot kernel (zImage) from RAM"; fi | |
341 | if grep -q 'Successfully booted' qemu_emmc.log; then echo "Kernel (uImage) was successfully booted from eMMC"; else echo "Failed to boot kernel (uImage) from eMMC"; fi | |
342 | if grep -q 'Successfully booted' qemu_emmc2.log; then echo "Kernel (zImage) was successfully booted from eMMC"; else echo "Failed to boot kernel (zImage) from eMMC"; fi | |
343 | if grep -q 'Successfully booted' qemu_nand.log; then echo "Kernel (uImage) was successfully booted from OneNAND"; else echo "Failed to boot kernel (uImage) from OneNAND"; fi | |
6cfd09d4 T |
344 | |
345 | echo | |
346 | ||
cc434fcc | 347 | if grep -q 'Successfully booted' qemu_uboot.log && grep -q 'Successfully booted' qemu_ram.log && grep -q 'Successfully booted' qemu_ram2.log && grep -q 'Successfully booted' qemu_emmc.log && grep -q 'Successfully booted' qemu_emmc2.log && grep -q 'Successfully booted' qemu_nand.log; then |
6cfd09d4 T |
348 | echo "All tests passed" |
349 | exit 0 | |
350 | else | |
351 | echo "Some tests failed" | |
352 | exit 1 | |
353 | fi |