The (now obsolete) atngw100 flash programming code was having problems
programming the onboard at49bv642 chip. The atstk1000 flash
programming code may have the same bug, so import fix for this problem
from the AVR32 Linux BSP.

Signed-off-by: Haavard Skinnemoen <[EMAIL PROTECTED]>
---
 board/atmel/atstk1000/flash.c |   31 ++++++++++++++++++++++---------
 1 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/board/atmel/atstk1000/flash.c b/board/atmel/atstk1000/flash.c
index 93d790f..4047825 100644
--- a/board/atmel/atstk1000/flash.c
+++ b/board/atmel/atstk1000/flash.c
@@ -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)
-- 
1.5.3.8


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
U-Boot-Users mailing list
U-Boot-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/u-boot-users

Reply via email to