diff mbox

[U-Boot,v1,22/25] tools/kwboot: Sync with latest barebox version to support Armada XP

Message ID 1403862911-6138-23-git-send-email-sr@denx.de
State Superseded
Delegated to: Prafulla Wadaskar
Headers show

Commit Message

Stefan Roese June 27, 2014, 9:55 a.m. UTC
The barebox version of the kwboot tool has evolved a bit. To support
Armada XP and Dove. Additionally a few minor fixes have been applied.
So lets sync with the latest barebox version.

Please note that the main difference between both versions now is, that
the U-Boot version still supports the -p option, to dynamically patch
an image for UART boot mode. I didn't test it now though.

Signed-off-by: Stefan Roese <sr@denx.de>
---

 tools/kwboot.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 83 insertions(+), 14 deletions(-)

Comments

Luka Perkov June 27, 2014, 7:06 p.m. UTC | #1
Hi Stefan,

It's great to see you working on adding support for Marvell's new SoCs :)

Since now kwboot is going to support more SoCs except kirkwood it makes
sense to rename it to mvboot. I've sent this patch long ago, dunno if it
still applies:

http://patchwork.ozlabs.org/patch/219741/

Also, I'd like to test this series on some boards I have - do you have
patches on some git tree that can be pulled easily?

Luka

On Fri, Jun 27, 2014 at 11:55:08AM +0200, Stefan Roese wrote:
> The barebox version of the kwboot tool has evolved a bit. To support
> Armada XP and Dove. Additionally a few minor fixes have been applied.
> So lets sync with the latest barebox version.
> 
> Please note that the main difference between both versions now is, that
> the U-Boot version still supports the -p option, to dynamically patch
> an image for UART boot mode. I didn't test it now though.
> 
> Signed-off-by: Stefan Roese <sr@denx.de>
> ---
> 
>  tools/kwboot.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++---------
>  1 file changed, 83 insertions(+), 14 deletions(-)
> 
> diff --git a/tools/kwboot.c b/tools/kwboot.c
> index e773f01..c47970e 100644
> --- a/tools/kwboot.c
> +++ b/tools/kwboot.c
> @@ -1,5 +1,6 @@
>  /*
> - * Boot a Marvell Kirkwood SoC, with Xmodem over UART0.
> + * Boot a Marvell SoC, with Xmodem over UART0.
> + *  supports Kirkwood, Dove, Armada 370, Armada XP
>   *
>   * (c) 2012 Daniel Stodden <daniel.stodden@gmail.com>
>   *
> @@ -37,8 +38,12 @@ static unsigned char kwboot_msg_boot[] = {
>  	0xBB, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
>  };
>  
> -#define KWBOOT_MSG_REQ_DELAY	10 /* ms */
> -#define KWBOOT_MSG_RSP_TIMEO	50 /* ms */
> +static unsigned char kwboot_msg_debug[] = {
> +	0xDD, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
> +};
> +
> +#define KWBOOT_MSG_REQ_DELAY	1000 /* ms */
> +#define KWBOOT_MSG_RSP_TIMEO	1000 /* ms */
>  
>  /*
>   * Xmodem Transfers
> @@ -184,6 +189,9 @@ kwboot_tty_send(int fd, const void *buf, size_t len)
>  	int rc;
>  	ssize_t n;
>  
> +	if (!buf)
> +		return 0;
> +
>  	rc = -1;
>  
>  	do {
> @@ -268,7 +276,10 @@ kwboot_bootmsg(int tty, void *msg)
>  	int rc;
>  	char c;
>  
> -	kwboot_printv("Sending boot message. Please reboot the target...");
> +	if (msg == NULL)
> +		kwboot_printv("Please reboot the target into UART boot mode...");
> +	else
> +		kwboot_printv("Sending boot message. Please reboot the target...");
>  
>  	do {
>  		rc = tcflush(tty, TCIOFLUSH);
> @@ -293,6 +304,37 @@ kwboot_bootmsg(int tty, void *msg)
>  }
>  
>  static int
> +kwboot_debugmsg(int tty, void *msg)
> +{
> +	int rc;
> +
> +	kwboot_printv("Sending debug message. Please reboot the target...");
> +
> +	do {
> +		char buf[16];
> +
> +		rc = tcflush(tty, TCIOFLUSH);
> +		if (rc)
> +			break;
> +
> +		rc = kwboot_tty_send(tty, msg, 8);
> +		if (rc) {
> +			usleep(KWBOOT_MSG_REQ_DELAY * 1000);
> +			continue;
> +		}
> +
> +		rc = kwboot_tty_recv(tty, buf, 16, KWBOOT_MSG_RSP_TIMEO);
> +
> +		kwboot_spinner();
> +
> +	} while (rc);
> +
> +	kwboot_printv("\n");
> +
> +	return rc;
> +}
> +
> +static int
>  kwboot_xm_makeblock(struct kwboot_block *block, const void *data,
>  		    size_t size, int pnum)
>  {
> @@ -300,6 +342,7 @@ kwboot_xm_makeblock(struct kwboot_block *block, const void *data,
>  	size_t n;
>  	int i;
>  
> +	block->soh = SOH;
>  	block->pnum = pnum;
>  	block->_pnum = ~block->pnum;
>  
> @@ -326,9 +369,15 @@ kwboot_xm_sendblock(int fd, struct kwboot_block *block)
>  		if (rc)
>  			break;
>  
> -		rc = kwboot_tty_recv(fd, &c, 1, KWBOOT_BLK_RSP_TIMEO);
> -		if (rc)
> -			break;
> +		do {
> +			rc = kwboot_tty_recv(fd, &c, 1, KWBOOT_BLK_RSP_TIMEO);
> +			if (rc)
> +				break;
> +
> +			if (c != ACK && c != NAK && c != CAN)
> +				printf("%c", c);
> +
> +		} while (c != ACK && c != NAK && c != CAN);
>  
>  		if (c != ACK)
>  			kwboot_progress(-1, '+');
> @@ -511,7 +560,6 @@ kwboot_mmap_image(const char *path, size_t *size, int prot)
>  	void *img;
>  
>  	rc = -1;
> -	fd = -1;
>  	img = NULL;
>  
>  	fd = open(path, O_RDONLY);
> @@ -601,11 +649,15 @@ static void
>  kwboot_usage(FILE *stream, char *progname)
>  {
>  	fprintf(stream,
> -		"Usage: %s -b <image> [ -p ] [ -t ] "
> -		"[-B <baud> ] <TTY>\n", progname);
> +		"Usage: %s [-d | -b <image> | -D <image> ] [ -t ] [-B <baud> ] <TTY>\n",
> +		progname);
>  	fprintf(stream, "\n");
> -	fprintf(stream, "  -b <image>: boot <image>\n");
> +	fprintf(stream,
> +		"  -b <image>: boot <image> with preamble (Kirkwood, Armada 370/XP)\n");
>  	fprintf(stream, "  -p: patch <image> to type 0x69 (uart boot)\n");
> +	fprintf(stream,
> +		"  -D <image>: boot <image> without preamble (Dove)\n");
> +	fprintf(stream, "  -d: enter debug mode\n");
>  	fprintf(stream, "\n");
>  	fprintf(stream, "  -t: mini terminal\n");
>  	fprintf(stream, "\n");
> @@ -619,6 +671,7 @@ main(int argc, char **argv)
>  	const char *ttypath, *imgpath;
>  	int rv, rc, tty, term, prot, patch;
>  	void *bootmsg;
> +	void *debugmsg;
>  	void *img;
>  	size_t size;
>  	speed_t speed;
> @@ -626,6 +679,7 @@ main(int argc, char **argv)
>  	rv = 1;
>  	tty = -1;
>  	bootmsg = NULL;
> +	debugmsg = NULL;
>  	imgpath = NULL;
>  	img = NULL;
>  	term = 0;
> @@ -636,7 +690,7 @@ main(int argc, char **argv)
>  	kwboot_verbose = isatty(STDOUT_FILENO);
>  
>  	do {
> -		int c = getopt(argc, argv, "hb:ptB:");
> +		int c = getopt(argc, argv, "hb:ptB:dD:");
>  		if (c < 0)
>  			break;
>  
> @@ -646,6 +700,15 @@ main(int argc, char **argv)
>  			imgpath = optarg;
>  			break;
>  
> +		case 'D':
> +			bootmsg = NULL;
> +			imgpath = optarg;
> +			break;
> +
> +		case 'd':
> +			debugmsg = kwboot_msg_debug;
> +			break;
> +
>  		case 'p':
>  			patch = 1;
>  			break;
> @@ -667,7 +730,7 @@ main(int argc, char **argv)
>  		}
>  	} while (1);
>  
> -	if (!bootmsg && !term)
> +	if (!bootmsg && !term && !debugmsg)
>  		goto usage;
>  
>  	if (patch && !imgpath)
> @@ -702,7 +765,13 @@ main(int argc, char **argv)
>  		}
>  	}
>  
> -	if (bootmsg) {
> +	if (debugmsg) {
> +		rc = kwboot_debugmsg(tty, debugmsg);
> +		if (rc) {
> +			perror("debugmsg");
> +			goto out;
> +		}
> +	} else {
>  		rc = kwboot_bootmsg(tty, bootmsg);
>  		if (rc) {
>  			perror("bootmsg");
> -- 
> 2.0.1
> 
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Daniel Stodden June 28, 2014, 1:25 a.m. UTC | #2
On Fri, 2014-06-27 at 21:06 +0200, Luka Perkov wrote:
> Hi Stefan,
> 
> It's great to see you working on adding support for Marvell's new SoCs :)
> 
> Since now kwboot is going to support more SoCs except kirkwood it makes
> sense to rename it to mvboot. I've sent this patch long ago, dunno if it
> still applies:
> 
> http://patchwork.ozlabs.org/patch/219741/
> 
> Also, I'd like to test this series on some boards I have - do you have
> patches on some git tree that can be pulled easily?

In case Marvell gets bought out: wouldn't it make more sense to rename
to mrvlboot and point a curl script at the nasdaq quotes to validate the
build? 

Related, I don't think Marvell guarantees to not either yank or
completely overhaul their SoC boot code entirely next September.

I'm sorry for "kwboot" if it violates your aesthetic senses. Those as of
2014. Indeed, naming programs by product is often a weak choice, but
there wasn't a more robust one available. But: there still isn't.

Program paths don't get renamed at will. That's because once it's
deployed it's not arbitrary anymore, and some real value in doing so
better compensates for the overall pain.

Here's one fix: one could write a yet better one with yet a better name,
convince everyone to switch, and just obsolete the existing one.

An easier, sometimes funnier, alternative is to learn to enjoy the
historical trivia surrounding all those seemingly stupid names.

Yeah, an 'apt-get git' used to install GNU interactive tools, then at
some point it suddenly didn't. But NIS support still runs as ypbind for
all the good reasons, too.

Cheers,
Daniel

> Luka
> 
> On Fri, Jun 27, 2014 at 11:55:08AM +0200, Stefan Roese wrote:
> > The barebox version of the kwboot tool has evolved a bit. To support
> > Armada XP and Dove. Additionally a few minor fixes have been applied.
> > So lets sync with the latest barebox version.
> > 
> > Please note that the main difference between both versions now is, that
> > the U-Boot version still supports the -p option, to dynamically patch
> > an image for UART boot mode. I didn't test it now though.
> > 
> > Signed-off-by: Stefan Roese <sr@denx.de>
> > ---
> > 
> >  tools/kwboot.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++---------
> >  1 file changed, 83 insertions(+), 14 deletions(-)
> > 
> > diff --git a/tools/kwboot.c b/tools/kwboot.c
> > index e773f01..c47970e 100644
> > --- a/tools/kwboot.c
> > +++ b/tools/kwboot.c
> > @@ -1,5 +1,6 @@
> >  /*
> > - * Boot a Marvell Kirkwood SoC, with Xmodem over UART0.
> > + * Boot a Marvell SoC, with Xmodem over UART0.
> > + *  supports Kirkwood, Dove, Armada 370, Armada XP
> >   *
> >   * (c) 2012 Daniel Stodden <daniel.stodden@gmail.com>
> >   *
> > @@ -37,8 +38,12 @@ static unsigned char kwboot_msg_boot[] = {
> >  	0xBB, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
> >  };
> >  
> > -#define KWBOOT_MSG_REQ_DELAY	10 /* ms */
> > -#define KWBOOT_MSG_RSP_TIMEO	50 /* ms */
> > +static unsigned char kwboot_msg_debug[] = {
> > +	0xDD, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
> > +};
> > +
> > +#define KWBOOT_MSG_REQ_DELAY	1000 /* ms */
> > +#define KWBOOT_MSG_RSP_TIMEO	1000 /* ms */
> >  
> >  /*
> >   * Xmodem Transfers
> > @@ -184,6 +189,9 @@ kwboot_tty_send(int fd, const void *buf, size_t len)
> >  	int rc;
> >  	ssize_t n;
> >  
> > +	if (!buf)
> > +		return 0;
> > +
> >  	rc = -1;
> >  
> >  	do {
> > @@ -268,7 +276,10 @@ kwboot_bootmsg(int tty, void *msg)
> >  	int rc;
> >  	char c;
> >  
> > -	kwboot_printv("Sending boot message. Please reboot the target...");
> > +	if (msg == NULL)
> > +		kwboot_printv("Please reboot the target into UART boot mode...");
> > +	else
> > +		kwboot_printv("Sending boot message. Please reboot the target...");
> >  
> >  	do {
> >  		rc = tcflush(tty, TCIOFLUSH);
> > @@ -293,6 +304,37 @@ kwboot_bootmsg(int tty, void *msg)
> >  }
> >  
> >  static int
> > +kwboot_debugmsg(int tty, void *msg)
> > +{
> > +	int rc;
> > +
> > +	kwboot_printv("Sending debug message. Please reboot the target...");
> > +
> > +	do {
> > +		char buf[16];
> > +
> > +		rc = tcflush(tty, TCIOFLUSH);
> > +		if (rc)
> > +			break;
> > +
> > +		rc = kwboot_tty_send(tty, msg, 8);
> > +		if (rc) {
> > +			usleep(KWBOOT_MSG_REQ_DELAY * 1000);
> > +			continue;
> > +		}
> > +
> > +		rc = kwboot_tty_recv(tty, buf, 16, KWBOOT_MSG_RSP_TIMEO);
> > +
> > +		kwboot_spinner();
> > +
> > +	} while (rc);
> > +
> > +	kwboot_printv("\n");
> > +
> > +	return rc;
> > +}
> > +
> > +static int
> >  kwboot_xm_makeblock(struct kwboot_block *block, const void *data,
> >  		    size_t size, int pnum)
> >  {
> > @@ -300,6 +342,7 @@ kwboot_xm_makeblock(struct kwboot_block *block, const void *data,
> >  	size_t n;
> >  	int i;
> >  
> > +	block->soh = SOH;
> >  	block->pnum = pnum;
> >  	block->_pnum = ~block->pnum;
> >  
> > @@ -326,9 +369,15 @@ kwboot_xm_sendblock(int fd, struct kwboot_block *block)
> >  		if (rc)
> >  			break;
> >  
> > -		rc = kwboot_tty_recv(fd, &c, 1, KWBOOT_BLK_RSP_TIMEO);
> > -		if (rc)
> > -			break;
> > +		do {
> > +			rc = kwboot_tty_recv(fd, &c, 1, KWBOOT_BLK_RSP_TIMEO);
> > +			if (rc)
> > +				break;
> > +
> > +			if (c != ACK && c != NAK && c != CAN)
> > +				printf("%c", c);
> > +
> > +		} while (c != ACK && c != NAK && c != CAN);
> >  
> >  		if (c != ACK)
> >  			kwboot_progress(-1, '+');
> > @@ -511,7 +560,6 @@ kwboot_mmap_image(const char *path, size_t *size, int prot)
> >  	void *img;
> >  
> >  	rc = -1;
> > -	fd = -1;
> >  	img = NULL;
> >  
> >  	fd = open(path, O_RDONLY);
> > @@ -601,11 +649,15 @@ static void
> >  kwboot_usage(FILE *stream, char *progname)
> >  {
> >  	fprintf(stream,
> > -		"Usage: %s -b <image> [ -p ] [ -t ] "
> > -		"[-B <baud> ] <TTY>\n", progname);
> > +		"Usage: %s [-d | -b <image> | -D <image> ] [ -t ] [-B <baud> ] <TTY>\n",
> > +		progname);
> >  	fprintf(stream, "\n");
> > -	fprintf(stream, "  -b <image>: boot <image>\n");
> > +	fprintf(stream,
> > +		"  -b <image>: boot <image> with preamble (Kirkwood, Armada 370/XP)\n");
> >  	fprintf(stream, "  -p: patch <image> to type 0x69 (uart boot)\n");
> > +	fprintf(stream,
> > +		"  -D <image>: boot <image> without preamble (Dove)\n");
> > +	fprintf(stream, "  -d: enter debug mode\n");
> >  	fprintf(stream, "\n");
> >  	fprintf(stream, "  -t: mini terminal\n");
> >  	fprintf(stream, "\n");
> > @@ -619,6 +671,7 @@ main(int argc, char **argv)
> >  	const char *ttypath, *imgpath;
> >  	int rv, rc, tty, term, prot, patch;
> >  	void *bootmsg;
> > +	void *debugmsg;
> >  	void *img;
> >  	size_t size;
> >  	speed_t speed;
> > @@ -626,6 +679,7 @@ main(int argc, char **argv)
> >  	rv = 1;
> >  	tty = -1;
> >  	bootmsg = NULL;
> > +	debugmsg = NULL;
> >  	imgpath = NULL;
> >  	img = NULL;
> >  	term = 0;
> > @@ -636,7 +690,7 @@ main(int argc, char **argv)
> >  	kwboot_verbose = isatty(STDOUT_FILENO);
> >  
> >  	do {
> > -		int c = getopt(argc, argv, "hb:ptB:");
> > +		int c = getopt(argc, argv, "hb:ptB:dD:");
> >  		if (c < 0)
> >  			break;
> >  
> > @@ -646,6 +700,15 @@ main(int argc, char **argv)
> >  			imgpath = optarg;
> >  			break;
> >  
> > +		case 'D':
> > +			bootmsg = NULL;
> > +			imgpath = optarg;
> > +			break;
> > +
> > +		case 'd':
> > +			debugmsg = kwboot_msg_debug;
> > +			break;
> > +
> >  		case 'p':
> >  			patch = 1;
> >  			break;
> > @@ -667,7 +730,7 @@ main(int argc, char **argv)
> >  		}
> >  	} while (1);
> >  
> > -	if (!bootmsg && !term)
> > +	if (!bootmsg && !term && !debugmsg)
> >  		goto usage;
> >  
> >  	if (patch && !imgpath)
> > @@ -702,7 +765,13 @@ main(int argc, char **argv)
> >  		}
> >  	}
> >  
> > -	if (bootmsg) {
> > +	if (debugmsg) {
> > +		rc = kwboot_debugmsg(tty, debugmsg);
> > +		if (rc) {
> > +			perror("debugmsg");
> > +			goto out;
> > +		}
> > +	} else {
> >  		rc = kwboot_bootmsg(tty, bootmsg);
> >  		if (rc) {
> >  			perror("bootmsg");
> > -- 
> > 2.0.1
> > 
> > _______________________________________________
> > U-Boot mailing list
> > U-Boot@lists.denx.de
> > http://lists.denx.de/mailman/listinfo/u-boot
> _______________________________________________
> U-Boot mailing list
> U-Boot@lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
Stefan Roese June 28, 2014, 7:43 a.m. UTC | #3
Hi Luka!

On 27.06.2014 21:06, Luka Perkov wrote:
> It's great to see you working on adding support for Marvell's new SoCs :)

Thanks.

> Since now kwboot is going to support more SoCs except kirkwood it makes
> sense to rename it to mvboot. I've sent this patch long ago, dunno if it
> still applies:
>
> http://patchwork.ozlabs.org/patch/219741/

I thought about renaming the tool(s) as well. But decided against it. 
Mostly because of historical reasons. This name for the tools has been 
around for quite some time. And is documented in many README / HOWTO 
files on the web. That's why I chose to not change it, at least for now.

> Also, I'd like to test this series on some boards I have

That would be great. Thanks. Please keep me informed.

Note that I only merged some of the Kirkwood U-Boot code with the Armada 
XP code. More work could be done here. And Dove definitely can be 
squashed into this now common MVEBU infrastructure as well. Patches as 
always very welcome (after this patchset is accepted as a basis). ;)

> - do you have
> patches on some git tree that can be pulled easily?

Sure. I just uploaded a branch "marvell-armada-xp-2014-06-27" to the 
u-boot-testing git repository:

http://git.denx.de/?p=u-boot/u-boot-testing.git;a=shortlog;h=refs/heads/marvell-armada-xp-2014-06-27

Thanks,
Stefan
Wolfgang Denk July 28, 2014, 8:12 a.m. UTC | #4
Dear Daniel,

In message <1403862911-6138-23-git-send-email-sr@denx.de> Stefan Roese wrote:
...
>  tools/kwboot.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++++---------
>  1 file changed, 83 insertions(+), 14 deletions(-)

It appears that you are the original author of the kwboot.c code,
is this correct?

The file does not include any license information.  As you submitted
it to the U-Boot project, we can assume they are supposed to be
covered by the project wide license terms, but I'd rather be sure
about that.

Could you please elucidate?

Thanks.

Best regards,

Wolfgang Denk
diff mbox

Patch

diff --git a/tools/kwboot.c b/tools/kwboot.c
index e773f01..c47970e 100644
--- a/tools/kwboot.c
+++ b/tools/kwboot.c
@@ -1,5 +1,6 @@ 
 /*
- * Boot a Marvell Kirkwood SoC, with Xmodem over UART0.
+ * Boot a Marvell SoC, with Xmodem over UART0.
+ *  supports Kirkwood, Dove, Armada 370, Armada XP
  *
  * (c) 2012 Daniel Stodden <daniel.stodden@gmail.com>
  *
@@ -37,8 +38,12 @@  static unsigned char kwboot_msg_boot[] = {
 	0xBB, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
 };
 
-#define KWBOOT_MSG_REQ_DELAY	10 /* ms */
-#define KWBOOT_MSG_RSP_TIMEO	50 /* ms */
+static unsigned char kwboot_msg_debug[] = {
+	0xDD, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
+};
+
+#define KWBOOT_MSG_REQ_DELAY	1000 /* ms */
+#define KWBOOT_MSG_RSP_TIMEO	1000 /* ms */
 
 /*
  * Xmodem Transfers
@@ -184,6 +189,9 @@  kwboot_tty_send(int fd, const void *buf, size_t len)
 	int rc;
 	ssize_t n;
 
+	if (!buf)
+		return 0;
+
 	rc = -1;
 
 	do {
@@ -268,7 +276,10 @@  kwboot_bootmsg(int tty, void *msg)
 	int rc;
 	char c;
 
-	kwboot_printv("Sending boot message. Please reboot the target...");
+	if (msg == NULL)
+		kwboot_printv("Please reboot the target into UART boot mode...");
+	else
+		kwboot_printv("Sending boot message. Please reboot the target...");
 
 	do {
 		rc = tcflush(tty, TCIOFLUSH);
@@ -293,6 +304,37 @@  kwboot_bootmsg(int tty, void *msg)
 }
 
 static int
+kwboot_debugmsg(int tty, void *msg)
+{
+	int rc;
+
+	kwboot_printv("Sending debug message. Please reboot the target...");
+
+	do {
+		char buf[16];
+
+		rc = tcflush(tty, TCIOFLUSH);
+		if (rc)
+			break;
+
+		rc = kwboot_tty_send(tty, msg, 8);
+		if (rc) {
+			usleep(KWBOOT_MSG_REQ_DELAY * 1000);
+			continue;
+		}
+
+		rc = kwboot_tty_recv(tty, buf, 16, KWBOOT_MSG_RSP_TIMEO);
+
+		kwboot_spinner();
+
+	} while (rc);
+
+	kwboot_printv("\n");
+
+	return rc;
+}
+
+static int
 kwboot_xm_makeblock(struct kwboot_block *block, const void *data,
 		    size_t size, int pnum)
 {
@@ -300,6 +342,7 @@  kwboot_xm_makeblock(struct kwboot_block *block, const void *data,
 	size_t n;
 	int i;
 
+	block->soh = SOH;
 	block->pnum = pnum;
 	block->_pnum = ~block->pnum;
 
@@ -326,9 +369,15 @@  kwboot_xm_sendblock(int fd, struct kwboot_block *block)
 		if (rc)
 			break;
 
-		rc = kwboot_tty_recv(fd, &c, 1, KWBOOT_BLK_RSP_TIMEO);
-		if (rc)
-			break;
+		do {
+			rc = kwboot_tty_recv(fd, &c, 1, KWBOOT_BLK_RSP_TIMEO);
+			if (rc)
+				break;
+
+			if (c != ACK && c != NAK && c != CAN)
+				printf("%c", c);
+
+		} while (c != ACK && c != NAK && c != CAN);
 
 		if (c != ACK)
 			kwboot_progress(-1, '+');
@@ -511,7 +560,6 @@  kwboot_mmap_image(const char *path, size_t *size, int prot)
 	void *img;
 
 	rc = -1;
-	fd = -1;
 	img = NULL;
 
 	fd = open(path, O_RDONLY);
@@ -601,11 +649,15 @@  static void
 kwboot_usage(FILE *stream, char *progname)
 {
 	fprintf(stream,
-		"Usage: %s -b <image> [ -p ] [ -t ] "
-		"[-B <baud> ] <TTY>\n", progname);
+		"Usage: %s [-d | -b <image> | -D <image> ] [ -t ] [-B <baud> ] <TTY>\n",
+		progname);
 	fprintf(stream, "\n");
-	fprintf(stream, "  -b <image>: boot <image>\n");
+	fprintf(stream,
+		"  -b <image>: boot <image> with preamble (Kirkwood, Armada 370/XP)\n");
 	fprintf(stream, "  -p: patch <image> to type 0x69 (uart boot)\n");
+	fprintf(stream,
+		"  -D <image>: boot <image> without preamble (Dove)\n");
+	fprintf(stream, "  -d: enter debug mode\n");
 	fprintf(stream, "\n");
 	fprintf(stream, "  -t: mini terminal\n");
 	fprintf(stream, "\n");
@@ -619,6 +671,7 @@  main(int argc, char **argv)
 	const char *ttypath, *imgpath;
 	int rv, rc, tty, term, prot, patch;
 	void *bootmsg;
+	void *debugmsg;
 	void *img;
 	size_t size;
 	speed_t speed;
@@ -626,6 +679,7 @@  main(int argc, char **argv)
 	rv = 1;
 	tty = -1;
 	bootmsg = NULL;
+	debugmsg = NULL;
 	imgpath = NULL;
 	img = NULL;
 	term = 0;
@@ -636,7 +690,7 @@  main(int argc, char **argv)
 	kwboot_verbose = isatty(STDOUT_FILENO);
 
 	do {
-		int c = getopt(argc, argv, "hb:ptB:");
+		int c = getopt(argc, argv, "hb:ptB:dD:");
 		if (c < 0)
 			break;
 
@@ -646,6 +700,15 @@  main(int argc, char **argv)
 			imgpath = optarg;
 			break;
 
+		case 'D':
+			bootmsg = NULL;
+			imgpath = optarg;
+			break;
+
+		case 'd':
+			debugmsg = kwboot_msg_debug;
+			break;
+
 		case 'p':
 			patch = 1;
 			break;
@@ -667,7 +730,7 @@  main(int argc, char **argv)
 		}
 	} while (1);
 
-	if (!bootmsg && !term)
+	if (!bootmsg && !term && !debugmsg)
 		goto usage;
 
 	if (patch && !imgpath)
@@ -702,7 +765,13 @@  main(int argc, char **argv)
 		}
 	}
 
-	if (bootmsg) {
+	if (debugmsg) {
+		rc = kwboot_debugmsg(tty, debugmsg);
+		if (rc) {
+			perror("debugmsg");
+			goto out;
+		}
+	} else {
 		rc = kwboot_bootmsg(tty, bootmsg);
 		if (rc) {
 			perror("bootmsg");