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

Stefan Roese sr at denx.de
Wed Oct 27 07:09:42 CEST 2021


On 26.10.21 20:48, Pali Rohár wrote:
> On Tuesday 26 October 2021 16:21:02 Stefan Roese wrote:
>> On 26.10.21 14:40, Pali Rohár wrote:
>>> My another guess there could be a problem is usage of stack. Maybe it is
>>> possible that register with stack pointer is not initialized after the
>>> full transfer when going to execute main image. Same arm baudrate change
>>> code is used after the SPL and before main U-Boot, and the first
>>> instruction is "push". Maybe modifying the arm code to not use stack
>>> when switching the baudrate back to 115200 could also help. I will look
>>> at it.
>>
>> Thanks.
> 
> Here is dirty hack patch which completely disable calling code for
> changing baudrate back to 115200 on ARM side:
> 
> diff --git a/tools/kwboot.c b/tools/kwboot.c
> index 5f4ff673972e..00d58a239c71 100644
> --- a/tools/kwboot.c
> +++ b/tools/kwboot.c
> @@ -1070,17 +1070,17 @@ kwboot_xmodem(int tty, const void *_img, size_t size, int baudrate)
>   		return rc;
>   
>   	if (baudrate) {
> -		char buf[sizeof(kwb_baud_magic)];
> -
> -		kwboot_printv("Waiting 1s for baudrate change magic\n");
> -		rc = kwboot_tty_recv(tty, buf, sizeof(buf), 1000);
> -		if (rc)
> -			return rc;
> -
> -		if (memcmp(buf, kwb_baud_magic, sizeof(buf))) {
> -			errno = EPROTO;
> -			return -1;
> -		}
> +//		char buf[sizeof(kwb_baud_magic)];
> +//
> +//		kwboot_printv("Waiting 1s for baudrate change magic\n");
> +//		rc = kwboot_tty_recv(tty, buf, sizeof(buf), 1000);
> +//		if (rc)
> +//			return rc;
> +//
> +//		if (memcmp(buf, kwb_baud_magic, sizeof(buf))) {
> +//			errno = EPROTO;
> +//			return -1;
> +//		}
>   
>   		kwboot_printv("\nChanging baudrate back to 115200 Bd\n\n");
>   		rc = kwboot_tty_change_baudrate(tty, 115200);
> @@ -1551,8 +1551,8 @@ kwboot_img_patch(void *img, size_t *size, int baudrate)
>   		 * This code is appended after the data part of the image and
>   		 * execaddr is changed to execute this code before U-Boot proper.
>   		 */
> -		kwboot_printv("Injecting code for changing baudrate back\n");
> -		_copy_baudrate_change_code(hdr, size, 1, baudrate, 115200);
> +//		kwboot_printv("Injecting code for changing baudrate back\n");
> +//		_copy_baudrate_change_code(hdr, size, 1, baudrate, 115200);

I do have this here in my version as well:

		/* Update the 32-bit data checksum */
		*kwboot_img_csum32_ptr(img) = kwboot_img_csum32(img);

		/* recompute header size */
		hdrsz = kwbheader_size(hdr);

So I'm using the newer version, just to be sure.

>   
>   		/* recompute header size */
>   		hdrsz = kwbheader_size(hdr);
> 
> As main U-Boot binary on ARM resets UART, it means that baudrate is
> properly set to 115200. Probably beginning of the U-Boot output could be
> lost but at least console should start.
> 
> Could you try this patch if it starts working now?

Okay, applied this patch and and booting with different baudrates works
on this board again (tested with 230400):

  96 % 
[......................................................................]
  98 % 
[......................................................................]
  99 % [................ 
       ]
Done
Finishing transfer

Changing baudrate back to 115200 Bd

[Type Ctrl-\ + c to quit]


U-Boot 2021.10-00908-gc129aa2f173a-dirty (Oct 27 2021 - 07:05:39 +0200)

SoC:   MV78260-B0 at 1333 MHz
I2C:   ready
DRAM:  2 GiB (667 MHz, 64-bit, ECC not enabled)
Loading Environment from SPIFlash... SF: Detected m25p128 with page size 
256 Bytes, erase size 256 KiB, total 16 MiB
OK
Model: Marvell Armada XP theadorable
...


Thanks,
Stefan


More information about the U-Boot mailing list