[U-Boot] Problems around fatwrite command from uboot
Jean Louis
1978.jl at gmail.com
Thu Feb 21 23:08:44 CET 2013
Hi Mats,
Many thanks for your great help, I change the code as you say by :
~line 659:
if ((fat_val == 0xfffffff && mydata->fatsize == 32) ||
(fat_val == 0xffff && mydata->fatsize == 16))
break;
~line 904:
if ((curclust >= 0xffffff8 && mydata->fatsize == 32) ||
(curclust >= 0xfff8 && mydata->fatsize == 16)) {
empty_dentptr = dentptr;
return NULL;
}
I will do more tests with these changes.
Thank you
----
2013/2/21 Mats Kärrman <Mats.Karrman at tritech.se>
> Hi Jean,
>
> Accidentally I'm also currently debugging fat_write.
> I have a problem with USB EHCI time-outs while writing but so far I have
> not found a cure.
>
> What I have found is this rather strange code in fat_write.c:
>
> ~line 659:
> if (fat_val == 0xfffffff || fat_val == 0xffff)
> break;
> ~line 904:
> if ((curclust >= 0xffffff8) || (curclust >= 0xfff8)) {
> empty_dentptr = dentptr;
> return NULL;
> }
>
> Both these conditions seem to be plain wrong. They should probably take
> mydata->fatsize into account and select either of the conditions. I suspect
> that they could cause errors in the FAT chains by triggering on the FAT16
> condition when actually running on FAT32.
>
> Good luck!
> BR // Mats
> ________________________________________
> From: u-boot-bounces at lists.denx.de [u-boot-bounces at lists.denx.de] on
> behalf of Jean Louis [1978.jl at gmail.com]
> Sent: Thursday, February 21, 2013 12:33 PM
> To: u-boot at lists.denx.de
> Subject: [U-Boot] Problems around fatwrite command from uboot
>
> Hi,
>
> I use the last uboot from your git and boot with it on AM3517 EVM from SD
> card
> without NAND.
>
> I use this option in uboot config : #define CONFIG_FAT_WRITE 1
>
> I use intensively fatload / fatwrite commands at the boot before kernel
> loading.
>
> Sometimes, in about 2% of cases of boot, the FAT becomes inconsistent and I
> have
> systematically these messages at boot when I use fatwrite command :
>
> U-Boot 2013.01-gd3b9a66-dirty (Feb 21 2013 - 11:02:33)
> ...
> writing MODIFYME.001
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> mmc_send_cmd: timedout waiting on cmd inhibit to clear
> 42428 bytes written
> ...
>
> unlike that is said at the last line, the file is not written.
>
> If I run a 'fatls' command before this fatwrite, I see the same file
> 'modifyme.001' twice :
>
> AM3517_EVM # fatls mmc 0:1
> 42428 mlo
> 261332 u-boot.bin
> 2 modifyme.001
> 2 modifyme.001
> 2644996 uimage
> ...
>
> After the board boot on linux, I run this command to repair FAT part:
>
> umount /dev/mmcblk0p1 ; fsck.vfat -a -w -v /dev/mmcblk0p1
> dosfsck 2.11 (12 Mar 2005)
> dosfsck 2.11, 12 Mar 2005, FAT32, LFN
> Checking we can access the last sector of the filesystem
> Boot sector contents:
> System ID "MSDOS5.0"
> Media byte 0xf8 (hard disk)
> 512 bytes per logical sector
> 4096 bytes per cluster
> 34 reserved sectors
> First FAT starts at byte 17408 (sector 34)
> 2 FATs, 32 bit entries
> 321024 bytes per FAT (= 627 sectors)
> Root directory start at cluster 2 (arbitrary size)
> Data area starts at byte 659456 (sector 1288)
> 80156 data clusters (328318976 bytes)
> 63 sectors/track, 255 heads
> 63 hidden sectors
> 642537 sectors total
>
>
>
> Wrong checksum for long file name "modifyme.001".
> (Short name MODIFYME.001 may have changed without updating the long name)
> Not auto-correcting this.
> /modifyme.001
> Contains a free cluster (3081). Assuming EOF.
> /modifyme.001
> File size is 2 bytes, cluster chain length is 0 bytes.
> Truncating file to 0 bytes.
>
>
>
> Reclaiming unconnected clusters.
> Checking free cluster summary.
> Performing changes.
> /dev/mmcblk0p1: 24 files, 3487/80156 clusters
>
>
>
> As you can see in this return, the error 'Wrong checksum for long file name
> "modifyme.001"' often appears after use of fatwrite command at the boot.
>
>
> After the part is repaired, I reboot the board and uboot run as infinite
> loop
> after the fatwrite command :
>
> writing MODIFYME.001
> error: overflow occurs
> error: overflow occurs
> error: overflow occurs
> error: overflow occurs
> error: overflow occurs
> ...
>
>
> ( seems to be error in source code at disk_write() /* Write FAT buf
> */ in flush_fat_buffer() )
>
> I do an electrical off / on of my board during this infinite loop and the
> next
> boot seems okay but the file is once again corrupted, we can see that the
> count
> is incorrect (4096 and not 42428) :
>
> ...
> 42428 bytes read in 6 ms (6.7 MiB/s)
> writing MODIFYME.001
> 4096 bytes written
> ...
>
>
> A fatload at the next boot says 'Invalid FAT Entry' :
>
> ...
> reading MODIFYME.001
> Invalid FAT entry
> ...
>
>
> If I try to fatwrite an another file in this situation, I fall in the first
> case
> ( mmc_send_cmd: timedout waiting on cmd inhibit to clear )
>
>
> I think that the fatwrite command is potentially incomplete maybe around :
>
> - free cluster summary
> - second FAT entry
> - short/long filenames
> - deleted files entries
>
>
> any help appreciated
>
>
> Best regards,
> Jean Louis.
> (France)
>
More information about the U-Boot
mailing list