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); /* 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?