s5pv210 K9F4G08U0D升级K9F4G08U0E问题修复

使用默认的驱动两种型号都是可以启动的 但是U0E的使用mtd utils工具无法正常写入 看到网上有一些文章进行了分析主要原因如下

U0E的nop最大值是1


U0D的Nop最大值是4

s5pv210 K9F4G08U0D升级K9F4G08U0E问题修复_第1张图片

按照我的理解就是在program/erase时只能对第一页进行一次操作

在u-boot中nandflash main area和spare area都是在write_page函数里完成 没有单独执行write_oob

而在文件系统读写时首先写了一次oob然后才执行的write_page第一次写的oob应该是yaffs相关的数据 这里就进行了两次操作就是说 导致通过nandwrite工具写稿的yaffs2文件无法挂载 解决办法就是将yaffs相关数据就第一次写的数据与第二次写的数据合并后一次性写入.

因为U0E读ID时第5个字节是0x55而U0B是0x54所以通过这个判断进行区分

include/linux/mtd/nand.h中修改struct nand_chip结构

加上nopone

	uint8_t		*bbt;
	struct nand_bbt_descr	*bbt_td;
	struct nand_bbt_descr	*bbt_md;

	struct nand_bbt_descr	*badblock_pattern;

	void		*priv;
	int nopone;//add by hclydao 20150714 for U0E
drivers/mtd/nand/s3c_nand.c s3c_nand_probe函数修改如下

增加初始化

	for (i = 0; i < plat_info->chip_nr; i++) {
		nand->IO_ADDR_R		= (char *)(s3c_nand.regs + S3C_NFDATA);
		nand->IO_ADDR_W		= (char *)(s3c_nand.regs + S3C_NFDATA);
		nand->cmd_ctrl		= s3c_nand_hwcontrol;
		nand->dev_ready		= s3c_nand_device_ready;
		nand->scan_bbt		= s3c_nand_scan_bbt;
		nand->options		= 0;
		nand->nopone		= 0;//add by hclydao 20150714 for U0E
增加如下判断

		tmp = readb(nand->IO_ADDR_R); /* Maf. ID */
		maf_id = tmp;
		tmp = readb(nand->IO_ADDR_R); /* Device ID */

		for (j = 0; nand_flash_ids[j].name != NULL; j++) {
			if (tmp == nand_flash_ids[j].id) {
				type = &nand_flash_ids[j];
				break;
			}
		}

		if (!type) {
			printk(KERN_ERR "Unknown NAND Device.\n");
			goto exit_error;
		}

		nand->cellinfo = readb(nand->IO_ADDR_R);	/* the 3rd byte */
		tmp = readb(nand->IO_ADDR_R);			/* the 4th byte */
		if((maf_id == NAND_MFR_SAMSUNG) && (readb(nand->IO_ADDR_R) & 0x1))//add by hclydao 20150514 for U0E
			nand->nopone = 1;
drivers/mtd/nand/nand_base.c中

nand_do_write_oob函数部分修改如下

	memset(chip->oob_poi, 0xff, mtd->oobsize);
	nand_fill_oob(chip, ops->oobbuf, ops->ooblen, ops);
	if(!chip->nopone) { //modify by hclydao 20150714 for U0E
		status = chip->ecc.write_oob(mtd, chip, page & chip->pagemask);
		memset(chip->oob_poi, 0xff, mtd->oobsize);
	} else {
		status = 0;
	}
条件满足时不写oob同时保存oob_poi中的数据

nand_do_write_ops函数部分修改如下

	/* If we're not given explicit OOB data, let it be 0xFF */
	if(!chip->nopone) { //modify by hclydao 20150714 for U0E
		if (likely(!oob))
			memset(chip->oob_poi, 0xff, mtd->oobsize);
	}
保证oob_poi中的数据不被清除

重新下载最 调用nandwrite写入yaffs2格式文件后能正常挂载.

你可能感兴趣的:(s5pv210 K9F4G08U0D升级K9F4G08U0E问题修复)