MTD NOR write issue for files greater than a few hundred bytes

Holmes, Michael A (Mike) Mike.Holmes at lsi.com
Mon Mar 4 10:42:52 EST 2013


All - repost since this ended up on the end of another thread.,



The issue I have is as follows.

When writing to the MTD on NOR in Linux for a file of more than a few bytes, it fails with a MTD software timeout.



Writing upto 100 bytes are fine, in this test when I jumped to 300 it failed.

I also proved that the small writes do get written; I wrote zeros over my mtd1 "u-boot-env" and had to repair it on reboot.



In Uboot there are no NOR or NAND read/write issues, erase appears to work fine etc. Under Linux MTD for the NAND remains flawless and MTD NOR read has no issues.



Any thoughts appreciated: some information and the tests output below.





LCPSH # flinfo



Bank # 1: CFI conformant FLASH (8 x 8)  Size: 64 MB in 512 Sectors

  AMD Standard command set, Manufacturer ID: 0x15, Device ID: 0x00

  Erase timeout: 4096 ms, write timeout: 25 ms

  Buffer write timeout: 50 ms, buffer size: 1024 bytes



  Sector Start Addresses:

  10000000   RO   10020000   RO   10040000   RO   10060000   RO   10080000

  100A0000        100C0000        100E0000        10100000        10120000

  10140000        10160000        10180000        101A0000        101C0000

  101E0000        10200000        10220000        10240000        10260000

  10280000        102A0000        102C0000        102E0000        10300000

  10320000        10340000        10360000        10380000        103A0000

  103C0000        103E0000        10400000        10420000        10440000

  10460000        10480000        104A0000        104C0000        104E0000

  10500000        10520000        10540000        10560000        10580000

  105A0000        105C0000        105E0000        10600000        10620000

....

....

...



root at lvs15:/# uname -a

Linux lvs15 2.6.35-lcp-arm1 #1 SMP Fri Mar 1 11:59:02 EST 2013 armv6l GNU/Linux



root at lvs15:/# cat /proc/mtd

dev:    size   erasesize  name

mtd0: 00080000 00020000 "u-boot"

mtd1: 00040000 00020000 "u-boot-env"

mtd2: 03f40000 00020000 "unused-nor"

mtd3: 01e00000 00020000 "nand-linuxImg1"

mtd4: 01e00000 00020000 "nand-linuxImg2"

mtd5: 3c400000 00020000 "nandfs"



root at lvs15:/# mtd_debug info /dev/mtd1

MTD_open

MTD_ioctl

MTD_ioctl

MTD_close= MTD_NORFLASH



mtd.flags = MTD_CAP_NORFLASH

mtd.size = 262144 (256K)

mtd.erasesize = 131072 (128K)

mtd.writesize = 1

mtd.oobsize = 0

regions = 0





mtd_debug read /dev/mtd1 0 1000 read.txt Copied 1000 bytes from address 0x00000000 in flash to read.txt



root at lvs15:/# cat read.txt

Åý      ôbootdelay=5baudrate=115200loadaddr=0x05000000mtdids=nor0=physmap-flash.0,nand0=lcp_nandmtdparts=mtdparts=physmap-flash.0:512k(u-boot),256k(u-boot-env),-(unused-nor);lcp_nand:30M(nand-linuxImg1),30M(nand-linuxImg2),-(nandfs)verify=nlcpethmac0cpathchnl=0lcpethmac0ethforcerate=1000lcpethmac0ethforcefulldplx=Ylcpethmac1cpathchnl=0lcpethmac1ethforcerate=1000lcpethmac1ethforcefulldplx=Yethprime=LCP_ETH_MAC0ethrotate=no netretry=no autostart=yessetupbootargs=setenv bootargs earlyprintk=serial,ttyAMA0,$(baudrate) console=ttyAMA0,$(baudrate)n8 root=/dev/ram mtdids=$(mtdids) $(mtdparts)bootcmd=fpgasetup;run setupbootargs;tftp ad_value=0x1e1lcpethmac1bcastfltr=onlcpethmac1mcastfltr=onlcpethmac1pausepktfltr=onlcpethmac1runtpktfltr=onlcpethmac1ucastfltr=onlcpethmac0bcastfltr=onlcpethmac0mcastfltr=onlcpethmac0pausepktfltr=onlcpethmac0runtpktfltr=onlcpethmac0ucastfltr=onlcpethmac0ucastfltrda2=00:00:00:00:00:00lcpethmac0ucastfltrda3=00:00:00:00:00:00lcp<d /dev/mtd2 0 1000 read.txtmtd_debug write /dev/mtd1 0 1000 read.txt







I appreciate I do not do erases between writes but the data is the same and I have not had trouble with this, other than if you do write different data obviously all bets are off!





root at lvs15:/# mtd_debug write /dev/mtd1 0 10 read.txt MTD_open MTD_write MTD do_write_buffer(): WRITE 0x00080000(0x000000c5) Copied 10 bytes from read.txt to address 0x00000000 in flash



root at lvs15:/# mtd_debug write /dev/mtd1 0 100 read.txt MTD_open MTD_write MTD do_write_buffer(): WRITE 0x00080000(0x000000c5) Copied 100 bytes from read.txt to address 0x00000000 in flash



root at lvs15:/# mtd_debug write /dev/mtd1 0 300 read.txt MTD_open MTD_write MTD do_write_buffer(): WRITE 0x00080000(0x000000c5) MTD do_write_buffer(): software timeout

file_to_flash: write, size 0x12c, n 0x12c

write(): Input/output error


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20130304/afb61bf6/attachment-0001.html 


More information about the Kernelnewbies mailing list