tiny210v2-uboot之三添加CMD

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1:include/configs/tiny210.h

#define CONFIG_CMD_NAND_YAFFS 1

#define CFG_NAND_HWECC 1

#define CONFIG_8BIT_HW_ECC_SLC 1

#define CONFIG_NAND_BL1_8BIT_ECC 1

2:common/cmd_nand.c

#if defined(CONFIG_CMD_NAND_YAFFS)&&(!defined(CONFIG_CMD_NAND_YAFFS2))

¦ ¦} else if (!strcmp(s, ".yaffs")) {

¦ ¦ ¦if (read) {

¦ ¦ ¦ ¦printf("Unknown nand command suffix '%s'.\n", s);

¦ ¦ ¦ ¦return 1;

¦ ¦ ¦}

#endif

3. drivers/mtd/nand/nand_base.c

31

32 @@ -2042,7 +2101,21 @@

33 5913

34 5914 chip->ops.len = len;

35 5915 chip->ops.datbuf = (uint8_t *)buf;

36 5916 + //chip->ops.oobbuf = NULL;

37 5917 +

38 5918 +#if defined(CONFIG_CMD_NAND_YAFFS)

39 5919 + /*Modified by lk*/

40 5920 + if(mtd->rw_oob!=1) {

41 5921 + chip->ops.oobbuf = NULL;

42 5922 + } else {

43 5923 + chip->ops.oobbuf = (uint8_t *)(buf+len);

44 5924 + chip->ops.ooblen = mtd->oobsize;

45 5925 + oldopsmode = chip->ops.mode;

46 5926 + chip->ops.mode = MTD_OOB_RAW;

47 5927 + }

48 5928 +#else

49 chip->ops.oobbuf = NULL;

50 5930 +#endif

51 @@ -2050,6 +2123,11 @@

52 5935

53 5936 nand_release_device(mtd);

54 5937

55 5938 +#if defined(CONFIG_CMD_NAND_YAFFS)

56 5939 + /*Modified by lk*/

57 5940 + chip->ops.mode = oldopsmode;

58 5941 +#endif

¦switch (extid & 0x13) {

5960 case 1:

5961 mtd->oobsize = 128;

5962 break;

5963 @@ -2707,9 +2784,18 @@

5964 case 3:

5965 mtd->oobsize = 400;

5966 break;

5967 - default:

5968 + case 16:

5969 mtd->oobsize = 436;

5970 break;

5971 + case 17:

5972 + mtd->oobsize = 512;

5973 + break;

5974 + case 18:

5975 + mtd->oobsize = 640;

5976 + break;

5977 + default:

5978 + mtd->oobsize = 512;

5979 + break;

5980 }

4:drivers/mtd/nand/nand_util.c

5996 @@ -476,7 +476,26 @@

5997 u_char *p_buffer = buffer;

5998 int need_skip;

5999

-#ifdef CONFIG_CMD_NAND_YAFFS

6001 +/*Modified by lk*/

6002 +#if defined(CONFIG_CMD_NAND_YAFFS2)

6003 + if(nand->rw_oob==1) {

6004 + size_t oobsize = nand->oobsize;

6005 + size_t datasize = nand->writesize;

6006 + int datapages = 0;

6007 +

6008 +

6009 + if (((*length)%(nand->oobsize+nand->writesize)) != 0) {

6010 + printf ("Attempt to write error length data!\n");

6011 + return -EINVAL;

6012 + }

6013 +

6014 + datapages = *length/(datasize+oobsize);

6015 + *length = datapages*datasize;

6016 + left_to_write = *length;

6017 +

6018 + }

6019 + else

6020 +#else

@@ -518,7 +537,8 @@

6025 *length = 0;

6026 return -EINVAL

6027 }

6028 -

6029 +/*Modified by lk*/

6030 +#if !defined(CONFIG_CMD_NAND_YAFFS2)

6031 if (!need_skip && !(flags & WITH_DROP_FFS)) {

6032 rval = nand_write(nand, offset, length, buffer);

6033 if (rval == 0)

6034 @@ -529,7 +549,7 @@

6035 offset, rval);

6036 return rval;

6037 }

6038 -

6039 +#endif

@@ -542,14 +562,24 @@

6044 offset += nand->erasesize - block_offset;

6045 continue;

6046 }

6047 -

6048 - if (left_to_write < (blocksize - block_offset))

6049 +/*Modified by lk*/

6050 +#if defined(CONFIG_CMD_NAND_YAFFS)&&defined(CONFIG_CMD_NAND_YAFFS2)

6051 + if(nand->skipfirstblk==1) {

6052 + nand->skipfirstblk=0;

6053 + printf ("Skip the first good block %llx\n",

6054 + offset & ~(nand->erasesize - 1));

054 + offset & ~(nand->erasesize - 1));

6055 + offset += nand->erasesize - block_offset;

6056 + continue;

6057 + }

6058 +#endif

6059 + if (left_to_write < (nand->erasesize - block_offset))//blocksize

6060 write_size = left_to_write;

6061 else

6062 - write_size = blocksize - block_offset;

6063 -

6064 -#ifdef CONFIG_CMD_NAND_YAFFS

6065 + write_size = nand->erasesize - block_offset;

6066 +/*Modified by lk*/

6067 +#if defined(CONFIG_CMD_NAND_YAFFS)&&(!defined(CONFIG_CMD_NAND_YAFFS2))

6068 if (flags & WITH_YAFFS_OOB) {

6069 +

i

/*Modified by lk*/

6082 +#if (defined(CONFIG_CMD_NAND_YAFFS)&&(!defined(CONFIG_CMD_NAND_YAFFS2)))

6083 offset += write_size;

6084 p_buffer += write_size;

6085 +#endif

6086 }

¦@ -597,8 +630,19 @@

6090 *length -= left_to_write;

6091 return rval;

6092 }

6093 -

6094 left_to_write -= write_size

095 + printf("%d%% is complete.",100-(left_to_write/(*length/100)));//Modified by lk

6096 +/*Modified by lk*/

6097 +#if (defined(CONFIG_CMD_NAND_YAFFS)&&defined(CONFIG_CMD_NAND_YAFFS2))

6098 + offset += write_size;

6099 + if(nand->rw_oob==1) {

6100 + p_buffer += write_size+(write_size/nand->writesize*nand->oobsize);

6101 + } else {

6102 + p_buffer += write_size;

6103 + }

6104 +#else

6105 + p_buffer += write_size;

6106 +#endif

5.drivers/mtd/nand/s5pc1xx_nand.c

/*Modified by lk*/

6082 +#if (defined(CONFIG_CMD_NAND_YAFFS)&&(!defined(CONFIG_CMD_NAND_YAFFS2)))

6083 offset += write_size;

6084 p_buffer += write_size;

6085 +#endif

6086 }

@@ -675,6 +726,11 @@

6181 case 0: /* No error */

6182 ret = 0;

6183 break;

6184 + default: /* Uncorrectable */

6185 + printk("s3c-nand: ECC uncorrectable error detected\n");

6186 + ret = -1;

6187 + break

6. include/linux/mtd/mtd.h

8664 @@ -234,6 +234,10 @@

8665 ¦* supposed to be called by MTD users */

8666 int (*get_device) (struct mtd_info *mtd);

8667 void (*put_device) (struct mtd_info *mtd);

8668 +#if defined(CONFIG_CMD_NAND_YAFFS)

8669 + u_char rw_oob;

8670 + u_char skipfirstblk;

8671 +#endif

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6