Possible bug in libchip/i2c/spi-sd-card.c (my MMC/SD problem)

Gene Smith gds at chartertn.net
Thu Jan 15 18:42:01 UTC 2009


I don't have a way to check or verify this right now but I may see the 
reason for the problem I am having doing shell copies on my MMC cards.

In my previous email 
http://www.rtems.com/ml/rtems-users/2009/january/msg00078.html
I mentioned that 4 sectors (flash blocks) were written sequentially that 
should have been scattered about in flash. Only the first one was at the 
right place (the first FAT entry).

Also in this email, before I had a clue as to what I was seeing, I 
reported 4 multiple blocks being written on file copy and the last 
contained the copied file data: 
data:http://www.rtems.com/ml/rtems-users/2009/january/msg00040.html

In both cases I think I am seeing the same thing.

The multiple block write occurs in spi-sd-card.c in function 
sd_card_disk_block_write(..., r) where prm r is a struct/array of 
scattered buffers (each at a random address). There are 4 block to be 
written at address 0x200 (main FAT), 0x1ec0 (redundant FAT), 0x3d600 
(root dir entry) and 0x41600 (cluster 2 with file data). Since there are 
4 buffers (r->bufnum > 1) in the scatter array, a multiple block write 
to MMC/SD is selected. The multiple write sets the starting address to 
the first block (0x200) and writes all 4 blocks back to back beginning 
at that address, which is wrong in this case. That's why my blocks end 
up in the FAT area instead of at the right place.

So, unless the blocks are known to be truly sequential and not scattered 
or random, only then should the multiple blocks method be used. I don't 
know if there is a way to know without parsing the scatter array each 
time. So it might be better (but slower) to always just use single block 
write method multiple times if bufnum > 1.

Again, this is a theory that has yet to be verified.

-gene






More information about the users mailing list