Re: [PATCH u-boot-marvell 00/13] Yet another kwboot improvements

Stefan Roese
2021-10-26T11:09:57Z

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