
On 26.10.21 11:06, Pali Rohár wrote:
<snip>
Now I found logical error in kwboot code which handles retransmission of the last header packet. State of "baudrate change" is cleared on every retransmission. Please apply following diff, so state variables are initialized only once.
diff --git a/tools/kwboot.c b/tools/kwboot.c index d38ee0065177..835ccc8c113a 100644 --- a/tools/kwboot.c +++ b/tools/kwboot.c @@ -859,11 +859,6 @@ kwboot_xm_recv_reply(int fd, char *c, int nak_on_non_xm, uint64_t recv_until = _now() + timeout; int rc;
- if (non_xm_print)
*non_xm_print = 0;
- if (baud_changed)
*baud_changed = 0;
- while (1) { rc = kwboot_tty_recv(fd, c, 1, timeout); if (rc) {
@@ -929,6 +924,8 @@ kwboot_xm_sendblock(int fd, struct kwboot_block *block, int allow_non_xm, char c;
*done_print = 0;
non_xm_print = 0;
baud_changed = 0;
retries = 0; do {
This definitely helps (a bit). Now I get this:
[stefan@ryzen u-boot-marvell (kwboot-test1)]$ ./tools/kwboot -B 230400 -b u-boot-spl.kwb -t /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A1019EGY-if00-port0 Patching image boot signature to UART Injecting binary header code for changing baudrate to 230400 Bd Injecting code for changing baudrate back Sending boot message. Please reboot the target...| Waiting 2s and flushing tty Sending boot image header (90112 bytes)... 0 % [......................................................................] 10 % [......................................................................] 20 % [......................................................................] 29 % [......................................................................] 39 % [......................................................................] 49 % [......................................................................] 59 % [......................................................................] 69 % [......................................................................] 79 % [......................................................................] 89 % [......................................................................] 99 % [.... ] Done
U-Boot SPL 2021.10-00908-gc129aa2f173a-dirty (Oct 26 2021 - 12:48:11 +0200) High speed PHY - Version: 2.1.5 (COM-PHY-V20) High speed PHY - Ended Successfully DDR3 Training Sequence - Ver 5.7.4 DDR3 Training Sequence - Ended Successfully Trying to boot from BOOTROM Returning to BootROM (return address 0xffff0aa0)...
Changing baudrate to 230400 Bd
Sending boot image data (549892 bytes)... 0 % [......................................................................]
...
99 % [........................... ] Done Finishing transfer Waiting 1s for baudrate change magic xmodem: Connection timed out
BTW: The baudrate change does not seem to work or have any effect on the image download speed. Comparing 230400 and 921600 baud speeds, I can spot no real time difference here:
230400 baud: [stefan@ryzen u-boot-marvell (kwboot-test1)]$ time ./tools/kwboot -B 230400 -b u-boot-spl.kwb -t /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A1019EGY-if00-port0 Patching image boot signature to UART Injecting binary header code for changing baudrate to 230400 Bd
...
99 % [........................... ] Done Finishing transfer Waiting 1s for baudrate change magic xmodem: Connection timed out [2]+ Done emacs tools/kwboot.c
real 1m27,279s user 0m2,313s sys 0m0,337s
921600 baud: [stefan@ryzen u-boot-marvell (kwboot-test1)]$ time ./tools/kwboot -B 921600 -b u-boot-spl.kwb -t /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A1019EGY-if00-port0 Patching image boot signature to UART Injecting binary header code for changing baudrate to 921600 Bd
...
99 % [........................... ] Done Finishing transfer Waiting 1s for baudrate change magic xmodem: Connection timed out
real 1m27,839s user 0m0,224s sys 0m0,194s
Any idea why this is the case?
Ok. This seems to work at least partly (SPL):
[stefan@ryzen u-boot-marvell (kwboot-test1)]$ ./tools/kwboot -B 115201 -b u-boot-spl.kwb -t /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A1019EGY-if00-port0 Patching image boot signature to UART Injecting binary header code for changing baudrate to 115201 Bd Injecting code for changing baudrate back Sending boot message. Please reboot the target...| Waiting 2s and flushing tty Sending boot image header (90112 bytes)... 0 % [......................................................................] 10 % [......................................................................] 20 % [......................................................................] 29 % [......................................................................] 39 % [......................................................................] 49 % [......................................................................] 59 % [......................................................................] 69 % [......................................................................] 79 % [......................................................................] 89 % [......................................................................] 99 % [.... ] Done
U-Boot SPL 2021.10-00908-gc129aa2f173a (Oct 26 2021 - 10:39:55 +0200) High speed PHY - Version: 2.1.5 (COM-PHY-V20) High speed PHY - Ended Successfully DDR3 Training Sequence - Ver 5.7.4 DDR3 Training Sequence - Ended Successfully Trying to boot from BOOTROM Returning to BootROM (return address 0xffff0aa0)...
Changing baudrate to 115201 Bd
Sending boot image data (549892 bytes)... 0 % [......................................................................] 1 % [......................................................................] ... 97 % [......................................................................] 99 % [........................... ] Done Finishing transfer Waiting 1s for baudrate change magic
Changing baudrate back to 115200 Bd
[Type Ctrl-\ + c to quit]
BootROM 1.20 Booting from SPI flash
So the CPU has run through a reset here.
What kind of CPU core has your AXP board? Maybe there is some arm instruction in kwboot_baud_code[] array which is not supported by that core (and so reset occurs)?
AXP stands for Armada XP, which is ARM v7 AFAIK.
And could you send me commands which you are using for compiling U-Boot for that your AXP board? I would like to examine resulted binary.
I'm currently using a kernel.org toolchain:
[stefan@ryzen u-boot-marvell (kwboot-test1)]$ set | grep CROSS CROSS_COMPILE=/opt/kernel.org/gcc-11.1.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi- [stefan@ryzen u-boot-marvell (kwboot-test1)]$ /opt/kernel.org/gcc-11.1.0-nolibc/arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc --version arm-linux-gnueabi-gcc (GCC) 11.1.0 Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Here my commands to generate the U-Boot binary:
make mrproper make theadorable_debug_defconfig make -s -j20
And what is the output of following command immediately after kwboot?
stty -F /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A1019EGY-if00-port0
Changing baudrate to 230400 Bd Baudrate was not changed
xmodem: Protocol error [stefan@ryzen u-boot-marvell (kwboot-test1)]$ stty -F /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A1019EGY-if00-port0 speed 230400 baud; line = 0;
... but baudrate _was_ changed.
So it looks like a bug in kwboot code. Try to apply above diff, it is really possible that you hit that logical error. (Interesting that neither Marek nor me saw it)
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>; lnext = <undef>; discard = <undef>; min = 1; time = 0; -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
Also, could try to catch whole strace log and send it to me?
I'll try to do this later today.
'strace kwboot ... 1>log 2>&1' should do it...
Okay, will follow in the next privatze mail.
Thanks, Stefan