I did several tests for my b'd that has CFI Nor erase/write problem.

My main problem is that flash_toggle() function doesn't work properly,
it always returns 0 even while bus writing operation is proceeding.
I mean, toggle bit doesn't toggle for each read operation. (refer to
drivers/mtd/cfi_flash.c)

I found two workarounds.

First, small waiting between each read. So, following code doesn't work.

<SNIP>
retval = flash_read16(addr) != flash_read16(addr);
<SNIP>

But, following code does work.

<SNIP>
u16 d = flash_read16(addr);
udelay(1);
u16 t = flash_read16(addr);
retval = d != t;
<SNIP>

I tried to increase read wait cycle to maximum which my chip allows, but
has no effect. Only waiting small period between each read can solve the
problem.


Second workaround, I defined slightly modified version of
flash_read_word() functions like following:

<SNIP>
static inline ushort flash_read_one_word (flash_info_t * info,
flash_sect_t sect, uint offset)
{
        ushort *addr, retval;

        addr = flash_map (info, sect, offset);
        retval = flash_read16 (addr);
        flash_unmap (info, sect, offset, addr);
        return retval;
}
<SNIP>

And flash_toggle() function is changed like this:

<SNIP>
retval = flash_read_one_word(info, sect, offset) !=
flash_read_one_word(info, sect, offset);
<SNIP>

This trick works perfectly on my board, without any delay.
I don't know exactly that this is caused by specific bus access
mechanism, or simply chip silicon bug.

flash_read_uchar(), flash_read_word() can be modified to get another
parameter for sector. (flash_read_long() already gets sector)
And, flash_read_long_long() function may needs to be defined.

What do you think about this? Is there any side effect between each
platform?

Regards,
Choe, Hyun-ho

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to