A question on ECC
Gerhard Uttenthaler
uttenthaler at ems-wuensche.com
Mon Apr 14 06:03:26 EDT 2003
Hi,
Which eccmode is used seems to be set from the calling function of
nand_read_ecc. I found:
in nandwrite.c:
struct nand_oobinfo jffs2_oobinfo = {
useecc: 1,
eccpos: { 0, 1, 2, 3, 6, 7}
};
<SNIP>
// force oob layout for jffs2 or yaffs ?
if (forcejffs2 || forceyaffs) {
struct nand_oobinfo *oobsel = forcejffs2 ? &jffs2_oobinfo :
&yaffs_oobinfo;
if (ioctl (fd, MEMSETOOBSEL, oobsel) != 0) {
perror ("MEMSETOOBSEL");
close (fd);
exit (1);
}
}
Here useecc is set to 1, which is found in nand.h:
#define NAND_ECC_SOFT 1
Similar in wbuf.c
struct nand_oobinfo jffs2_oobinfo = {
useecc: 1,
eccpos: {JFFS2_OOB_ECCPOS0, JFFS2_OOB_ECCPOS1,
JFFS2_OOB_ECCPOS2, JFFS2_OOB_ECCPOS3, JFFS2_OOB_ECCPOS4,
JFFS2_OOB_ECCPOS5}
};
int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len,
size_t *retlen, u_char *buf)
{
loff_t orbf = 0, owbf = 0, lwbf = 0;
int ret;
/* Read flash */
if (!jffs2_can_mark_obsolete(c)) {
ret = c->mtd->read_ecc(c->mtd, ofs, len, retlen, buf,
NULL, &jffs2_oobinfo);
<SNIP>
I found this while studying nftlmount.c. In function find_boot_record
there might be a bug.
In line 223:
if ((ret = MTD_READECC(nftl->mtd, block * nftl->EraseSize +
i + SECTORSIZE, SECTORSIZE, &retlen, buf,(char *)&oob,
NAND_ECC_DISKONCHIP)) < 0) {
NAND_ECC_DISKONCHIP is #defined as 5. As I steped over MTD_READECC I
found called nand_read_ecc, which wants a pointer (struct nand_oobinfo
*oobsel )as last argument.
I use a cvs snapshot dated 20030318, cross compiled for ARM7TDMI
Hope this all makes some sense and helps.
regards
Gerhard Uttenthaler
Edward J. Lee schrieb:
> Thomas Gleixner wrote:
>
>> On Monday 14 April 2003 07:13, Edward Lee (???) wrote:
>>
>>
>>> Hi Earl, thanks for the help.
>>>
>>> I didn't use nandwrite, I wrote on the chip using plain stuff like
>>> 'cp' or
>>> 'tar', etc. (having a file system on my device, I couldn't find a reason
>>> to write files using other programs)
>>>
>>
>> nandwrite is just used to copy a filesystem image to a unformatted chip.
>> If you have mounted the fs already, then nandwrite would be the wrong
>> tool.
>>
>> These messages have a different reason. I assume that you followed the
>> advice on yaffs list and you have enabled YAFFS_USE_NANDECC and
>> disabled YAFFS_USE_OLD_MTD.
>>
>> Then I can only guess, that you did not select a ecc mode in your
>> board driver code.
>> <SNIP>
>> /* 20 us command delay time */
>> this->chip_delay = 20;
>> this->eccmode = NAND_ECC_SOFT;
>> <SNIP>
>>
>> NAND_ECC_SOFT is the right choice, if you don't have a hardware ecc
>> generator.
>> If you have one, you must supply the neccecary functions to use it.
>>
>>
>>
> this->eccmode is indeed set to NAND_ECC_SOFT.
> I guess my case is kind of 'extra-tricky'. I just found out another
> weird thing,
> that the warning messages complaining '...without ECC...' do NOT appear
> when
> I'm 'writing' on the chip. Strange, eh. :'(
>
>
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/
>
>
More information about the linux-mtd
mailing list