使用默认的驱动两种型号都是可以启动的 但是U0E的使用mtd utils工具无法正常写入 看到网上有一些文章进行了分析主要原因如下
U0E的nop最大值是1
U0D的Nop最大值是4
按照我的理解就是在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 U0Edrivers/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格式文件后能正常挂载.