I don't think that will work. Multiplying the offsets by two won't
always work (i.e. offset 2AA * 2 != 555). I think this will require a
more substantial fix. I started working on something but it may take me
a few days, though I have both an 8-bit and a 16-bit board to play with
(though no 8-bit chip on a 16-bit bus).

-Aaron

On 03/18/2011 12:12 AM, Rogan Dawes wrote:
> On 2011/03/18 6:02 AM, Aaron Williams wrote:
>> Hi,
>>
>> I am running into issues in that the CFI code is broken for flash with an 8-
>> bit bus. The problem is that the CFI code uses the wrong addresses for 
>> 8-bits 
>> vs 16-bits.
>>
>> The CFI function flash_map incorrectly calculates the byte offset with 
>> Spansion flash.
>>
>> In our case, we have an 8-bit Spansion S29GL-N MirrorBit flash chip on an 8-
>> bit bus.
>>
>> According to the data sheet, in 8-bit mode the first unlock address is 0xAAA 
>> and the second is 0x555. Basically all of the addresses are approximately 
>> double what they are in 16-bit mode.
>>
>> Most of the addresses in the CFI code are wrong for 8-bit mode.
>>
>> They should be as follows:
>> unlock1: 0xAAA
>> unlock2: 0x555
>> CFI Query: 0xAA
>>
>> Offset Device ID: 0x02, 0x1c, 0x1e
>> Offset Silicon Sector Factory Protect: 0x6
>> Sector protect verify (sector address) + 4
>>
>> The problem is that the dectection code detects (incorrectly) that we're an 
>> 8-
>> bit device on a 16-bit bus when in fact it's an 8-bit bus.
>>
>> For 16-bits, it's:
>>
>> unlock1: 0x555
>> unlock2: 0x2aa
>> CFI Query: 0x55
>> Offset Device ID: 0x1, 0x0e, 0x0f
>>
>> Now, in 16-bit mode these addresses should be effectively doubled so they 
>> should look to be the same to software as I understand it.
>>
>> This is all taken from the datasheet.
>>
>> Note that the CFI code works fine with the flash hooked up as 16-bit on a 16-
>> bit bus.
>>
>> If it's an 8-bit flash on a 16-bit bus then the addresses should be doubled.
>>
>> -Aaron
> Hi Aaron,
>
> Does this patch (originally by Stefan Roese) work for you? I also need
> it for the DNS323 port. FWIW, mine is also a Spansion flash
> (S29GL064M90TFIR4), although I am not 100% sure of the layout and
> connectivity.
>
> Rogan
>
> ---
>  drivers/mtd/cfi_flash.c |   22 +++++++++++++++++++++-
>  1 files changed, 21 insertions(+), 1 deletions(-)
>
> diff --git a/drivers/mtd/cfi_flash.c b/drivers/mtd/cfi_flash.c
> index dd394a8..74e9ade 100644
> --- a/drivers/mtd/cfi_flash.c
> +++ b/drivers/mtd/cfi_flash.c
> @@ -291,6 +291,9 @@ static inline uchar flash_read_uchar (flash_info_t *
> info, uint offset)
>       uchar *cp;
>       uchar retval;
>
> +#if 1 // test-only
> +     offset = offset * 2;
> +#endif
>       cp = flash_map (info, 0, offset);
>  #if defined(__LITTLE_ENDIAN) || defined(CONFIG_SYS_WRITE_SWAPPED_DATA)
>       retval = flash_read8(cp);
> @@ -308,6 +311,9 @@ static inline ushort flash_read_word (flash_info_t *
> info, uint offset)
>  {
>       ushort *addr, retval;
>
> +#if 1 // test-only
> +     offset = offset * 2;
> +#endif
>       addr = flash_map (info, 0, offset);
>       retval = flash_read16 (addr);
>       flash_unmap (info, 0, offset, addr);
> @@ -328,6 +334,9 @@ static ulong flash_read_long (flash_info_t * info,
> flash_sect_t sect,
>  #ifdef DEBUG
>       int x;
>  #endif
> +#if 1 // test-only
> +     offset = offset * 2;
> +#endif
>       addr = flash_map (info, sect, offset);
>
>  #ifdef DEBUG
> @@ -363,6 +372,9 @@ void flash_write_cmd (flash_info_t * info,
> flash_sect_t sect,
>       void *addr;
>       cfiword_t cword;
>
> +#if 1 // test-only
> +     offset = offset * 2;
> +#endif
>       addr = flash_map (info, sect, offset);
>       flash_make_cmd (info, cmd, &cword);
>       switch (info->portwidth) {
> @@ -420,6 +432,9 @@ static int flash_isequal (flash_info_t * info,
> flash_sect_t sect,
>       cfiword_t cword;
>       int retval;
>
> +#if 1 // test-only
> +     offset = offset * 2;
> +#endif
>       addr = flash_map (info, sect, offset);
>       flash_make_cmd (info, cmd, &cword);
>
> @@ -1762,6 +1777,7 @@ static int __flash_detect_cfi (flash_info_t *
> info, struct cfi_qry *qry)
>                       info->addr_unlock1 = 0x555;
>                       info->addr_unlock2 = 0x2aa;
>
> +#if 0 // test-only
>                       /*
>                        * modify the unlock address if we are
>                        * in compatibility mode
> @@ -1776,6 +1792,7 @@ static int __flash_detect_cfi (flash_info_t *
> info, struct cfi_qry *qry)
>                               info->addr_unlock1 = 0xaaa;
>                               info->addr_unlock2 = 0x555;
>                       }
> +#endif
>
>                       info->name = "CFI conformant";
>                       return 1;
> @@ -1942,11 +1959,13 @@ ulong flash_get_size (phys_addr_t base, int banknum)
>               debug ("cfi version is 0x%04x\n", info->cfi_version);
>
>               size_ratio = info->portwidth / info->chipwidth;
> +#if 0 // test-only
>               /* if the chip is x8/x16 reduce the ratio by half */
>               if ((info->interface == FLASH_CFI_X8X16)
>                   && (info->chipwidth == FLASH_CFI_BY8)) {
>                       size_ratio >>= 1;
>               }
> +#endif
>               debug ("size_ratio %d port %d bits chip %d bits\n",
>                      size_ratio, info->portwidth << CFI_FLASH_SHIFT_WIDTH,
>                      info->chipwidth << CFI_FLASH_SHIFT_WIDTH);
> @@ -2034,12 +2053,13 @@ ulong flash_get_size (phys_addr_t base, int banknum)
>               /* round up when converting to ms */
>               info->write_tout = (tmp + 999) / 1000;
>               info->flash_id = FLASH_MAN_CFI;
> +#if 0
>               if ((info->interface == FLASH_CFI_X8X16) &&
>                   (info->chipwidth == FLASH_CFI_BY8)) {
>                       /* XXX - Need to test on x8/x16 in parallel. */
>                       info->portwidth >>= 1;
>               }
> -
> +#endif
>               flash_write_cmd (info, 0, 0, info->cmd_reset);
>       }
>

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

Reply via email to