[flashrom] [PATCH] Make Bus Pirate init more robust
Mattias Mattsson
vitplister at gmail.com
Fri Sep 17 00:27:18 CEST 2010
On Fri, Jul 23, 2010 at 22:52, Carl-Daniel Hailfinger
<c-d.hailfinger.devel.2006 at gmx.net> wrote:
> Thanks to Johannes Sjölund for reporting that the Bus Pirate init could
> not deal with a Bus Pirate which is already in binary Bitbang mode. This
> is caused by a combination of the slowness of the Bus Pirate, the
> slowness of USB and a fast serial port flush routine which just flushes
> the buffer contents and does not wait until data arrival stops.
>
> Make the Bus Pirate init more robust by running the flush command 10
> times with 1.5 ms delay in between.
>
> This code development was sponsored by Mattias Mattsson. Thanks!
> Tested a few dozen times, should work reliably.
>
> Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006 at gmx.net>
Acked-by: Mattias Mattsson <vitplister at gmail.com>
> Index: flashrom-buspirate_resilient_init/buspirate_spi.c
> ===================================================================
> --- flashrom-buspirate_resilient_init/buspirate_spi.c (Revision 1099)
> +++ flashrom-buspirate_resilient_init/buspirate_spi.c (Arbeitskopie)
> @@ -22,6 +22,7 @@
> #include <string.h>
> #include <stdlib.h>
> #include <ctype.h>
> +#include <unistd.h>
> #include "flash.h"
> #include "chipdrivers.h"
> #include "spi.h"
> @@ -140,6 +141,20 @@
> /* Read any response and discard it. */
> sp_flush_incoming();
> }
> + /* USB is slow. The Bus Pirate is even slower. Apparently the flush
> + * action above is too fast or too early. Some stuff still remains in
> + * the pipe after the flush above, and one additional flush is not
> + * sufficient either. Use a 1.5 ms delay inside the loop to make
> + * mostly sure that at least one USB frame had time to arrive.
> + * Looping only 5 times is not sufficient and causes the
> + * ocassional failure.
> + * Folding the delay into the loop above is not reliable either.
> + */
> + for (i = 0; i < 10; i++) {
> + usleep(1500);
> + /* Read any response and discard it. */
> + sp_flush_incoming();
> + }
> /* Enter raw bitbang mode */
> buf[0] = 0x00;
> ret = buspirate_sendrecv(buf, 1, 5);
> @@ -147,6 +162,8 @@
> return ret;
> if (memcmp(buf, "BBIO", 4)) {
> msg_perr("Entering raw bitbang mode failed!\n");
> + msg_pdbg("Got %02x%02x%02x%02x%02x\n",
> + buf[0], buf[1], buf[2], buf[3], buf[4]);
> return 1;
> }
> msg_pdbg("Raw bitbang mode version %c\n", buf[4]);
> @@ -158,8 +175,12 @@
> /* Enter raw SPI mode */
> buf[0] = 0x01;
> ret = buspirate_sendrecv(buf, 1, 4);
> + if (ret)
> + return ret;
> if (memcmp(buf, "SPI", 3)) {
> msg_perr("Entering raw SPI mode failed!\n");
> + msg_pdbg("Got %02x%02x%02x%02x\n",
> + buf[0], buf[1], buf[2], buf[3]);
> return 1;
> }
> msg_pdbg("Raw SPI mode version %c\n", buf[3]);
> Index: flashrom-buspirate_resilient_init/serial.c
> ===================================================================
> --- flashrom-buspirate_resilient_init/serial.c (Revision 1099)
> +++ flashrom-buspirate_resilient_init/serial.c (Arbeitskopie)
> @@ -199,8 +199,10 @@
> #else
> tmp = write(sp_fd, buf, writecnt);
> #endif
> - if (tmp == -1)
> + if (tmp == -1) {
> + msg_perr("Serial port write error!\n");
> return 1;
> + }
> if (!tmp)
> msg_pdbg("Empty write\n");
> writecnt -= tmp;
> @@ -220,8 +222,10 @@
> #else
> tmp = read(sp_fd, buf, readcnt);
> #endif
> - if (tmp == -1)
> + if (tmp == -1) {
> + msg_perr("Serial port read error!\n");
> return 1;
> + }
> if (!tmp)
> msg_pdbg("Empty read\n");
> readcnt -= tmp;
>
>
> --
> http://www.hailfinger.org/
>
>
> _______________________________________________
> flashrom mailing list
> flashrom at flashrom.org
> http://www.flashrom.org/mailman/listinfo/flashrom
More information about the flashrom
mailing list