summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--82802ab.c23
-rw-r--r--ft2232_spi.c27
-rw-r--r--sb600spi.c5
3 files changed, 28 insertions, 27 deletions
diff --git a/82802ab.c b/82802ab.c
index d7194c1..b274d56 100644
--- a/82802ab.c
+++ b/82802ab.c
@@ -33,13 +33,13 @@
// I need that Berkeley bit-map printer
void print_82802ab_status(uint8_t status)
{
- printf("%s", status & 0x80 ? "Ready:" : "Busy:");
- printf("%s", status & 0x40 ? "BE SUSPEND:" : "BE RUN/FINISH:");
- printf("%s", status & 0x20 ? "BE ERROR:" : "BE OK:");
- printf("%s", status & 0x10 ? "PROG ERR:" : "PROG OK:");
- printf("%s", status & 0x8 ? "VP ERR:" : "VPP OK:");
- printf("%s", status & 0x4 ? "PROG SUSPEND:" : "PROG RUN/FINISH:");
- printf("%s", status & 0x2 ? "WP|TBL#|WP#,ABORT:" : "UNLOCK:");
+ printf_debug("%s", status & 0x80 ? "Ready:" : "Busy:");
+ printf_debug("%s", status & 0x40 ? "BE SUSPEND:" : "BE RUN/FINISH:");
+ printf_debug("%s", status & 0x20 ? "BE ERROR:" : "BE OK:");
+ printf_debug("%s", status & 0x10 ? "PROG ERR:" : "PROG OK:");
+ printf_debug("%s", status & 0x8 ? "VP ERR:" : "VPP OK:");
+ printf_debug("%s", status & 0x4 ? "PROG SUSPEND:" : "PROG RUN/FINISH:");
+ printf_debug("%s", status & 0x2 ? "WP|TBL#|WP#,ABORT:" : "UNLOCK:");
}
int probe_82802ab(struct flashchip *flash)
@@ -98,20 +98,19 @@ int erase_82802ab_block(struct flashchip *flash, int offset)
// clear status register
chip_writeb(0x50, bios);
- //printf("Erase at %p\n", bios);
+
// clear write protect
- //printf("write protect is at %p\n", (wrprotect));
- //printf("write protect is 0x%x\n", *(wrprotect));
chip_writeb(0, wrprotect);
- //printf("write protect is 0x%x\n", *(wrprotect));
// now start it
chip_writeb(0x20, bios);
chip_writeb(0xd0, bios);
programmer_delay(10);
+
// now let's see what the register is
status = wait_82802ab(flash->virtual_memory);
- //print_82802ab_status(status);
+ print_82802ab_status(status);
+
if (check_erased_range(flash, offset, flash->page_size)) {
fprintf(stderr, "ERASE FAILED!\n");
return -1;
diff --git a/ft2232_spi.c b/ft2232_spi.c
index ee8d67d..7f5da23 100644
--- a/ft2232_spi.c
+++ b/ft2232_spi.c
@@ -70,7 +70,6 @@ int ft2232_spi_init(void)
int f;
struct ftdi_context *ftdic = &ftdic_context;
unsigned char buf[512];
- unsigned char port_val = 0;
char *portpos = NULL;
int ft2232_type = FTDI_FT4232H;
enum ftdi_interface ft2232_interface = INTERFACE_B;
@@ -175,9 +174,8 @@ int ft2232_spi_init(void)
* dir: 0x0b CS=output, DI=input, DO=output, SK=output
*/
#define CS_BIT 0x08
-
buf[0] = SET_BITS_LOW;
- buf[1] = (port_val = CS_BIT);
+ buf[1] = CS_BIT;
buf[2] = 0x0b;
if (send_buf(ftdic, buf, 3))
return -1;
@@ -195,7 +193,6 @@ int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,
{
struct ftdi_context *ftdic = &ftdic_context;
static unsigned char *buf = NULL;
- unsigned char port_val = 0;
int i, ret = 0;
if (writecnt > 65536 || readcnt > 65536)
@@ -213,10 +210,11 @@ int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,
* as possible together. if we're not expecting to
* read, we can assert CS, write, and deassert CS all
* in one shot. if reading, we do three separate
- * operations. */
+ * operations.
+ */
printf_debug("Assert CS#\n");
buf[i++] = SET_BITS_LOW;
- buf[i++] = (port_val &= ~CS_BIT);
+ buf[i++] = 0 & ~CS_BIT; /* assertive */
buf[i++] = 0x0b;
if (writecnt) {
@@ -236,20 +234,19 @@ int ft2232_spi_send_command(unsigned int writecnt, unsigned int readcnt,
buf[i++] = ((readcnt - 1) >> 8) & 0xff;
ret = send_buf(ftdic, buf, i);
i = 0;
- if (ret) goto deassert_cs;
-
- /* FIXME: This is unreliable. There's no guarantee that we read
- * the response directly after sending the read command.
- * We may be scheduled out etc.
- */
- ret = get_buf(ftdic, readarr, readcnt);
+ if (ret == 0) {
+ /* FIXME: This is unreliable. There's no guarantee that we read
+ * the response directly after sending the read command.
+ * We may be scheduled out etc.
+ */
+ ret = get_buf(ftdic, readarr, readcnt);
+ }
}
-deassert_cs:
printf_debug("De-assert CS#\n");
buf[i++] = SET_BITS_LOW;
- buf[i++] = (port_val |= CS_BIT);
+ buf[i++] = CS_BIT;
buf[i++] = 0x0b;
if (send_buf(ftdic, buf, i))
return -1;
diff --git a/sb600spi.c b/sb600spi.c
index 0738a86..5965b3b 100644
--- a/sb600spi.c
+++ b/sb600spi.c
@@ -64,6 +64,11 @@ int sb600_spi_write_1(struct flashchip *flash, uint8_t *buf)
printf("Programming flash");
for (i = 0; i < total_size; i++, buf++) {
result = spi_byte_program(i, *buf);
+ if (result) {
+ // spi_byte_program reported the error for us already
+ printf_debug("... continuing anyway.\n");
+ }
+
/* wait program complete. */
if (i % 0x8000 == 0)
printf(".");
OpenPOWER on IntegriCloud