|
@@ -159,7 +159,7 @@ int __flashprog write_buff(flash_info_t *info, uchar *src,
|
|
|
{
|
|
|
unsigned long flags;
|
|
|
uint16_t *base, *p, *s, *end;
|
|
|
- uint16_t word, status;
|
|
|
+ uint16_t word, status, status1;
|
|
|
int ret = ERR_OK;
|
|
|
|
|
|
if (addr < info->start[0]
|
|
@@ -194,20 +194,33 @@ int __flashprog write_buff(flash_info_t *info, uchar *src,
|
|
|
sync_write_buffer();
|
|
|
|
|
|
/* Wait for completion */
|
|
|
+ status1 = readw(p);
|
|
|
do {
|
|
|
/* TODO: Timeout */
|
|
|
- status = readw(p);
|
|
|
- } while ((status != word) && !(status & 0x28));
|
|
|
+ status = status1;
|
|
|
+ status1 = readw(p);
|
|
|
+ } while (((status ^ status1) & 0x40) /* toggled */
|
|
|
+ && !(status1 & 0x28)); /* error bits */
|
|
|
|
|
|
- writew(0xf0, base);
|
|
|
- readw(base);
|
|
|
-
|
|
|
- if (status != word) {
|
|
|
- printf("Flash write error at address 0x%p: 0x%02x\n",
|
|
|
- p, status);
|
|
|
+ /*
|
|
|
+ * We'll need to check once again for toggle bit
|
|
|
+ * because the toggle bit may stop toggling as I/O5
|
|
|
+ * changes to "1" (ref at49bv642.pdf p9)
|
|
|
+ */
|
|
|
+ status1 = readw(p);
|
|
|
+ status = readw(p);
|
|
|
+ if ((status ^ status1) & 0x40) {
|
|
|
+ printf("Flash write error at address 0x%p: "
|
|
|
+ "0x%02x != 0x%02x\n",
|
|
|
+ p, status,word);
|
|
|
ret = ERR_PROG_ERROR;
|
|
|
+ writew(0xf0, base);
|
|
|
+ readw(base);
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ writew(0xf0, base);
|
|
|
+ readw(base);
|
|
|
}
|
|
|
|
|
|
if (flags)
|