[U-Boot-Users] [BUG]: redundand copy of the environment data on 32bit flash chips

Bogdan Woldert-Jokisz bwoldert at giga-stream.de
Thu Apr 3 14:00:23 CEST 2003


hi

I use a board with a 32bit flash chip with u-boot-0.2.0. It works fine.

I need the redundant copy of the environment data and there is a problem.

The command saveenv writes correctly the environment data into the defined
sector of the flash, but can't deactivate/activate one of the environment
sectors if it's not empty.

I find out: the function write_word in board/walnut405/flash.c returns code
2 (Flash not erased) from the following statement:

        ...
        /* Check if Flash is (sufficiently) erased */
        if ((*((volatile FLASH_WORD_SIZE *) dest) &
            (FLASH_WORD_SIZE) data) != (FLASH_WORD_SIZE) data)

                return (2);
        }

        for (i = 0; i < 4 / sizeof (FLASH_WORD_SIZE); i++) {
                int flag;

                /* Disable interrupts which might cause a timeout here */
                flag = disable_interrupts ();
                ...


I thing it should be to:

        ...
        /* Check if Flash is (sufficiently) erased */
/*        if ((*((volatile FLASH_WORD_SIZE *) dest) &
            (FLASH_WORD_SIZE) data) != (FLASH_WORD_SIZE) data)

                return (2);
        } */

        for (i = 0; i < 4 / sizeof (FLASH_WORD_SIZE); i++) {
                int flag;

                /* Check if Flash is (sufficiently) erased */
                if ( ( dest2[i] & data2[i] ) != data2[i] )

                        return (2);
                }

                /* Disable interrupts which might cause a timeout here */
                flag = disable_interrupts ();
                ...


This change works on my board (self-development) fine.


Reason (only in german, sorry):

Mit der If-Anweisung moechte man sicherstellen, dass nicht versucht wird ein
0-Bit mit einem 1-Bit zu ueberschreiben. FLASH_WORD_SIZE ist auf unsigned
short definiert. Die Adressierung des Flashes finget 32Bit-weise statt, d.h.
dest und data sind 32Bit lang.

Falls beim savenv einer der Sektoren aktiviert oder deaktiviert werden soll,
dann unterscheiden sich dest und data lediglich in dem 17-ten Bit (das
Flag).

"*((volatile FLASH_WORD_SIZE *) dest)" liefert die zwei Byte aus dem Flash,
die ueberschreiben werden sollen; die oberen zwei Bytes der 32Bit.
"(FLASH_WORD_SIZE) data" hingegen liefert die unteren zwei Bytes von data.
Es muessten aber auch die oberen sein.

Man koennte die If-Anweisung an der Stelle lassen, an der sie stand und nur
die Typecasts weglassen, damit die gesammten 32Bit miteinander verglichen
werden. Da gibt es noch ein Problem (* auf ulong), dass aber sicherlich
loesbar ist. Ich kenne mich damit nicht so gut aus.


Gruesse
  Bogdan





More information about the U-Boot mailing list