diff mbox

[U-Boot] U-boot: Erase/read/write issue with S25fl256S flash device

Message ID 51BEB3AB.6020603@ti.com
State Rejected
Delegated to: Jagannadha Sutradharudu Teki
Headers show

Commit Message

Poddar, Sourav June 17, 2013, 6:58 a.m. UTC
HI Jagan,
On Monday 17 June 2013 12:17 PM, Jagan Teki wrote:
> Hi Sourav,
>
> On Mon, Jun 17, 2013 at 11:44 AM, Sourav Poddar<sourav.poddar@ti.com>  wrote:
>> Hi Jagan,
>>
>> On Saturday 15 June 2013 09:47 PM, Jagan Teki wrote:
>>> On 14-06-2013 20:13, Sourav Poddar wrote:
>>>> Hi Jagan,
>>>> On Friday 14 June 2013 08:08 PM, Jagan Teki wrote:
>>>>> On 14-06-2013 20:03, Sourav Poddar wrote:
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> On Wednesday 12 June 2013 01:00 PM, Sourav Poddar wrote:
>>>>>>> Hi,
>>>>>>>
>>>>>>> I am working on qspi flash device S25FL256S at u-boot level. I am
>>>>>>> trying to
>>>>>>> make use of the existing spi_flash.c framework available at u-boot for
>>>>>>> erasing/reading/writing
>>>>>>> into the flash device.
>>>>>>>
>>>>>>> There are several issues(mentioned below), which I faced while using
>>>>>>> S25FL256s flash device
>>>>>>> with my dra7xx board which has a qspi controller to which the above
>>>>>>> mentioned flash device is attached.
>>>>>>>
>>>>>>> 1. Erase (spi_flash_cmd_erase)
>>>>>>>
>>>>>>> Issuing a command something like this..
>>>>>>>
>>>>>>> sf erase 0x0 0x50000
>>>>>>>   - erases only first 0x20000 bytes of flash device, anything above
>>>>>>> that is not erase. I need to
>>>>>>>     issue separate commands after 0x20000 for every 0x10000 bytes.
>>>>>>>
>>>>>>> Am i missing anything here?
>>>>>>>
>>>>>>> 2. read
>>>>>>>
>>>>>>> sf read 81000000 0 0x10000
>>>>>>>
>>>>>>> Read is not happening properly. The last few byte along the 4k
>>>>>>> boundary always shows zero.
>>>>>>> Above 4k bytes, read is not happening.
>>>>>>>
>>>>>>> For ex:
>>>>>>>   DRA752 EVM # md 81000f00
>>>>>>> 81000f00: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000f10: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000f20: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000f30: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000f40: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000f50: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000f60: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000f70: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000f80: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000f90: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000fa0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000fb0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000fc0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000fd0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000fe0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>> 81000ff0: ffffffff ffffffff 00ffffff 00000000    ................
>>>>>>>
>>>>>>> In this dump, if you see 81000ff0 the last column shows 000000 which
>>>>>>> is
>>>>>>> not expected. and it happens along every 4k bytes.
>>>>>>>
>>>>>>>
>>>>>>> So, to get rid of the above issue, I switched to page read with the
>>>>>>> below patch[1],
>>>>>>> which is giving me the correct result.
>>>>>>> [1]:
>>>>>>> @@ -147,17 +153,40 @@ int spi_flash_read_common(struct spi_flash
>>>>>>> *flash, const u8 *cmd,
>>>>>>>   int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
>>>>>>>                  size_t len, void *data)
>>>>>>>   {
>>>>>>> -       u8 cmd[5];
>>>>>>> +       unsigned long page_addr, byte_addr, page_size;
>>>>>>> +       size_t chunk_len, actual;
>>>>>>> +       int ret = 0;
>>>>>>> +       u8 cmd[4];
>>>>>>>
>>>>>>>          /* Handle memory-mapped SPI */
>>>>>>>          if (flash->memory_map)
>>>>>>>                  memcpy(data, flash->memory_map + offset, len);
>>>>>>> +       page_size = flash->page_size;
>>>>>>> +       page_addr = offset / page_size;
>>>>>>> +       byte_addr = offset % page_size;
>>>>>>> +
>>>>>>> +       cmd[0] = CMD_READ_ARRAY_SLOW;
>>>>>>> +       for (actual = 0; actual<  len; actual += chunk_len) {
>>>>>>> +               chunk_len = min(len - actual, page_size - byte_addr);
>>>>>>> +
>>>>>>> +               cmd[1] = page_addr>>  8;
>>>>>>> +               cmd[2] = page_addr;
>>>>>>> +               cmd[3] = byte_addr;
>>>>>>> +
>>>>>>> +               ret = spi_flash_read_common(flash, cmd, sizeof(cmd),
>>>>>>> data + actual, chunk_len);
>>>>>>> +               if (ret<  0) {
>>>>>>> +                       debug("SF: read failed");
>>>>>>> +                       break;
>>>>>>> +               }
>>>>>>>
>>>>>>> -       cmd[0] = CMD_READ_ARRAY_FAST;
>>>>>>> -       spi_flash_addr(offset, cmd);
>>>>>>> -       cmd[4] = 0x00;
>>>>>>> +               byte_addr += chunk_len;
>>>>>>> +               if (byte_addr == page_size) {
>>>>>>> +                       page_addr++;
>>>>>>> +                       byte_addr = 0;
>>>>>>> +               }
>>>>>>> +       }
>>>>>>>
>>>>>>> -       return spi_flash_read_common(flash, cmd, sizeof(cmd), data,
>>>>>>> len);
>>>>>>> +       return ret;
>>>>>>>   }
>>>>>>>
>>>>>>> Any idea about this?
>>>>>>>
>>>>>>> 3.  write (spi_flash_cmd_write_multi)
>>>>>>>    write not happening properly.
>>>>>>>
>>>>>>> observations: only able to write single page, anything after a page is
>>>>>>> not getting
>>>>>>>          written.
>>>>>>> Workaround:
>>>>>>> I did a write disable latch at the end of every write cycle(page
>>>>>>> program) and enable it
>>>>>>> again for the next loop. With this, I see I get rid of the above
>>>>>>> issue.
>>>>>>>
>>>>>>>   @@ -117,6 +117,12 @@ int spi_flash_cmd_write_multi(struct spi_flash
>>>>>>> *flash, u32 offset,
>>>>>>>                  if (ret)
>>>>>>>                          break;
>>>>>>>
>>>>>>> +               ret = spi_flash_cmd_write_disable(flash);
>>>>>>> +               if (ret<  0) {
>>>>>>> +                       printf("SF: disabling write failed\n");
>>>>>>> +                       break;
>>>>>>> +               }
>>>>>>> +
>>>>>>>
>>>>>>>
>>>>>>> Have anyone seen the above mentioned issues regarding
>>>>>>> read/write/erase? OR is there any
>>>>>>> configurations that I might be missing ?
>>>>>>>
>>>>>> Any Input on this?
>>>>>
>>>>> Please wait, I am pushing some changes tonight or so.
>>>>>
>>>>> We will continue this thread, after testing your part with these new
>>>>> changes.
>>>>>
>>>>> I will intimate you once the push done.
>>>>>
>>>>> --
>>>>> Thanks,
>>>>> Jagan.
>>>>>
>>>>>
>>>> Thanks a lot for the reply.
>>>> Sure, will wait for your changes to go in.
>>>
>>> Will take some time go these changes on master.
>>>
>>> Please checkout master-work branch in u-boot-spi repo
>>> git://git.denx.de/u-boot-spi.git
>>>
>>> and try to test 256S parts, fyi: I tested the same part got the
>>> +ve result.
>>>
>> Tested the above tree on my board.
>> But, still the issues remain the same for me in all the three
>> cases(erase/read/write).
>>
>> Here is the short log of the read command..
>> DRA752 EVM # sf probe 0
>> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
>> SF: Warning - Only lower 16MiB accessible, Full access #define
>> CONFIG_SPI_FLASH_BAR
>> DRA752 EVM # sf erase 0x0 0x10000
>> SF: 65536 bytes @ 0x0 Erased: OK
>> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
>> DRA752 EVM # sf read 0x81003000 0x0 0x10000
>> SF: 65536 bytes @ 0x0 Read: OK
>> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
>> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
>> Total of 4091 byte(s) were the same
>>
>>
>> Erase: not able to do with a single command, need to issue for every 0x10000
>> bytes.
>>
>> Write: Need to disable latch after every write to make it properly work.
>>
>> Is it possible for you to  give me  basic commands which you might have ran
>> to confirm
>> the read/write and erase ??
> I tested the same part - for me i couldn't see the issues with SL256S
>
> OK! can enable the log on poll function, spi_flash_cmd_wait_ready()
> make debug ->  printf.
> Do the same test.! and send the log file.
>
> --
> Thanks,
> Jagan.
Here is the output log, no change..

DRA752 EVM # sf probe 0
SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
DRA752 EVM # sf erase 0x0 0x10000
SF: 65536 bytes @ 0x0 Erased: OK
DRA752 EVM # mw.b 0x81000100 0xff 0x10000
DRA752 EVM # sf read 0x81003000 0x0 0x10000
SF: 65536 bytes @ 0x0 Read: OK
DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
Total of 4091 byte(s) were the same
DRA752 EVM #


Code change: for above output.
         }
@@ -109,7 +109,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash 
*flash, unsigned long timeout)
                 return 0;

         /* Timed out */
-       debug("SF: time out!\n");
+       printf("SF: time out!\n");
         return -1;
  }



~Sourav

Comments

Jagan Teki June 17, 2013, 7:05 a.m. UTC | #1
On Mon, Jun 17, 2013 at 12:28 PM, Sourav Poddar <sourav.poddar@ti.com> wrote:
> HI Jagan,
>
> On Monday 17 June 2013 12:17 PM, Jagan Teki wrote:
>>
>> Hi Sourav,
>>
>> On Mon, Jun 17, 2013 at 11:44 AM, Sourav Poddar<sourav.poddar@ti.com>
>> wrote:
>>>
>>> Hi Jagan,
>>>
>>> On Saturday 15 June 2013 09:47 PM, Jagan Teki wrote:
>>>>
>>>> On 14-06-2013 20:13, Sourav Poddar wrote:
>>>>>
>>>>> Hi Jagan,
>>>>> On Friday 14 June 2013 08:08 PM, Jagan Teki wrote:
>>>>>>
>>>>>> On 14-06-2013 20:03, Sourav Poddar wrote:
>>>>>>>
>>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> On Wednesday 12 June 2013 01:00 PM, Sourav Poddar wrote:
>>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> I am working on qspi flash device S25FL256S at u-boot level. I am
>>>>>>>> trying to
>>>>>>>> make use of the existing spi_flash.c framework available at u-boot
>>>>>>>> for
>>>>>>>> erasing/reading/writing
>>>>>>>> into the flash device.
>>>>>>>>
>>>>>>>> There are several issues(mentioned below), which I faced while using
>>>>>>>> S25FL256s flash device
>>>>>>>> with my dra7xx board which has a qspi controller to which the above
>>>>>>>> mentioned flash device is attached.
>>>>>>>>
>>>>>>>> 1. Erase (spi_flash_cmd_erase)
>>>>>>>>
>>>>>>>> Issuing a command something like this..
>>>>>>>>
>>>>>>>> sf erase 0x0 0x50000
>>>>>>>>   - erases only first 0x20000 bytes of flash device, anything above
>>>>>>>> that is not erase. I need to
>>>>>>>>     issue separate commands after 0x20000 for every 0x10000 bytes.
>>>>>>>>
>>>>>>>> Am i missing anything here?
>>>>>>>>
>>>>>>>> 2. read
>>>>>>>>
>>>>>>>> sf read 81000000 0 0x10000
>>>>>>>>
>>>>>>>> Read is not happening properly. The last few byte along the 4k
>>>>>>>> boundary always shows zero.
>>>>>>>> Above 4k bytes, read is not happening.
>>>>>>>>
>>>>>>>> For ex:
>>>>>>>>   DRA752 EVM # md 81000f00
>>>>>>>> 81000f00: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000f10: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000f20: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000f30: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000f40: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000f50: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000f60: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000f70: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000f80: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000f90: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000fa0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000fb0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000fc0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000fd0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000fe0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>> 81000ff0: ffffffff ffffffff 00ffffff 00000000    ................
>>>>>>>>
>>>>>>>> In this dump, if you see 81000ff0 the last column shows 000000 which
>>>>>>>> is
>>>>>>>> not expected. and it happens along every 4k bytes.
>>>>>>>>
>>>>>>>>
>>>>>>>> So, to get rid of the above issue, I switched to page read with the
>>>>>>>> below patch[1],
>>>>>>>> which is giving me the correct result.
>>>>>>>> [1]:
>>>>>>>> @@ -147,17 +153,40 @@ int spi_flash_read_common(struct spi_flash
>>>>>>>> *flash, const u8 *cmd,
>>>>>>>>   int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
>>>>>>>>                  size_t len, void *data)
>>>>>>>>   {
>>>>>>>> -       u8 cmd[5];
>>>>>>>> +       unsigned long page_addr, byte_addr, page_size;
>>>>>>>> +       size_t chunk_len, actual;
>>>>>>>> +       int ret = 0;
>>>>>>>> +       u8 cmd[4];
>>>>>>>>
>>>>>>>>          /* Handle memory-mapped SPI */
>>>>>>>>          if (flash->memory_map)
>>>>>>>>                  memcpy(data, flash->memory_map + offset, len);
>>>>>>>> +       page_size = flash->page_size;
>>>>>>>> +       page_addr = offset / page_size;
>>>>>>>> +       byte_addr = offset % page_size;
>>>>>>>> +
>>>>>>>> +       cmd[0] = CMD_READ_ARRAY_SLOW;
>>>>>>>> +       for (actual = 0; actual<  len; actual += chunk_len) {
>>>>>>>> +               chunk_len = min(len - actual, page_size -
>>>>>>>> byte_addr);
>>>>>>>> +
>>>>>>>> +               cmd[1] = page_addr>>  8;
>>>>>>>> +               cmd[2] = page_addr;
>>>>>>>> +               cmd[3] = byte_addr;
>>>>>>>> +
>>>>>>>> +               ret = spi_flash_read_common(flash, cmd, sizeof(cmd),
>>>>>>>> data + actual, chunk_len);
>>>>>>>> +               if (ret<  0) {
>>>>>>>> +                       debug("SF: read failed");
>>>>>>>> +                       break;
>>>>>>>> +               }
>>>>>>>>
>>>>>>>> -       cmd[0] = CMD_READ_ARRAY_FAST;
>>>>>>>> -       spi_flash_addr(offset, cmd);
>>>>>>>> -       cmd[4] = 0x00;
>>>>>>>> +               byte_addr += chunk_len;
>>>>>>>> +               if (byte_addr == page_size) {
>>>>>>>> +                       page_addr++;
>>>>>>>> +                       byte_addr = 0;
>>>>>>>> +               }
>>>>>>>> +       }
>>>>>>>>
>>>>>>>> -       return spi_flash_read_common(flash, cmd, sizeof(cmd), data,
>>>>>>>> len);
>>>>>>>> +       return ret;
>>>>>>>>   }
>>>>>>>>
>>>>>>>> Any idea about this?
>>>>>>>>
>>>>>>>> 3.  write (spi_flash_cmd_write_multi)
>>>>>>>>    write not happening properly.
>>>>>>>>
>>>>>>>> observations: only able to write single page, anything after a page
>>>>>>>> is
>>>>>>>> not getting
>>>>>>>>          written.
>>>>>>>> Workaround:
>>>>>>>> I did a write disable latch at the end of every write cycle(page
>>>>>>>> program) and enable it
>>>>>>>> again for the next loop. With this, I see I get rid of the above
>>>>>>>> issue.
>>>>>>>>
>>>>>>>>   @@ -117,6 +117,12 @@ int spi_flash_cmd_write_multi(struct
>>>>>>>> spi_flash
>>>>>>>> *flash, u32 offset,
>>>>>>>>                  if (ret)
>>>>>>>>                          break;
>>>>>>>>
>>>>>>>> +               ret = spi_flash_cmd_write_disable(flash);
>>>>>>>> +               if (ret<  0) {
>>>>>>>> +                       printf("SF: disabling write failed\n");
>>>>>>>> +                       break;
>>>>>>>> +               }
>>>>>>>> +
>>>>>>>>
>>>>>>>>
>>>>>>>> Have anyone seen the above mentioned issues regarding
>>>>>>>> read/write/erase? OR is there any
>>>>>>>> configurations that I might be missing ?
>>>>>>>>
>>>>>>> Any Input on this?
>>>>>>
>>>>>>
>>>>>> Please wait, I am pushing some changes tonight or so.
>>>>>>
>>>>>> We will continue this thread, after testing your part with these new
>>>>>> changes.
>>>>>>
>>>>>> I will intimate you once the push done.
>>>>>>
>>>>>> --
>>>>>> Thanks,
>>>>>> Jagan.
>>>>>>
>>>>>>
>>>>> Thanks a lot for the reply.
>>>>> Sure, will wait for your changes to go in.
>>>>
>>>>
>>>> Will take some time go these changes on master.
>>>>
>>>> Please checkout master-work branch in u-boot-spi repo
>>>> git://git.denx.de/u-boot-spi.git
>>>>
>>>> and try to test 256S parts, fyi: I tested the same part got the
>>>> +ve result.
>>>>
>>> Tested the above tree on my board.
>>> But, still the issues remain the same for me in all the three
>>> cases(erase/read/write).
>>>
>>> Here is the short log of the read command..
>>> DRA752 EVM # sf probe 0
>>> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
>>> SF: Warning - Only lower 16MiB accessible, Full access #define
>>> CONFIG_SPI_FLASH_BAR
>>> DRA752 EVM # sf erase 0x0 0x10000
>>> SF: 65536 bytes @ 0x0 Erased: OK
>>> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
>>> DRA752 EVM # sf read 0x81003000 0x0 0x10000
>>> SF: 65536 bytes @ 0x0 Read: OK
>>> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
>>> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
>>> Total of 4091 byte(s) were the same
>>>
>>>
>>> Erase: not able to do with a single command, need to issue for every
>>> 0x10000
>>> bytes.
>>>
>>> Write: Need to disable latch after every write to make it properly work.
>>>
>>> Is it possible for you to  give me  basic commands which you might have
>>> ran
>>> to confirm
>>> the read/write and erase ??
>>
>> I tested the same part - for me i couldn't see the issues with SL256S
>>
>> OK! can enable the log on poll function, spi_flash_cmd_wait_ready()
>> make debug ->  printf.
>> Do the same test.! and send the log file.
>>
>> --
>> Thanks,
>> Jagan.
>
> Here is the output log, no change..
>
>
> DRA752 EVM # sf probe 0
> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
> DRA752 EVM # sf erase 0x0 0x10000
> SF: 65536 bytes @ 0x0 Erased: OK
> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
> DRA752 EVM # sf read 0x81003000 0x0 0x10000
> SF: 65536 bytes @ 0x0 Read: OK
> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
> Total of 4091 byte(s) were the same
> DRA752 EVM #
>
>
> Code change: for above output.
> --- a/drivers/mtd/spi/spi_flash.c
> +++ b/drivers/mtd/spi/spi_flash.c
> @@ -85,7 +85,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash,
> unsigned long timeout)
>
>         ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);
>         if (ret) {
> -               debug("SF: fail to read %s status register\n",
> +               printf("SF: fail to read %s status register\n",
>                         cmd == CMD_READ_STATUS ? "read" : "flag");
>                 return ret;
>         }
> @@ -109,7 +109,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash,
> unsigned long timeout)
>                 return 0;
>
>         /* Timed out */
> -       debug("SF: time out!\n");
> +       printf("SF: time out!\n");
>         return -1;
>  }
>

Ohh..

- What if you erase the entire flash and read back, same result is it?
- please send the paths for config file for this board?

--
Thanks,
Jagan.
Poddar, Sourav June 17, 2013, 7:11 a.m. UTC | #2
On Monday 17 June 2013 12:35 PM, Jagan Teki wrote:
> On Mon, Jun 17, 2013 at 12:28 PM, Sourav Poddar<sourav.poddar@ti.com>  wrote:
>> HI Jagan,
>>
>> On Monday 17 June 2013 12:17 PM, Jagan Teki wrote:
>>> Hi Sourav,
>>>
>>> On Mon, Jun 17, 2013 at 11:44 AM, Sourav Poddar<sourav.poddar@ti.com>
>>> wrote:
>>>> Hi Jagan,
>>>>
>>>> On Saturday 15 June 2013 09:47 PM, Jagan Teki wrote:
>>>>> On 14-06-2013 20:13, Sourav Poddar wrote:
>>>>>> Hi Jagan,
>>>>>> On Friday 14 June 2013 08:08 PM, Jagan Teki wrote:
>>>>>>> On 14-06-2013 20:03, Sourav Poddar wrote:
>>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> On Wednesday 12 June 2013 01:00 PM, Sourav Poddar wrote:
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> I am working on qspi flash device S25FL256S at u-boot level. I am
>>>>>>>>> trying to
>>>>>>>>> make use of the existing spi_flash.c framework available at u-boot
>>>>>>>>> for
>>>>>>>>> erasing/reading/writing
>>>>>>>>> into the flash device.
>>>>>>>>>
>>>>>>>>> There are several issues(mentioned below), which I faced while using
>>>>>>>>> S25FL256s flash device
>>>>>>>>> with my dra7xx board which has a qspi controller to which the above
>>>>>>>>> mentioned flash device is attached.
>>>>>>>>>
>>>>>>>>> 1. Erase (spi_flash_cmd_erase)
>>>>>>>>>
>>>>>>>>> Issuing a command something like this..
>>>>>>>>>
>>>>>>>>> sf erase 0x0 0x50000
>>>>>>>>>    - erases only first 0x20000 bytes of flash device, anything above
>>>>>>>>> that is not erase. I need to
>>>>>>>>>      issue separate commands after 0x20000 for every 0x10000 bytes.
>>>>>>>>>
>>>>>>>>> Am i missing anything here?
>>>>>>>>>
>>>>>>>>> 2. read
>>>>>>>>>
>>>>>>>>> sf read 81000000 0 0x10000
>>>>>>>>>
>>>>>>>>> Read is not happening properly. The last few byte along the 4k
>>>>>>>>> boundary always shows zero.
>>>>>>>>> Above 4k bytes, read is not happening.
>>>>>>>>>
>>>>>>>>> For ex:
>>>>>>>>>    DRA752 EVM # md 81000f00
>>>>>>>>> 81000f00: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000f10: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000f20: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000f30: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000f40: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000f50: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000f60: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000f70: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000f80: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000f90: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000fa0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000fb0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000fc0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000fd0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000fe0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>> 81000ff0: ffffffff ffffffff 00ffffff 00000000    ................
>>>>>>>>>
>>>>>>>>> In this dump, if you see 81000ff0 the last column shows 000000 which
>>>>>>>>> is
>>>>>>>>> not expected. and it happens along every 4k bytes.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> So, to get rid of the above issue, I switched to page read with the
>>>>>>>>> below patch[1],
>>>>>>>>> which is giving me the correct result.
>>>>>>>>> [1]:
>>>>>>>>> @@ -147,17 +153,40 @@ int spi_flash_read_common(struct spi_flash
>>>>>>>>> *flash, const u8 *cmd,
>>>>>>>>>    int spi_flash_cmd_read_fast(struct spi_flash *flash, u32 offset,
>>>>>>>>>                   size_t len, void *data)
>>>>>>>>>    {
>>>>>>>>> -       u8 cmd[5];
>>>>>>>>> +       unsigned long page_addr, byte_addr, page_size;
>>>>>>>>> +       size_t chunk_len, actual;
>>>>>>>>> +       int ret = 0;
>>>>>>>>> +       u8 cmd[4];
>>>>>>>>>
>>>>>>>>>           /* Handle memory-mapped SPI */
>>>>>>>>>           if (flash->memory_map)
>>>>>>>>>                   memcpy(data, flash->memory_map + offset, len);
>>>>>>>>> +       page_size = flash->page_size;
>>>>>>>>> +       page_addr = offset / page_size;
>>>>>>>>> +       byte_addr = offset % page_size;
>>>>>>>>> +
>>>>>>>>> +       cmd[0] = CMD_READ_ARRAY_SLOW;
>>>>>>>>> +       for (actual = 0; actual<   len; actual += chunk_len) {
>>>>>>>>> +               chunk_len = min(len - actual, page_size -
>>>>>>>>> byte_addr);
>>>>>>>>> +
>>>>>>>>> +               cmd[1] = page_addr>>   8;
>>>>>>>>> +               cmd[2] = page_addr;
>>>>>>>>> +               cmd[3] = byte_addr;
>>>>>>>>> +
>>>>>>>>> +               ret = spi_flash_read_common(flash, cmd, sizeof(cmd),
>>>>>>>>> data + actual, chunk_len);
>>>>>>>>> +               if (ret<   0) {
>>>>>>>>> +                       debug("SF: read failed");
>>>>>>>>> +                       break;
>>>>>>>>> +               }
>>>>>>>>>
>>>>>>>>> -       cmd[0] = CMD_READ_ARRAY_FAST;
>>>>>>>>> -       spi_flash_addr(offset, cmd);
>>>>>>>>> -       cmd[4] = 0x00;
>>>>>>>>> +               byte_addr += chunk_len;
>>>>>>>>> +               if (byte_addr == page_size) {
>>>>>>>>> +                       page_addr++;
>>>>>>>>> +                       byte_addr = 0;
>>>>>>>>> +               }
>>>>>>>>> +       }
>>>>>>>>>
>>>>>>>>> -       return spi_flash_read_common(flash, cmd, sizeof(cmd), data,
>>>>>>>>> len);
>>>>>>>>> +       return ret;
>>>>>>>>>    }
>>>>>>>>>
>>>>>>>>> Any idea about this?
>>>>>>>>>
>>>>>>>>> 3.  write (spi_flash_cmd_write_multi)
>>>>>>>>>     write not happening properly.
>>>>>>>>>
>>>>>>>>> observations: only able to write single page, anything after a page
>>>>>>>>> is
>>>>>>>>> not getting
>>>>>>>>>           written.
>>>>>>>>> Workaround:
>>>>>>>>> I did a write disable latch at the end of every write cycle(page
>>>>>>>>> program) and enable it
>>>>>>>>> again for the next loop. With this, I see I get rid of the above
>>>>>>>>> issue.
>>>>>>>>>
>>>>>>>>>    @@ -117,6 +117,12 @@ int spi_flash_cmd_write_multi(struct
>>>>>>>>> spi_flash
>>>>>>>>> *flash, u32 offset,
>>>>>>>>>                   if (ret)
>>>>>>>>>                           break;
>>>>>>>>>
>>>>>>>>> +               ret = spi_flash_cmd_write_disable(flash);
>>>>>>>>> +               if (ret<   0) {
>>>>>>>>> +                       printf("SF: disabling write failed\n");
>>>>>>>>> +                       break;
>>>>>>>>> +               }
>>>>>>>>> +
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Have anyone seen the above mentioned issues regarding
>>>>>>>>> read/write/erase? OR is there any
>>>>>>>>> configurations that I might be missing ?
>>>>>>>>>
>>>>>>>> Any Input on this?
>>>>>>>
>>>>>>> Please wait, I am pushing some changes tonight or so.
>>>>>>>
>>>>>>> We will continue this thread, after testing your part with these new
>>>>>>> changes.
>>>>>>>
>>>>>>> I will intimate you once the push done.
>>>>>>>
>>>>>>> --
>>>>>>> Thanks,
>>>>>>> Jagan.
>>>>>>>
>>>>>>>
>>>>>> Thanks a lot for the reply.
>>>>>> Sure, will wait for your changes to go in.
>>>>>
>>>>> Will take some time go these changes on master.
>>>>>
>>>>> Please checkout master-work branch in u-boot-spi repo
>>>>> git://git.denx.de/u-boot-spi.git
>>>>>
>>>>> and try to test 256S parts, fyi: I tested the same part got the
>>>>> +ve result.
>>>>>
>>>> Tested the above tree on my board.
>>>> But, still the issues remain the same for me in all the three
>>>> cases(erase/read/write).
>>>>
>>>> Here is the short log of the read command..
>>>> DRA752 EVM # sf probe 0
>>>> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
>>>> SF: Warning - Only lower 16MiB accessible, Full access #define
>>>> CONFIG_SPI_FLASH_BAR
>>>> DRA752 EVM # sf erase 0x0 0x10000
>>>> SF: 65536 bytes @ 0x0 Erased: OK
>>>> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
>>>> DRA752 EVM # sf read 0x81003000 0x0 0x10000
>>>> SF: 65536 bytes @ 0x0 Read: OK
>>>> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
>>>> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
>>>> Total of 4091 byte(s) were the same
>>>>
>>>>
>>>> Erase: not able to do with a single command, need to issue for every
>>>> 0x10000
>>>> bytes.
>>>>
>>>> Write: Need to disable latch after every write to make it properly work.
>>>>
>>>> Is it possible for you to  give me  basic commands which you might have
>>>> ran
>>>> to confirm
>>>> the read/write and erase ??
>>> I tested the same part - for me i couldn't see the issues with SL256S
>>>
>>> OK! can enable the log on poll function, spi_flash_cmd_wait_ready()
>>> make debug ->   printf.
>>> Do the same test.! and send the log file.
>>>
>>> --
>>> Thanks,
>>> Jagan.
>> Here is the output log, no change..
>>
>>
>> DRA752 EVM # sf probe 0
>> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
>> DRA752 EVM # sf erase 0x0 0x10000
>> SF: 65536 bytes @ 0x0 Erased: OK
>> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
>> DRA752 EVM # sf read 0x81003000 0x0 0x10000
>> SF: 65536 bytes @ 0x0 Read: OK
>> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
>> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
>> Total of 4091 byte(s) were the same
>> DRA752 EVM #
>>
>>
>> Code change: for above output.
>> --- a/drivers/mtd/spi/spi_flash.c
>> +++ b/drivers/mtd/spi/spi_flash.c
>> @@ -85,7 +85,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash,
>> unsigned long timeout)
>>
>>          ret = spi_xfer(spi, 8,&cmd, NULL, SPI_XFER_BEGIN);
>>          if (ret) {
>> -               debug("SF: fail to read %s status register\n",
>> +               printf("SF: fail to read %s status register\n",
>>                          cmd == CMD_READ_STATUS ? "read" : "flag");
>>                  return ret;
>>          }
>> @@ -109,7 +109,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash,
>> unsigned long timeout)
>>                  return 0;
>>
>>          /* Timed out */
>> -       debug("SF: time out!\n");
>> +       printf("SF: time out!\n");
>>          return -1;
>>   }
>>
> Ohh..
>
> - What if you erase the entire flash and read back, same result is it?
Yes.
> - please send the paths for config file for this board?
include/configs/dra7xx_evm.h

> --
> Thanks,
> Jagan.
Jagan Teki June 17, 2013, 7:14 a.m. UTC | #3
On Mon, Jun 17, 2013 at 12:41 PM, Sourav Poddar <sourav.poddar@ti.com> wrote:
> On Monday 17 June 2013 12:35 PM, Jagan Teki wrote:
>>
>> On Mon, Jun 17, 2013 at 12:28 PM, Sourav Poddar<sourav.poddar@ti.com>
>> wrote:
>>>
>>> HI Jagan,
>>>
>>> On Monday 17 June 2013 12:17 PM, Jagan Teki wrote:
>>>>
>>>> Hi Sourav,
>>>>
>>>> On Mon, Jun 17, 2013 at 11:44 AM, Sourav Poddar<sourav.poddar@ti.com>
>>>> wrote:
>>>>>
>>>>> Hi Jagan,
>>>>>
>>>>> On Saturday 15 June 2013 09:47 PM, Jagan Teki wrote:
>>>>>>
>>>>>> On 14-06-2013 20:13, Sourav Poddar wrote:
>>>>>>>
>>>>>>> Hi Jagan,
>>>>>>> On Friday 14 June 2013 08:08 PM, Jagan Teki wrote:
>>>>>>>>
>>>>>>>> On 14-06-2013 20:03, Sourav Poddar wrote:
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> On Wednesday 12 June 2013 01:00 PM, Sourav Poddar wrote:
>>>>>>>>>>
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> I am working on qspi flash device S25FL256S at u-boot level. I am
>>>>>>>>>> trying to
>>>>>>>>>> make use of the existing spi_flash.c framework available at u-boot
>>>>>>>>>> for
>>>>>>>>>> erasing/reading/writing
>>>>>>>>>> into the flash device.
>>>>>>>>>>
>>>>>>>>>> There are several issues(mentioned below), which I faced while
>>>>>>>>>> using
>>>>>>>>>> S25FL256s flash device
>>>>>>>>>> with my dra7xx board which has a qspi controller to which the
>>>>>>>>>> above
>>>>>>>>>> mentioned flash device is attached.
>>>>>>>>>>
>>>>>>>>>> 1. Erase (spi_flash_cmd_erase)
>>>>>>>>>>
>>>>>>>>>> Issuing a command something like this..
>>>>>>>>>>
>>>>>>>>>> sf erase 0x0 0x50000
>>>>>>>>>>    - erases only first 0x20000 bytes of flash device, anything
>>>>>>>>>> above
>>>>>>>>>> that is not erase. I need to
>>>>>>>>>>      issue separate commands after 0x20000 for every 0x10000
>>>>>>>>>> bytes.
>>>>>>>>>>
>>>>>>>>>> Am i missing anything here?
>>>>>>>>>>
>>>>>>>>>> 2. read
>>>>>>>>>>
>>>>>>>>>> sf read 81000000 0 0x10000
>>>>>>>>>>
>>>>>>>>>> Read is not happening properly. The last few byte along the 4k
>>>>>>>>>> boundary always shows zero.
>>>>>>>>>> Above 4k bytes, read is not happening.
>>>>>>>>>>
>>>>>>>>>> For ex:
>>>>>>>>>>    DRA752 EVM # md 81000f00
>>>>>>>>>> 81000f00: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000f10: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000f20: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000f30: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000f40: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000f50: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000f60: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000f70: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000f80: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000f90: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000fa0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000fb0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000fc0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000fd0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000fe0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>> 81000ff0: ffffffff ffffffff 00ffffff 00000000    ................
>>>>>>>>>>
>>>>>>>>>> In this dump, if you see 81000ff0 the last column shows 000000
>>>>>>>>>> which
>>>>>>>>>> is
>>>>>>>>>> not expected. and it happens along every 4k bytes.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> So, to get rid of the above issue, I switched to page read with
>>>>>>>>>> the
>>>>>>>>>> below patch[1],
>>>>>>>>>> which is giving me the correct result.
>>>>>>>>>> [1]:
>>>>>>>>>> @@ -147,17 +153,40 @@ int spi_flash_read_common(struct spi_flash
>>>>>>>>>> *flash, const u8 *cmd,
>>>>>>>>>>    int spi_flash_cmd_read_fast(struct spi_flash *flash, u32
>>>>>>>>>> offset,
>>>>>>>>>>                   size_t len, void *data)
>>>>>>>>>>    {
>>>>>>>>>> -       u8 cmd[5];
>>>>>>>>>> +       unsigned long page_addr, byte_addr, page_size;
>>>>>>>>>> +       size_t chunk_len, actual;
>>>>>>>>>> +       int ret = 0;
>>>>>>>>>> +       u8 cmd[4];
>>>>>>>>>>
>>>>>>>>>>           /* Handle memory-mapped SPI */
>>>>>>>>>>           if (flash->memory_map)
>>>>>>>>>>                   memcpy(data, flash->memory_map + offset, len);
>>>>>>>>>> +       page_size = flash->page_size;
>>>>>>>>>> +       page_addr = offset / page_size;
>>>>>>>>>> +       byte_addr = offset % page_size;
>>>>>>>>>> +
>>>>>>>>>> +       cmd[0] = CMD_READ_ARRAY_SLOW;
>>>>>>>>>> +       for (actual = 0; actual<   len; actual += chunk_len) {
>>>>>>>>>> +               chunk_len = min(len - actual, page_size -
>>>>>>>>>> byte_addr);
>>>>>>>>>> +
>>>>>>>>>> +               cmd[1] = page_addr>>   8;
>>>>>>>>>> +               cmd[2] = page_addr;
>>>>>>>>>> +               cmd[3] = byte_addr;
>>>>>>>>>> +
>>>>>>>>>> +               ret = spi_flash_read_common(flash, cmd,
>>>>>>>>>> sizeof(cmd),
>>>>>>>>>> data + actual, chunk_len);
>>>>>>>>>> +               if (ret<   0) {
>>>>>>>>>> +                       debug("SF: read failed");
>>>>>>>>>> +                       break;
>>>>>>>>>> +               }
>>>>>>>>>>
>>>>>>>>>> -       cmd[0] = CMD_READ_ARRAY_FAST;
>>>>>>>>>> -       spi_flash_addr(offset, cmd);
>>>>>>>>>> -       cmd[4] = 0x00;
>>>>>>>>>> +               byte_addr += chunk_len;
>>>>>>>>>> +               if (byte_addr == page_size) {
>>>>>>>>>> +                       page_addr++;
>>>>>>>>>> +                       byte_addr = 0;
>>>>>>>>>> +               }
>>>>>>>>>> +       }
>>>>>>>>>>
>>>>>>>>>> -       return spi_flash_read_common(flash, cmd, sizeof(cmd),
>>>>>>>>>> data,
>>>>>>>>>> len);
>>>>>>>>>> +       return ret;
>>>>>>>>>>    }
>>>>>>>>>>
>>>>>>>>>> Any idea about this?
>>>>>>>>>>
>>>>>>>>>> 3.  write (spi_flash_cmd_write_multi)
>>>>>>>>>>     write not happening properly.
>>>>>>>>>>
>>>>>>>>>> observations: only able to write single page, anything after a
>>>>>>>>>> page
>>>>>>>>>> is
>>>>>>>>>> not getting
>>>>>>>>>>           written.
>>>>>>>>>> Workaround:
>>>>>>>>>> I did a write disable latch at the end of every write cycle(page
>>>>>>>>>> program) and enable it
>>>>>>>>>> again for the next loop. With this, I see I get rid of the above
>>>>>>>>>> issue.
>>>>>>>>>>
>>>>>>>>>>    @@ -117,6 +117,12 @@ int spi_flash_cmd_write_multi(struct
>>>>>>>>>> spi_flash
>>>>>>>>>> *flash, u32 offset,
>>>>>>>>>>                   if (ret)
>>>>>>>>>>                           break;
>>>>>>>>>>
>>>>>>>>>> +               ret = spi_flash_cmd_write_disable(flash);
>>>>>>>>>> +               if (ret<   0) {
>>>>>>>>>> +                       printf("SF: disabling write failed\n");
>>>>>>>>>> +                       break;
>>>>>>>>>> +               }
>>>>>>>>>> +
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Have anyone seen the above mentioned issues regarding
>>>>>>>>>> read/write/erase? OR is there any
>>>>>>>>>> configurations that I might be missing ?
>>>>>>>>>>
>>>>>>>>> Any Input on this?
>>>>>>>>
>>>>>>>>
>>>>>>>> Please wait, I am pushing some changes tonight or so.
>>>>>>>>
>>>>>>>> We will continue this thread, after testing your part with these new
>>>>>>>> changes.
>>>>>>>>
>>>>>>>> I will intimate you once the push done.
>>>>>>>>
>>>>>>>> --
>>>>>>>> Thanks,
>>>>>>>> Jagan.
>>>>>>>>
>>>>>>>>
>>>>>>> Thanks a lot for the reply.
>>>>>>> Sure, will wait for your changes to go in.
>>>>>>
>>>>>>
>>>>>> Will take some time go these changes on master.
>>>>>>
>>>>>> Please checkout master-work branch in u-boot-spi repo
>>>>>> git://git.denx.de/u-boot-spi.git
>>>>>>
>>>>>> and try to test 256S parts, fyi: I tested the same part got the
>>>>>> +ve result.
>>>>>>
>>>>> Tested the above tree on my board.
>>>>> But, still the issues remain the same for me in all the three
>>>>> cases(erase/read/write).
>>>>>
>>>>> Here is the short log of the read command..
>>>>> DRA752 EVM # sf probe 0
>>>>> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
>>>>> SF: Warning - Only lower 16MiB accessible, Full access #define
>>>>> CONFIG_SPI_FLASH_BAR
>>>>> DRA752 EVM # sf erase 0x0 0x10000
>>>>> SF: 65536 bytes @ 0x0 Erased: OK
>>>>> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
>>>>> DRA752 EVM # sf read 0x81003000 0x0 0x10000
>>>>> SF: 65536 bytes @ 0x0 Read: OK
>>>>> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
>>>>> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
>>>>> Total of 4091 byte(s) were the same
>>>>>
>>>>>
>>>>> Erase: not able to do with a single command, need to issue for every
>>>>> 0x10000
>>>>> bytes.
>>>>>
>>>>> Write: Need to disable latch after every write to make it properly
>>>>> work.
>>>>>
>>>>> Is it possible for you to  give me  basic commands which you might have
>>>>> ran
>>>>> to confirm
>>>>> the read/write and erase ??
>>>>
>>>> I tested the same part - for me i couldn't see the issues with SL256S
>>>>
>>>> OK! can enable the log on poll function, spi_flash_cmd_wait_ready()
>>>> make debug ->   printf.
>>>> Do the same test.! and send the log file.
>>>>
>>>> --
>>>> Thanks,
>>>> Jagan.
>>>
>>> Here is the output log, no change..
>>>
>>>
>>> DRA752 EVM # sf probe 0
>>> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
>>> DRA752 EVM # sf erase 0x0 0x10000
>>> SF: 65536 bytes @ 0x0 Erased: OK
>>> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
>>> DRA752 EVM # sf read 0x81003000 0x0 0x10000
>>> SF: 65536 bytes @ 0x0 Read: OK
>>> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
>>> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
>>> Total of 4091 byte(s) were the same
>>> DRA752 EVM #
>>>
>>>
>>> Code change: for above output.
>>> --- a/drivers/mtd/spi/spi_flash.c
>>> +++ b/drivers/mtd/spi/spi_flash.c
>>> @@ -85,7 +85,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash,
>>> unsigned long timeout)
>>>
>>>          ret = spi_xfer(spi, 8,&cmd, NULL, SPI_XFER_BEGIN);
>>>
>>>          if (ret) {
>>> -               debug("SF: fail to read %s status register\n",
>>> +               printf("SF: fail to read %s status register\n",
>>>                          cmd == CMD_READ_STATUS ? "read" : "flag");
>>>                  return ret;
>>>          }
>>> @@ -109,7 +109,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash,
>>> unsigned long timeout)
>>>                  return 0;
>>>
>>>          /* Timed out */
>>> -       debug("SF: time out!\n");
>>> +       printf("SF: time out!\n");
>>>          return -1;
>>>   }
>>>
>> Ohh..
>>
>> - What if you erase the entire flash and read back, same result is it?
>
> Yes.
>
>> - please send the paths for config file for this board?
>
> include/configs/dra7xx_evm.h

I couldn't find any SPI flash configs on above config file,
Can you point me the relevant configurations.

--
Thanks,
Jagan.
Poddar, Sourav June 17, 2013, 7:19 a.m. UTC | #4
On Monday 17 June 2013 12:44 PM, Jagan Teki wrote:
> On Mon, Jun 17, 2013 at 12:41 PM, Sourav Poddar<sourav.poddar@ti.com>  wrote:
>> On Monday 17 June 2013 12:35 PM, Jagan Teki wrote:
>>> On Mon, Jun 17, 2013 at 12:28 PM, Sourav Poddar<sourav.poddar@ti.com>
>>> wrote:
>>>> HI Jagan,
>>>>
>>>> On Monday 17 June 2013 12:17 PM, Jagan Teki wrote:
>>>>> Hi Sourav,
>>>>>
>>>>> On Mon, Jun 17, 2013 at 11:44 AM, Sourav Poddar<sourav.poddar@ti.com>
>>>>> wrote:
>>>>>> Hi Jagan,
>>>>>>
>>>>>> On Saturday 15 June 2013 09:47 PM, Jagan Teki wrote:
>>>>>>> On 14-06-2013 20:13, Sourav Poddar wrote:
>>>>>>>> Hi Jagan,
>>>>>>>> On Friday 14 June 2013 08:08 PM, Jagan Teki wrote:
>>>>>>>>> On 14-06-2013 20:03, Sourav Poddar wrote:
>>>>>>>>>>
>>>>>>>>>> Hi,
>>>>>>>>>>
>>>>>>>>>> On Wednesday 12 June 2013 01:00 PM, Sourav Poddar wrote:
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> I am working on qspi flash device S25FL256S at u-boot level. I am
>>>>>>>>>>> trying to
>>>>>>>>>>> make use of the existing spi_flash.c framework available at u-boot
>>>>>>>>>>> for
>>>>>>>>>>> erasing/reading/writing
>>>>>>>>>>> into the flash device.
>>>>>>>>>>>
>>>>>>>>>>> There are several issues(mentioned below), which I faced while
>>>>>>>>>>> using
>>>>>>>>>>> S25FL256s flash device
>>>>>>>>>>> with my dra7xx board which has a qspi controller to which the
>>>>>>>>>>> above
>>>>>>>>>>> mentioned flash device is attached.
>>>>>>>>>>>
>>>>>>>>>>> 1. Erase (spi_flash_cmd_erase)
>>>>>>>>>>>
>>>>>>>>>>> Issuing a command something like this..
>>>>>>>>>>>
>>>>>>>>>>> sf erase 0x0 0x50000
>>>>>>>>>>>     - erases only first 0x20000 bytes of flash device, anything
>>>>>>>>>>> above
>>>>>>>>>>> that is not erase. I need to
>>>>>>>>>>>       issue separate commands after 0x20000 for every 0x10000
>>>>>>>>>>> bytes.
>>>>>>>>>>>
>>>>>>>>>>> Am i missing anything here?
>>>>>>>>>>>
>>>>>>>>>>> 2. read
>>>>>>>>>>>
>>>>>>>>>>> sf read 81000000 0 0x10000
>>>>>>>>>>>
>>>>>>>>>>> Read is not happening properly. The last few byte along the 4k
>>>>>>>>>>> boundary always shows zero.
>>>>>>>>>>> Above 4k bytes, read is not happening.
>>>>>>>>>>>
>>>>>>>>>>> For ex:
>>>>>>>>>>>     DRA752 EVM # md 81000f00
>>>>>>>>>>> 81000f00: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000f10: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000f20: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000f30: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000f40: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000f50: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000f60: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000f70: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000f80: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000f90: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000fa0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000fb0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000fc0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000fd0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000fe0: ffffffff ffffffff ffffffff ffffffff    ................
>>>>>>>>>>> 81000ff0: ffffffff ffffffff 00ffffff 00000000    ................
>>>>>>>>>>>
>>>>>>>>>>> In this dump, if you see 81000ff0 the last column shows 000000
>>>>>>>>>>> which
>>>>>>>>>>> is
>>>>>>>>>>> not expected. and it happens along every 4k bytes.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> So, to get rid of the above issue, I switched to page read with
>>>>>>>>>>> the
>>>>>>>>>>> below patch[1],
>>>>>>>>>>> which is giving me the correct result.
>>>>>>>>>>> [1]:
>>>>>>>>>>> @@ -147,17 +153,40 @@ int spi_flash_read_common(struct spi_flash
>>>>>>>>>>> *flash, const u8 *cmd,
>>>>>>>>>>>     int spi_flash_cmd_read_fast(struct spi_flash *flash, u32
>>>>>>>>>>> offset,
>>>>>>>>>>>                    size_t len, void *data)
>>>>>>>>>>>     {
>>>>>>>>>>> -       u8 cmd[5];
>>>>>>>>>>> +       unsigned long page_addr, byte_addr, page_size;
>>>>>>>>>>> +       size_t chunk_len, actual;
>>>>>>>>>>> +       int ret = 0;
>>>>>>>>>>> +       u8 cmd[4];
>>>>>>>>>>>
>>>>>>>>>>>            /* Handle memory-mapped SPI */
>>>>>>>>>>>            if (flash->memory_map)
>>>>>>>>>>>                    memcpy(data, flash->memory_map + offset, len);
>>>>>>>>>>> +       page_size = flash->page_size;
>>>>>>>>>>> +       page_addr = offset / page_size;
>>>>>>>>>>> +       byte_addr = offset % page_size;
>>>>>>>>>>> +
>>>>>>>>>>> +       cmd[0] = CMD_READ_ARRAY_SLOW;
>>>>>>>>>>> +       for (actual = 0; actual<    len; actual += chunk_len) {
>>>>>>>>>>> +               chunk_len = min(len - actual, page_size -
>>>>>>>>>>> byte_addr);
>>>>>>>>>>> +
>>>>>>>>>>> +               cmd[1] = page_addr>>    8;
>>>>>>>>>>> +               cmd[2] = page_addr;
>>>>>>>>>>> +               cmd[3] = byte_addr;
>>>>>>>>>>> +
>>>>>>>>>>> +               ret = spi_flash_read_common(flash, cmd,
>>>>>>>>>>> sizeof(cmd),
>>>>>>>>>>> data + actual, chunk_len);
>>>>>>>>>>> +               if (ret<    0) {
>>>>>>>>>>> +                       debug("SF: read failed");
>>>>>>>>>>> +                       break;
>>>>>>>>>>> +               }
>>>>>>>>>>>
>>>>>>>>>>> -       cmd[0] = CMD_READ_ARRAY_FAST;
>>>>>>>>>>> -       spi_flash_addr(offset, cmd);
>>>>>>>>>>> -       cmd[4] = 0x00;
>>>>>>>>>>> +               byte_addr += chunk_len;
>>>>>>>>>>> +               if (byte_addr == page_size) {
>>>>>>>>>>> +                       page_addr++;
>>>>>>>>>>> +                       byte_addr = 0;
>>>>>>>>>>> +               }
>>>>>>>>>>> +       }
>>>>>>>>>>>
>>>>>>>>>>> -       return spi_flash_read_common(flash, cmd, sizeof(cmd),
>>>>>>>>>>> data,
>>>>>>>>>>> len);
>>>>>>>>>>> +       return ret;
>>>>>>>>>>>     }
>>>>>>>>>>>
>>>>>>>>>>> Any idea about this?
>>>>>>>>>>>
>>>>>>>>>>> 3.  write (spi_flash_cmd_write_multi)
>>>>>>>>>>>      write not happening properly.
>>>>>>>>>>>
>>>>>>>>>>> observations: only able to write single page, anything after a
>>>>>>>>>>> page
>>>>>>>>>>> is
>>>>>>>>>>> not getting
>>>>>>>>>>>            written.
>>>>>>>>>>> Workaround:
>>>>>>>>>>> I did a write disable latch at the end of every write cycle(page
>>>>>>>>>>> program) and enable it
>>>>>>>>>>> again for the next loop. With this, I see I get rid of the above
>>>>>>>>>>> issue.
>>>>>>>>>>>
>>>>>>>>>>>     @@ -117,6 +117,12 @@ int spi_flash_cmd_write_multi(struct
>>>>>>>>>>> spi_flash
>>>>>>>>>>> *flash, u32 offset,
>>>>>>>>>>>                    if (ret)
>>>>>>>>>>>                            break;
>>>>>>>>>>>
>>>>>>>>>>> +               ret = spi_flash_cmd_write_disable(flash);
>>>>>>>>>>> +               if (ret<    0) {
>>>>>>>>>>> +                       printf("SF: disabling write failed\n");
>>>>>>>>>>> +                       break;
>>>>>>>>>>> +               }
>>>>>>>>>>> +
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Have anyone seen the above mentioned issues regarding
>>>>>>>>>>> read/write/erase? OR is there any
>>>>>>>>>>> configurations that I might be missing ?
>>>>>>>>>>>
>>>>>>>>>> Any Input on this?
>>>>>>>>>
>>>>>>>>> Please wait, I am pushing some changes tonight or so.
>>>>>>>>>
>>>>>>>>> We will continue this thread, after testing your part with these new
>>>>>>>>> changes.
>>>>>>>>>
>>>>>>>>> I will intimate you once the push done.
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Thanks,
>>>>>>>>> Jagan.
>>>>>>>>>
>>>>>>>>>
>>>>>>>> Thanks a lot for the reply.
>>>>>>>> Sure, will wait for your changes to go in.
>>>>>>>
>>>>>>> Will take some time go these changes on master.
>>>>>>>
>>>>>>> Please checkout master-work branch in u-boot-spi repo
>>>>>>> git://git.denx.de/u-boot-spi.git
>>>>>>>
>>>>>>> and try to test 256S parts, fyi: I tested the same part got the
>>>>>>> +ve result.
>>>>>>>
>>>>>> Tested the above tree on my board.
>>>>>> But, still the issues remain the same for me in all the three
>>>>>> cases(erase/read/write).
>>>>>>
>>>>>> Here is the short log of the read command..
>>>>>> DRA752 EVM # sf probe 0
>>>>>> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
>>>>>> SF: Warning - Only lower 16MiB accessible, Full access #define
>>>>>> CONFIG_SPI_FLASH_BAR
>>>>>> DRA752 EVM # sf erase 0x0 0x10000
>>>>>> SF: 65536 bytes @ 0x0 Erased: OK
>>>>>> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
>>>>>> DRA752 EVM # sf read 0x81003000 0x0 0x10000
>>>>>> SF: 65536 bytes @ 0x0 Read: OK
>>>>>> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
>>>>>> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
>>>>>> Total of 4091 byte(s) were the same
>>>>>>
>>>>>>
>>>>>> Erase: not able to do with a single command, need to issue for every
>>>>>> 0x10000
>>>>>> bytes.
>>>>>>
>>>>>> Write: Need to disable latch after every write to make it properly
>>>>>> work.
>>>>>>
>>>>>> Is it possible for you to  give me  basic commands which you might have
>>>>>> ran
>>>>>> to confirm
>>>>>> the read/write and erase ??
>>>>> I tested the same part - for me i couldn't see the issues with SL256S
>>>>>
>>>>> OK! can enable the log on poll function, spi_flash_cmd_wait_ready()
>>>>> make debug ->    printf.
>>>>> Do the same test.! and send the log file.
>>>>>
>>>>> --
>>>>> Thanks,
>>>>> Jagan.
>>>> Here is the output log, no change..
>>>>
>>>>
>>>> DRA752 EVM # sf probe 0
>>>> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
>>>> DRA752 EVM # sf erase 0x0 0x10000
>>>> SF: 65536 bytes @ 0x0 Erased: OK
>>>> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
>>>> DRA752 EVM # sf read 0x81003000 0x0 0x10000
>>>> SF: 65536 bytes @ 0x0 Read: OK
>>>> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
>>>> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
>>>> Total of 4091 byte(s) were the same
>>>> DRA752 EVM #
>>>>
>>>>
>>>> Code change: for above output.
>>>> --- a/drivers/mtd/spi/spi_flash.c
>>>> +++ b/drivers/mtd/spi/spi_flash.c
>>>> @@ -85,7 +85,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash,
>>>> unsigned long timeout)
>>>>
>>>>           ret = spi_xfer(spi, 8,&cmd, NULL, SPI_XFER_BEGIN);
>>>>
>>>>           if (ret) {
>>>> -               debug("SF: fail to read %s status register\n",
>>>> +               printf("SF: fail to read %s status register\n",
>>>>                           cmd == CMD_READ_STATUS ? "read" : "flag");
>>>>                   return ret;
>>>>           }
>>>> @@ -109,7 +109,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash,
>>>> unsigned long timeout)
>>>>                   return 0;
>>>>
>>>>           /* Timed out */
>>>> -       debug("SF: time out!\n");
>>>> +       printf("SF: time out!\n");
>>>>           return -1;
>>>>    }
>>>>
>>> Ohh..
>>>
>>> - What if you erase the entire flash and read back, same result is it?
>> Yes.
>>
>>> - please send the paths for config file for this board?
>> include/configs/dra7xx_evm.h
> I couldn't find any SPI flash configs on above config file,
> Can you point me the relevant configurations.
>
Following are the configuration details for spi..
#define CONFIG_SPI_FLASH_BAR
#define CONFIG_TI_QSPI
#define CONFIG_SPI_FLASH
#define CONFIG_SPI_FLASH_SPANSION
#define CONFIG_CMD_SF
#define CONFIG_CMD_SPI
#define CONFIG_SF_DEFAULT_SPEED         12000000
#define CONFIG_DEFAULT_SPI_MODE         SPI_MODE_3

/* SPI SPL */
#define CONFIG_SPL_SPI_SUPPORT
#define CONFIG_SPL_SPI_LOAD
#define CONFIG_SPL_SPI_FLASH_SUPPORT
#define CONFIG_SPL_SPI_BUS              0
#define CONFIG_SPL_SPI_CS               0
#define CONFIG_SYS_SPI_U_BOOT_OFFS      0x20000


> --
> Thanks,
> Jagan.
Jagan Teki June 17, 2013, 7:34 a.m. UTC | #5
On Mon, Jun 17, 2013 at 12:49 PM, Sourav Poddar <sourav.poddar@ti.com> wrote:
> On Monday 17 June 2013 12:44 PM, Jagan Teki wrote:
>>
>> On Mon, Jun 17, 2013 at 12:41 PM, Sourav Poddar<sourav.poddar@ti.com>
>> wrote:
>>>
>>> On Monday 17 June 2013 12:35 PM, Jagan Teki wrote:
>>>>
>>>> On Mon, Jun 17, 2013 at 12:28 PM, Sourav Poddar<sourav.poddar@ti.com>
>>>> wrote:
>>>>>
>>>>> HI Jagan,
>>>>>
>>>>> On Monday 17 June 2013 12:17 PM, Jagan Teki wrote:
>>>>>>
>>>>>> Hi Sourav,
>>>>>>
>>>>>> On Mon, Jun 17, 2013 at 11:44 AM, Sourav Poddar<sourav.poddar@ti.com>
>>>>>> wrote:
>>>>>>>
>>>>>>> Hi Jagan,
>>>>>>>
>>>>>>> On Saturday 15 June 2013 09:47 PM, Jagan Teki wrote:
>>>>>>>>
>>>>>>>> On 14-06-2013 20:13, Sourav Poddar wrote:
>>>>>>>>>
>>>>>>>>> Hi Jagan,
>>>>>>>>> On Friday 14 June 2013 08:08 PM, Jagan Teki wrote:
>>>>>>>>>>
>>>>>>>>>> On 14-06-2013 20:03, Sourav Poddar wrote:
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Hi,
>>>>>>>>>>>
>>>>>>>>>>> On Wednesday 12 June 2013 01:00 PM, Sourav Poddar wrote:
>>>>>>>>>>>>
>>>>>>>>>>>> Hi,
>>>>>>>>>>>>
>>>>>>>>>>>> I am working on qspi flash device S25FL256S at u-boot level. I
>>>>>>>>>>>> am
>>>>>>>>>>>> trying to
>>>>>>>>>>>> make use of the existing spi_flash.c framework available at
>>>>>>>>>>>> u-boot
>>>>>>>>>>>> for
>>>>>>>>>>>> erasing/reading/writing
>>>>>>>>>>>> into the flash device.
>>>>>>>>>>>>
>>>>>>>>>>>> There are several issues(mentioned below), which I faced while
>>>>>>>>>>>> using
>>>>>>>>>>>> S25FL256s flash device
>>>>>>>>>>>> with my dra7xx board which has a qspi controller to which the
>>>>>>>>>>>> above
>>>>>>>>>>>> mentioned flash device is attached.
>>>>>>>>>>>>
>>>>>>>>>>>> 1. Erase (spi_flash_cmd_erase)
>>>>>>>>>>>>
>>>>>>>>>>>> Issuing a command something like this..
>>>>>>>>>>>>
>>>>>>>>>>>> sf erase 0x0 0x50000
>>>>>>>>>>>>     - erases only first 0x20000 bytes of flash device, anything
>>>>>>>>>>>> above
>>>>>>>>>>>> that is not erase. I need to
>>>>>>>>>>>>       issue separate commands after 0x20000 for every 0x10000
>>>>>>>>>>>> bytes.
>>>>>>>>>>>>
>>>>>>>>>>>> Am i missing anything here?
>>>>>>>>>>>>
>>>>>>>>>>>> 2. read
>>>>>>>>>>>>
>>>>>>>>>>>> sf read 81000000 0 0x10000
>>>>>>>>>>>>
>>>>>>>>>>>> Read is not happening properly. The last few byte along the 4k
>>>>>>>>>>>> boundary always shows zero.
>>>>>>>>>>>> Above 4k bytes, read is not happening.
>>>>>>>>>>>>
>>>>>>>>>>>> For ex:
>>>>>>>>>>>>     DRA752 EVM # md 81000f00
>>>>>>>>>>>> 81000f00: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000f10: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000f20: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000f30: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000f40: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000f50: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000f60: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000f70: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000f80: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000f90: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000fa0: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000fb0: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000fc0: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000fd0: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000fe0: ffffffff ffffffff ffffffff ffffffff
>>>>>>>>>>>> ................
>>>>>>>>>>>> 81000ff0: ffffffff ffffffff 00ffffff 00000000
>>>>>>>>>>>> ................
>>>>>>>>>>>>
>>>>>>>>>>>> In this dump, if you see 81000ff0 the last column shows 000000
>>>>>>>>>>>> which
>>>>>>>>>>>> is
>>>>>>>>>>>> not expected. and it happens along every 4k bytes.
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> So, to get rid of the above issue, I switched to page read with
>>>>>>>>>>>> the
>>>>>>>>>>>> below patch[1],
>>>>>>>>>>>> which is giving me the correct result.
>>>>>>>>>>>> [1]:
>>>>>>>>>>>> @@ -147,17 +153,40 @@ int spi_flash_read_common(struct spi_flash
>>>>>>>>>>>> *flash, const u8 *cmd,
>>>>>>>>>>>>     int spi_flash_cmd_read_fast(struct spi_flash *flash, u32
>>>>>>>>>>>> offset,
>>>>>>>>>>>>                    size_t len, void *data)
>>>>>>>>>>>>     {
>>>>>>>>>>>> -       u8 cmd[5];
>>>>>>>>>>>> +       unsigned long page_addr, byte_addr, page_size;
>>>>>>>>>>>> +       size_t chunk_len, actual;
>>>>>>>>>>>> +       int ret = 0;
>>>>>>>>>>>> +       u8 cmd[4];
>>>>>>>>>>>>
>>>>>>>>>>>>            /* Handle memory-mapped SPI */
>>>>>>>>>>>>            if (flash->memory_map)
>>>>>>>>>>>>                    memcpy(data, flash->memory_map + offset,
>>>>>>>>>>>> len);
>>>>>>>>>>>> +       page_size = flash->page_size;
>>>>>>>>>>>> +       page_addr = offset / page_size;
>>>>>>>>>>>> +       byte_addr = offset % page_size;
>>>>>>>>>>>> +
>>>>>>>>>>>> +       cmd[0] = CMD_READ_ARRAY_SLOW;
>>>>>>>>>>>> +       for (actual = 0; actual<    len; actual += chunk_len) {
>>>>>>>>>>>> +               chunk_len = min(len - actual, page_size -
>>>>>>>>>>>> byte_addr);
>>>>>>>>>>>> +
>>>>>>>>>>>> +               cmd[1] = page_addr>>    8;
>>>>>>>>>>>> +               cmd[2] = page_addr;
>>>>>>>>>>>> +               cmd[3] = byte_addr;
>>>>>>>>>>>> +
>>>>>>>>>>>> +               ret = spi_flash_read_common(flash, cmd,
>>>>>>>>>>>> sizeof(cmd),
>>>>>>>>>>>> data + actual, chunk_len);
>>>>>>>>>>>> +               if (ret<    0) {
>>>>>>>>>>>> +                       debug("SF: read failed");
>>>>>>>>>>>> +                       break;
>>>>>>>>>>>> +               }
>>>>>>>>>>>>
>>>>>>>>>>>> -       cmd[0] = CMD_READ_ARRAY_FAST;
>>>>>>>>>>>> -       spi_flash_addr(offset, cmd);
>>>>>>>>>>>> -       cmd[4] = 0x00;
>>>>>>>>>>>> +               byte_addr += chunk_len;
>>>>>>>>>>>> +               if (byte_addr == page_size) {
>>>>>>>>>>>> +                       page_addr++;
>>>>>>>>>>>> +                       byte_addr = 0;
>>>>>>>>>>>> +               }
>>>>>>>>>>>> +       }
>>>>>>>>>>>>
>>>>>>>>>>>> -       return spi_flash_read_common(flash, cmd, sizeof(cmd),
>>>>>>>>>>>> data,
>>>>>>>>>>>> len);
>>>>>>>>>>>> +       return ret;
>>>>>>>>>>>>     }
>>>>>>>>>>>>
>>>>>>>>>>>> Any idea about this?
>>>>>>>>>>>>
>>>>>>>>>>>> 3.  write (spi_flash_cmd_write_multi)
>>>>>>>>>>>>      write not happening properly.
>>>>>>>>>>>>
>>>>>>>>>>>> observations: only able to write single page, anything after a
>>>>>>>>>>>> page
>>>>>>>>>>>> is
>>>>>>>>>>>> not getting
>>>>>>>>>>>>            written.
>>>>>>>>>>>> Workaround:
>>>>>>>>>>>> I did a write disable latch at the end of every write cycle(page
>>>>>>>>>>>> program) and enable it
>>>>>>>>>>>> again for the next loop. With this, I see I get rid of the above
>>>>>>>>>>>> issue.
>>>>>>>>>>>>
>>>>>>>>>>>>     @@ -117,6 +117,12 @@ int spi_flash_cmd_write_multi(struct
>>>>>>>>>>>> spi_flash
>>>>>>>>>>>> *flash, u32 offset,
>>>>>>>>>>>>                    if (ret)
>>>>>>>>>>>>                            break;
>>>>>>>>>>>>
>>>>>>>>>>>> +               ret = spi_flash_cmd_write_disable(flash);
>>>>>>>>>>>> +               if (ret<    0) {
>>>>>>>>>>>> +                       printf("SF: disabling write failed\n");
>>>>>>>>>>>> +                       break;
>>>>>>>>>>>> +               }
>>>>>>>>>>>> +
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Have anyone seen the above mentioned issues regarding
>>>>>>>>>>>> read/write/erase? OR is there any
>>>>>>>>>>>> configurations that I might be missing ?
>>>>>>>>>>>>
>>>>>>>>>>> Any Input on this?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Please wait, I am pushing some changes tonight or so.
>>>>>>>>>>
>>>>>>>>>> We will continue this thread, after testing your part with these
>>>>>>>>>> new
>>>>>>>>>> changes.
>>>>>>>>>>
>>>>>>>>>> I will intimate you once the push done.
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Thanks,
>>>>>>>>>> Jagan.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>> Thanks a lot for the reply.
>>>>>>>>> Sure, will wait for your changes to go in.
>>>>>>>>
>>>>>>>>
>>>>>>>> Will take some time go these changes on master.
>>>>>>>>
>>>>>>>> Please checkout master-work branch in u-boot-spi repo
>>>>>>>> git://git.denx.de/u-boot-spi.git
>>>>>>>>
>>>>>>>> and try to test 256S parts, fyi: I tested the same part got the
>>>>>>>> +ve result.
>>>>>>>>
>>>>>>> Tested the above tree on my board.
>>>>>>> But, still the issues remain the same for me in all the three
>>>>>>> cases(erase/read/write).
>>>>>>>
>>>>>>> Here is the short log of the read command..
>>>>>>> DRA752 EVM # sf probe 0
>>>>>>> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
>>>>>>> SF: Warning - Only lower 16MiB accessible, Full access #define
>>>>>>> CONFIG_SPI_FLASH_BAR
>>>>>>> DRA752 EVM # sf erase 0x0 0x10000
>>>>>>> SF: 65536 bytes @ 0x0 Erased: OK
>>>>>>> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
>>>>>>> DRA752 EVM # sf read 0x81003000 0x0 0x10000
>>>>>>> SF: 65536 bytes @ 0x0 Read: OK
>>>>>>> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
>>>>>>> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
>>>>>>> Total of 4091 byte(s) were the same
>>>>>>>
>>>>>>>
>>>>>>> Erase: not able to do with a single command, need to issue for every
>>>>>>> 0x10000
>>>>>>> bytes.
>>>>>>>
>>>>>>> Write: Need to disable latch after every write to make it properly
>>>>>>> work.
>>>>>>>
>>>>>>> Is it possible for you to  give me  basic commands which you might
>>>>>>> have
>>>>>>> ran
>>>>>>> to confirm
>>>>>>> the read/write and erase ??
>>>>>>
>>>>>> I tested the same part - for me i couldn't see the issues with SL256S
>>>>>>
>>>>>> OK! can enable the log on poll function, spi_flash_cmd_wait_ready()
>>>>>> make debug ->    printf.
>>>>>> Do the same test.! and send the log file.
>>>>>>
>>>>>> --
>>>>>> Thanks,
>>>>>> Jagan.
>>>>>
>>>>> Here is the output log, no change..
>>>>>
>>>>>
>>>>> DRA752 EVM # sf probe 0
>>>>> SF: Detected S25FL256S_64K with page size 64 KiB, total 32 MiB
>>>>> DRA752 EVM # sf erase 0x0 0x10000
>>>>> SF: 65536 bytes @ 0x0 Erased: OK
>>>>> DRA752 EVM # mw.b 0x81000100 0xff 0x10000
>>>>> DRA752 EVM # sf read 0x81003000 0x0 0x10000
>>>>> SF: 65536 bytes @ 0x0 Read: OK
>>>>> DRA752 EVM # cmp.b 0x81003000  0x81000100  0x10000
>>>>> byte at 0x81003ffb (0x0) != byte at 0x810010fb (0xff)
>>>>> Total of 4091 byte(s) were the same
>>>>> DRA752 EVM #
>>>>>
>>>>>
>>>>> Code change: for above output.
>>>>> --- a/drivers/mtd/spi/spi_flash.c
>>>>> +++ b/drivers/mtd/spi/spi_flash.c
>>>>> @@ -85,7 +85,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash,
>>>>> unsigned long timeout)
>>>>>
>>>>>           ret = spi_xfer(spi, 8,&cmd, NULL, SPI_XFER_BEGIN);
>>>>>
>>>>>           if (ret) {
>>>>> -               debug("SF: fail to read %s status register\n",
>>>>> +               printf("SF: fail to read %s status register\n",
>>>>>                           cmd == CMD_READ_STATUS ? "read" : "flag");
>>>>>                   return ret;
>>>>>           }
>>>>> @@ -109,7 +109,7 @@ int spi_flash_cmd_wait_ready(struct spi_flash
>>>>> *flash,
>>>>> unsigned long timeout)
>>>>>                   return 0;
>>>>>
>>>>>           /* Timed out */
>>>>> -       debug("SF: time out!\n");
>>>>> +       printf("SF: time out!\n");
>>>>>           return -1;
>>>>>    }
>>>>>
>>>> Ohh..
>>>>
>>>> - What if you erase the entire flash and read back, same result is it?
>>>
>>> Yes.
>>>
>>>> - please send the paths for config file for this board?
>>>
>>> include/configs/dra7xx_evm.h
>>
>> I couldn't find any SPI flash configs on above config file,
>> Can you point me the relevant configurations.
>>
> Following are the configuration details for spi..
> #define CONFIG_SPI_FLASH_BAR
> #define CONFIG_TI_QSPI

Where can i find this?

> #define CONFIG_SPI_FLASH
> #define CONFIG_SPI_FLASH_SPANSION
> #define CONFIG_CMD_SF
> #define CONFIG_CMD_SPI
> #define CONFIG_SF_DEFAULT_SPEED         12000000
> #define CONFIG_DEFAULT_SPI_MODE         SPI_MODE_3
>
> /* SPI SPL */
> #define CONFIG_SPL_SPI_SUPPORT
> #define CONFIG_SPL_SPI_LOAD
> #define CONFIG_SPL_SPI_FLASH_SUPPORT
> #define CONFIG_SPL_SPI_BUS              0
> #define CONFIG_SPL_SPI_CS               0
> #define CONFIG_SYS_SPI_U_BOOT_OFFS      0x20000

--
Thanks,
Jagan.
diff mbox

Patch

--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -85,7 +85,7 @@  int spi_flash_cmd_wait_ready(struct spi_flash *flash, 
unsigned long timeout)

         ret = spi_xfer(spi, 8, &cmd, NULL, SPI_XFER_BEGIN);
         if (ret) {
-               debug("SF: fail to read %s status register\n",
+               printf("SF: fail to read %s status register\n",
                         cmd == CMD_READ_STATUS ? "read" : "flag");
                 return ret;