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